はじめに
この実験(Lab)では、SQL インジェクションの脆弱性を検出し悪用するプロセスを自動化する強力なオープンソースのペネトレーションテストツールであるsqlmapの使用方法を学びます。具体的には、バックエンドのデータベース管理システム(DBMS)を特定するという重要な最適化手法に焦点を当てます。
デフォルトでは、sqlmapはさまざまなデータベースシステムをテストするため、時間がかかる場合があります。ターゲットの DBMS(MySQL、PostgreSQL、MSSQL など)を指定することで、スキャンプロセスを大幅に高速化し、サーバーに送信されるリクエスト数を削減し、テストをより効率的に行うことができます。
練習用に脆弱な Web アプリケーションを事前に設定しました。この実験(Lab)のターゲット URL は次のとおりです。 http://localhost/vulnerabilities/sqli/?id=1&Submit=Submit#
始めましょう!
バックエンド DBMS の特定(例:MySQL、PostgreSQL)
このステップでは、バックエンドのデータベースシステムを自動的に特定するために、基本的なsqlmapスキャンを実行します。これはペネトレーションテストにおける一般的な最初のステップです。ここで収集された情報は、後続のステップでの攻撃を最適化するのに役立ちます。
--batchフラグを使用して、sqlmapがすべての質問に対してデフォルトの回答で実行されるようにし、スキャンを非対話的にします。また、脆弱なページにアクセスするためにセッション Cookie を提供する必要があります。この実験(Lab)では、Cookie はsecurity=low; PHPSESSID=labexです。
ターミナルで以下のコマンドを実行してください。
sqlmap -u "http://localhost/vulnerabilities/sqli/?id=1&Submit=Submit#" --cookie="security=low; PHPSESSID=labex" --batch
sqlmapはテストプロセスを開始します。出力に注意深く目を向けてください。一連のテストの後、sqlmapは Web サーバーのオペレーティングシステム、Web サーバーテクノロジー、そして最も重要なバックエンド DBMS に関する情報を表示します。
以下のような出力が表示されるはずです(詳細は異なる場合があります)。
[INFO] the back-end DBMS is MySQL
web server operating system: Linux Ubuntu
web application technology: PHP 8.1.2, Apache 2.4.52
back-end DBMS: MySQL >= 5.0
ご覧のとおり、sqlmapはバックエンドデータベースをMySQLとして特定しました。これは、次に使用する重要な情報です。
--dbmsフラグを使用したターゲットシステムの指定
このステップでは、この実験(Lab)の核心である--dbmsフラグについて学びます。前のステップでターゲットが MySQL で動作していることを確認したので、sqlmapが PostgreSQL、Oracle、Microsoft SQL Server などの他のデータベースシステムに対するテストを実行して時間を無駄にする必要はありません。
--dbmsフラグを使用すると、sqlmapにテスト対象のデータベースシステムを正確に指示できます。これにより、ツールの効率が大幅に向上します。
構文は簡単です。
--dbms=DBMS_NAME
DBMS_NAMEをターゲットデータベースの名前に置き換えます。一般的な値は次のとおりです。
MySQLPostgreSQLMSSQL(Microsoft SQL Server)OracleSQLiteAccess
この情報を提供することで、指定された DBMS に固有のペイロードとテクニックのみを使用するようにsqlmapに指示することになります。これは、実際のシナリオでsqlmapを効果的に使用するための基本的なスキルです。次のステップでは、このフラグを新しいスキャンに適用します。
--dbms=MySQL を使用したスキャンの実行
このステップでは、sqlmapスキャンを再度実行しますが、今回は--dbms=MySQLフラグを追加します。これにより、ステップ 1 で収集した情報に基づいて、sqlmapは MySQL 固有のテストにのみ焦点を当てるようになります。
ターミナルで以下のコマンドを実行してください。これは、新しいフラグが追加された以外は、以前と同じコマンドです。
sqlmap -u "http://localhost/vulnerabilities/sqli/?id=1&Submit=Submit#" --cookie="security=low; PHPSESSID=labex" --dbms=MySQL --batch
スキャンはすぐに開始されます。sqlmapの初期出力で、バックエンド DBMS が MySQL に強制されていることが確認できるはずです。
[INFO] forcing back-end DBMS to 'MySQL'
スキャンが完了するまで実行させてください。次のステップで、結果を分析し、最初のスキャンと比較します。
ペイロード数の削減と高速な識別を観察する
このステップでは、--dbmsフラグを使用することによる直接的なメリットを観察します。主な利点は、実行されるテストの数が大幅に削減され、完了時間が大幅に短縮されることです。
ステップ 3 のスキャン出力とステップ 1 の最初スキャンを比較すると、重要な違いに気づくでしょう。最初スキャンはデータベースの特定に時間を費やし、汎用的なテストを実行してから絞り込んでいました。しかし、2 回目のスキャンではそれらがすべてスキップされました。
ターゲットを絞ったスキャンの出力では、sqlmapが MySQL に関連するテストのみを実行していることが示されます。PostgreSQL や Oracle のような他のシステムに対するテストは表示されません。
例えば、汎用スキャンでは、複数のデータベースに対するさまざまな種類の SQL インジェクションに対して数百のペイロードをテストする可能性があります。しかし、ターゲットを絞ったスキャンでは、MySQL に対して機能することが知られているペイロードのみを実行します。これにより、以下のようになります。
- HTTP リクエスト数の削減: ツールはターゲットサーバーに送信するリクエスト数を大幅に削減します。
- 実行速度の向上: スキャン全体の時間が劇的に短縮されます。
この効率性はペネトレーションテストにおいて非常に重要です。そこでは時間が制約となることが多く、ネットワークトラフィックを最小限に抑えることで、ファイアウォールや侵入検知システム(IDS)による検出を回避するのに役立ちます。
テストケースを削減することで攻撃を最適化する方法を理解する
最終ステップとして、DBMS をターゲットにすることが最適化のためのベストプラクティスである理由についての理解を深めましょう。
sqlmapは包括的なツールとして設計されています。ガイダンスがない場合、デフォルトの動作はターゲットについて何も知らないと仮定することです。したがって、多くの可能性をカバーするために、大規模なテストバッテリーを実行します。
- フィンガープリンティング: まず、さまざまなクエリを送信し、応答を分析して DBMS タイプを決定しようとします。各データベースには、その ID を明らかにする固有の関数、エラーメッセージ、および動作があります。
- 広範なテスト: 次に、さまざまな SQL インジェクション技術(ブールベースのブラインド、時間ベースのブラインド、エラーベース、UNION クエリなど)をテストします。
- DBMS 固有のペイロード: 各技術について、さまざまなデータベースシステムで機能するペイロードを試します。
この「総当たり」アプローチは徹底的ですが、バックエンドを知っているか、またはすぐに推測できる場合は非効率的です。
--dbms=MySQLを使用することにより、sqlmapにステップ 1 を完全にスキップし、ステップ 3 のペイロードのうち MySQL に関連するもののみを使用するように指示しています。これにより、ワークフローから大量のテストケースが削除されます。
この最適化は、3 つの主要な利点をもたらします。
- 速度: 不要なテストを実行していないため、スキャンははるかに速く完了します。
- ステルス性: リクエストが少ないということは、Web サーバーのログに「ノイズ」が少なくなり、アクティビティがアラートをトリガーする可能性が低くなります。
- 効率性: ツールのパワーを最も可能性の高い攻撃ベクトルに集中させ、成功的かつ迅速な発見の可能性を高めます。
--dbmsのようなフラグを習得することは、sqlmapを単純な自動スキャナーから、正確で外科的なテストツールへと変貌させます。
まとめ
この実験では、sqlmapスキャンの最適化における重要なテクニックを学びました。バックエンドのデータベース管理システム(DBMS)を特定し、その後--dbmsフラグを使用することで、SQL インジェクションテストの効率を劇的に向上させることができることを実際に確認しました。
まず、バックエンドを MySQL として特定するために汎用スキャンを実行しました。次に、--dbmsフラグについて学び、それを使用してターゲットを絞ったスキャンを実行しました。両方の方法を比較することで、ターゲットを絞ったスキャンは、大量の無関係なテストケースを排除したため、大幅に高速であったことを観察しました。
ツールに焦点を当てるというこの原則は、効果的なペネトレーションテストにおける基本的な概念です。この実験を完了し、sqlmapの重要なスキルをツールキットに追加したことをお祝いします!


