はじめに
この実験では、sqlmap というオープンソースのペネトレーションテストツールを使用して、SQL インジェクションの脆弱性を検出し、悪用するプロセスを自動化し、データベースサーバーを乗っ取る実践的な経験を積みます。具体的には、Web アプリケーションの GET パラメータに対して基本的なスキャンを実行し、潜在的な SQL インジェクションの脆弱性を特定することに焦点を当てます。スキャンの開始方法と初期出力の解釈方法を理解することは、Web セキュリティやペネトレーションテストに関わるすべての人にとって基本的なスキルです。この実験では、脆弱な環境のセットアップから最初のsqlmapコマンドの実行、結果の分析まで、必要な手順をガイドします。
GET パラメータを持つターゲット URL の特定
このステップでは、sqlmapが SQL インジェクションの脆弱性をテストするために使用する GET パラメータを含むターゲット URL を特定します。GET パラメータは通常、URL の疑問符(?)の後ろにあり、キーと値のペアがアンパサンド(&)で区切られています。この実験では、GET 経由でidパラメータを受け取る簡単な脆弱な PHP アプリケーションをセットアップしました。
まず、LabEx 環境内の Web ブラウザを開きます。ブラウザには、デスクトップ環境の「Web Browser」アイコンをクリックしてアクセスできます。
以下の URL にアクセスしてください: http://localhost/index.php?id=1
ページのコンテンツを観察してください。idパラメータに基づいてアプリケーションがデータを表示していることを示す簡単な出力が表示されるはずです。これにより、idパラメータがsqlmapスキャンに適したターゲットであることが確認できます。
-u オプションを使用した基本的なスキャンコマンドの構築
このステップでは、GET パラメータを持つ特定の URL をターゲットにするための基本的なsqlmapコマンドの構築方法を学びます。ターゲット URL を指定するための主要なオプションは-u(または--url)です。
LabEx 環境でターミナルを開きます。デフォルトのユーザーはlabexで、デフォルトの作業ディレクトリは~/projectです。
GET パラメータを持つ URL をスキャンするためのsqlmapの基本的な構文は次のとおりです。
sqlmap -u "http://example.com/page.php?param=value"
http://example.com/page.php?param=value をターゲット URL に置き換えてください。
今回の実験では、ターゲット URL は http://localhost/index.php?id=1 です。したがって、使用するコマンドは次のようになります。
sqlmap -u "http://localhost/index.php?id=1"
このコマンドは、指定された URL のスキャンを開始し、SQL インジェクションの脆弱性がないかid GET パラメータをテストするようにsqlmapに指示します。
ターゲット URL に対するスキャンの実行
前のステップで構築したsqlmapコマンドを実行する準備ができました。これにより、自動化された SQL インジェクションスキャンが開始されます。
ターミナルで、前のステップで構築したsqlmapコマンドを実行してください。
sqlmap -u "http://localhost/index.php?id=1"
sqlmapは、さまざまな種類の SQL インジェクションの脆弱性をテストするために、idパラメータにさまざまなペイロードを送信し始めます。スキャン中、sqlmapからいくつか質問される場合があります。この基本的なスキャンでは、プロンプトが表示されたときにEnterキーを押すか、y(はい)と入力することで、通常はデフォルトのオプションを受け入れることができます。
例えば、sqlmapは次のように尋ねるかもしれません。
[INFO] バックエンドDBMSはMySQLです。他のDBMSに固有のテストペイロードをスキップしますか? [Y/n]
Yと入力してEnterキーを押してください。
また、次のように尋ねることもあります。
URL 'http://localhost/index.php?id=1' のパラメータ 'id' はインジェクタブルのようです。他の(もしあれば)テストを続行しますか? [y/N]
特定されたインジェクタブルなパラメータに焦点を当てるために、Nと入力してEnterキーを押してください。
スキャンは続行され、進行状況や実行されているテストを示すさまざまなメッセージが表示されます。
_
___ ___ ___ ___
|_ -| . | . | . |
|___|_ |_ |_ |
|_| |_| |_| 3.7#stable
[INFO] 開始時刻 @ 12:34:56 /2023-01-01/
[INFO] ターゲット URL への接続をテスト中
[INFO] ターゲットが何らかの WAF/IPS によって保護されているか確認中
[INFO] バックエンド DBMS は MySQL です。他の DBMS に固有のテストペイロードをスキップしますか? [Y/n] Y
[INFO] URL 'http://localhost/index.php?id=1' のパラメータ 'id' はインジェクタブルのようです。他の(もしあれば)テストを続行しますか? [y/N] N
[INFO] GET パラメータ 'id' は脆弱です。
... (出力は省略) ...
脆弱性検出のための初期スキャン出力の分析
sqlmapのスキャンが完了すると、その結果の概要が表示されます。このステップでは、確認された SQL インジェクションポイントを特定するために、初期出力を分析します。
ターミナルの出力を確認してください。sqlmapが脆弱なパラメータを見つけたことを示す行を探します。主な指標は、次のようなメッセージです。
[INFO] GETパラメータ 'id' は脆弱です。
このメッセージは、sqlmapがターゲット URL のid GET パラメータで SQL インジェクションの脆弱性を正常に特定したことを確認します。出力には通常、検出されたインジェクションの種類(例:ブール型ブラインド、エラーベース、時間ベースブラインド、スタッククエリなど)と、特定されたバックエンドデータベース管理システム(DBMS)(例:MySQL、PostgreSQL など)も表示されます。
この初期出力を理解することは非常に重要です。なぜなら、脆弱性がどこにあるのか、そしてどのような種類のデータベースを扱っているのかを知ることができ、それがさらなる悪用ステップの指針となるからです。
... (以前の出力) ...
[INFO] GET パラメータ 'id' は脆弱です。
[INFO] バックエンド DBMS は MySQL です。
[INFO] 取得したデータ:
[INFO] 取得:'ID: 1'
[INFO] 取得:'ID: 2'
... (出力は省略) ...
出力ディレクトリ内のセッションファイルの特定
sqlmapは、検出された脆弱性、取得されたデータ、セッション情報を含むすべてのスキャン結果を、専用の出力ディレクトリに自動的に保存します。このステップでは、このセッションファイルを特定する方法を学びます。
デフォルトでは、sqlmapは出力を~/.sqlmap/output/ディレクトリに保存します。このディレクトリ内には、ターゲットホスト名で命名されたサブディレクトリがあります。
sqlmapの出力ディレクトリに移動します。
cd ~/.sqlmap/output/localhost/
次に、このディレクトリの内容を一覧表示して、セッションファイルやその他のスキャン関連データを確認します。
ls -l
特定の URL またはそのハッシュで命名されたディレクトリが表示され、その中にsession.sqlite、logなどのファイル、およびデータが抽出された場合はdumpディレクトリが表示されるはずです。session.sqliteファイルにはセッションデータが含まれており、これによりsqlmapはスキャンを再開したり、再スキャンせずに以前の結果を確認したりすることができます。
labex@labex-ubuntu:~/project$ cd ~/.sqlmap/output/localhost/
labex@labex-ubuntu:~/.sqlmap/output/localhost$ ls -l
total 12
drwxr-xr-x 2 labex labex 4096 Jan 1 12:35 http%3A%2F%2Flocalhost%2Findex.php%3Fid%3D1
labex@labex-ubuntu:~/.sqlmap/output/localhost$ cd http%3A%2F%2Flocalhost%2Findex.php%3Fid%3D1/
labex@labex-ubuntu:~/.sqlmap/output/localhost/http%3A%2F%2Flocalhost%2Findex.php%3Fid%3D1$ ls -l
total 12
-rw-r--r-- 1 labex labex 1234 Jan 1 12:35 log
-rw-r--r-- 1 labex labex 8192 Jan 1 12:35 session.sqlite
このステップは、sqlmapが永続データをどこに保存するかを理解するために重要であり、過去のスキャンを確認したり、複雑な操作を続行したりするのに役立ちます。
まとめ
この実験では、sqlmapを使用して GET パラメータに対する基本的な SQL インジェクションスキャンを実行しました。ターゲット URL の特定、-uオプションを使用したsqlmapコマンドの構築、スキャンの実行、およびインジェクションポイントを確認するための初期出力の解釈方法を学びました。さらに、sqlmapが結果を保存するセッションファイルと出力ディレクトリを特定しました。この基礎知識は、Web アプリケーションセキュリティテストやsqlmapの機能についてさらに深く学びたい人にとって非常に重要です。


