記事一覧

セッションハイジャック対策がされているか確認する方法 | asp.net


今回は 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のクエリ文字列を付帯してログインページに誘導されます。

aspnet_session_hijack_03.png 


(2)ログインするIDとパスワードを入力すると認証後のページに飛びます。

aspnet_session_hijack_01.png 


(3)認証後のページではログインIDを表示する簡単なコードです。

aspnet_session_hyjack_02.png



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("/default.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を確認します。

aspnet_session_hyjack_04.png


または、F12を押下すると開発ツールが開きますので、
Application>Storage>Cookie
を開き、対象のIPまたはドメインを選択します。
Value列にセッションIDが表示されています。

aspnet_session_hyjack_05.png


(2)Firefoxの場合は、F12を押下し、
ストレージ>Cookie
を開き、対象のIPまたはドメインを選択します。
値列にセッションIDが表示されています。
同じユーザーIDで認証してもGoogle Chromeで認証した場合のセッションIDとは異なっている点についてご確認ください。

aspnet_session_hyjack_06.png



4.ハイジャックする方法

片方のブラウザのセッションIDをコピーし、もう片方のブラウザでログインしていない状態で、セッションID列のデータをダブルクリックすると上書きが可能になります。すると default.aspx が表示できるようになり、ユーザーIDも入力していないはずなのに表示されます。


aspnet_session_hyjack_07.png


いかがでしたでしょうか。
ブラウザ間でセッションIDをコピペするだけでセッションの横取りが確認できました。個人情報流出が事件やニュースになる昨今、asp.netでログイン認証やセッション管理を実装する場合はセッションハイジャックについて検証を行い、対策をすることが求められています。






最後までお読みいただきありがとうございます。
いかがでしたでしょうか。他にも asp.net に関連する記事を投稿しておりますのでよろしければご参考くださいませ。


関連記事

コメント

コメントの投稿

カテゴリ別記事一覧

広告

プロフィール

石河 純


著者名 :石河 純
自己紹介:素人上がりのIT技術者。趣味は卓球・車・ボウリング

IT関連の知識はざっくりとこんな感じです。
【OS関連】
WindowsServer: 2012/2008R2/2003/2000/NT4
Windows: 10/8/7/XP/2000/me/NT4/98
Linux: CentOS RedHatLinux9
Mac: macOS Sierra 10.12 / OSX Lion 10.7.5 / OSX Snow Leopard 10.6.8
【言語・データベース】
VB.net ASP.NET C#.net Java VBA
Xamarin.Forms
Oracle10g SQLServer2008R2 SQLAnywhere8/11/16
ActiveReport CrystalReport ReportNet(IBM)
【ネットワーク関連】
CCNP シスコ技術者認定
Cisco Catalyst シリーズ
Yamaha RTXシリーズ
FireWall関連
【WEB関連】
SEO SEM CSS IIS6/7 apache2

休みの日は卓球をやっています。
現在、卓球用品通販ショップは休業中です。