今回は asp.net のWebアプリケーションにおいてセッションハイジャックが可能かどうかブラックボックステストを実施して確認する方法をご紹介いたします。別途用意するツールなどは無く、ChromeとFirefoxのブラウザのみ(アドオン無し)で確認ができます。
そもそもセッションハイジャックとは何らかの手法によりセッションIDを盗み、そのセッションを乗っ取ることによりシステムにログインしたり、個人情報を取得したりすることができる攻撃方法です。
内部構造を見れればすぐにセッションハイジャックの対策がされているかどうかはわかりますが、外部からのテストではセッションハイジャックを実施してみるしかなく、セッションIDを変更する方法について触れている記事が少ないと思いました。
前提条件
・Windows 10 Pro 64Bit
・Google Chrome 60.0
・Firefox 57.0.1
1.フォーム認証について
まずは、正しいフォーム認証について確認します。
最近の asp.net ではソリューションを新規作成するとデフォルトでフォーム認証を実装済みのソースが出来上がります。より簡単なフォーム認証につきましては、.net Framework 2.0 からのシンプルなフォーム認証のソースが以下のURLで紹介されています。
https://msdn.microsoft.com/ja-jp/library/xdt4thhy(v=vs.100).aspx
(1)フォーム認証が実装してある場合、ログインしていないと閲覧できないページにアクセスすると、ReturnURLのクエリ文字列を付帯してログインページに誘導されます。
(2)ログインするIDとパスワードを入力すると認証後のページに飛びます。
(3)認証後のページではログインIDを表示する簡単なコードです。
2.脆弱性のあるソース
以下のソースのようにセッションにログイン情報を保存しているだけのコードではセッションハイジャックされてしまいますが、今回はテストを実施する為に書き換えてみます。
'logon.aspx.vb
Public Class logon
Inherits System.Web.UI.Page
Sub Logon_Click(ByVal sender As Object, ByVal e As EventArgs)
If ((UserEmail.Text = "test@test.co.jp") And
(UserPass.Text = "test")) Then
'FormsAuthentication.RedirectFromLoginPage _
' (UserEmail.Text, Persist.Checked)
'セッションに格納するだけの脆弱性を含むコードに書き換えます
Session("userId") = UserEmail.Text
Response.Redirect("~/default.aspx")
Else
Msg.Text = "Invalid credentials. Please try again."
End If
End Sub
End Class
'default.aspx.vb
Public Class _default
Inherits System.Web.UI.Page
Sub Page_Load(ByVal Src As Object, ByVal e As EventArgs) Handles Me.Load
'Welcome.Text = "Hello, " & Context.User.Identity.Name
'セッションに格納するだけの脆弱性を含むコードに書き換えます
Dim userId As String = HttpUtility.HtmlEncode(Session("userId"))
If (String.IsNullOrEmpty(userId)) Then
Response.Redirect("~/logon.aspx")
End If
Welcome.Text = "Hello, " & userId
End Sub
Sub Signout_Click(ByVal sender As Object, ByVal e As EventArgs)
'FormsAuthentication.SignOut()
'セッションに格納するだけの脆弱性を含むコードに書き換えます
Session("userId") = ""
Response.Redirect("~/logon.aspx")
End Sub
End Class
3.セッションIDの取得方法
(1)Google Chromeの場合、以下のページを開きます。
設定>詳細設定>プライバシーとセキュリティ>コンテンツの設定>Cookie
対象のIPまたはドメインを開き、セッションIDを確認します。
または、F12を押下すると開発ツールが開きますので、
Application>Storage>Cookie
を開き、対象のIPまたはドメインを選択します。
Value列にセッションIDが表示されています。
(2)Firefoxの場合は、F12を押下し、
ストレージ>Cookie
を開き、対象のIPまたはドメインを選択します。
値列にセッションIDが表示されています。
同じユーザーIDで認証してもGoogle Chromeで認証した場合のセッションIDとは異なっている点についてご確認ください。
4.ハイジャックする方法
片方のブラウザのセッションIDをコピーし、もう片方のブラウザでログインしていない状態で、セッションID列のデータをダブルクリックすると上書きが可能になります。すると default.aspx が表示できるようになり、ユーザーIDも入力していないはずなのに表示されます。
いかがでしたでしょうか。
ブラウザ間でセッションIDをコピペするだけでセッションの横取りが確認できました。個人情報流出が事件やニュースになる昨今、asp.netでログイン認証やセッション管理を実装する場合はセッションハイジャックについて検証を行い、対策をすることが求められています。
最後までお読みいただきありがとうございます。
いかがでしたでしょうか。他にも asp.net に関連する記事を投稿しておりますのでよろしければご参考くださいませ。
- 関連記事
-