はじめに
この実験では、sqlmap を使用してターゲットサーバー上のデータベースを列挙する方法を学びます。データベース列挙は、ペネトレーションテストプロセスにおいて重要なステップであり、SQL インジェクションに対して脆弱である可能性のあるサーバー上に存在するデータベースの名前を発見することを可能にします。sqlmap はこのプロセスを自動化し、効率的かつ容易にします。まず、以前のスキャン(シミュレーション)からのインジェクションが成功したことを確認し、次に --dbs フラグを使用してすべてのデータベースをリストし、コマンドを実行し、結果を解釈し、最後にシステムデータベースとユーザーデータベースを区別します。
前回のスキャンからのインジェクション成功の確認
このステップでは、前回のスキャンからの SQL インジェクションの成功を確認するシミュレーションを行います。データベースを列挙する前に、ターゲット URL が実際に SQL インジェクションに対して脆弱であり、sqlmap がそれを正常に悪用できることを確認することが不可欠です。この実験の目的のため、以前のスキャンで脆弱な URL が特定されたと仮定します。sqlmap コマンドの構造を示すために、プレースホルダーURL を使用します。
ターミナルを ~/project ディレクトリで開きます。
sqlmap -u "http://testphp.vulnweb.com/listproducts.php?cat=1" --banner
このコマンドは、指定された URL に接続するために sqlmap を使用し、データベースのバナーを取得しようと試みます。バナーの取得が成功すると、インジェクションが成功したことを示します。
出力例:
_
___ ___ ___ ___
|_ -| . | . | . |
|___|_ |_ |_ |
|_| |_| |_| 3.7-1#stable
[!] legal disclaimer: Usage of sqlmap for attacking targets without prior mutual consent is illegal. You are responsible for your own actions.
[!] do you want to enable full support for HTTP(S) proxy? [y/N] N
[!] do you want to resume the previous session? [Y/n/q] n
... (出力は省略) ...
web server operating system: Linux Debian
web application technology: Apache 2.2.14, PHP 5.3.2
back-end DBMS: MySQL >= 5.0.12
banner: '5.1.73-0ubuntu0.10.04.1'
出力の banner 行は、sqlmap がデータベースと正常にやり取りし、そのバージョン情報を取得できたことを確認しており、インジェクションが成功したことを示しています。
--dbs フラグを使用してすべてのデータベースをリストする
このステップでは、sqlmap の --dbs フラグについて学びます。このフラグは、ターゲットサーバー上の利用可能なすべてのデータベースを列挙およびリストするために特別に使用されます。このフラグは、機密情報が含まれている可能性のあるデータベースの名前を発見するために不可欠です。
--dbs フラグは、sqlmap にデータベース列挙を実行するように指示します。sqlmap が SQL インジェクションの脆弱性を正常に悪用すると、データベースサーバーにホストされているすべてのデータベースのリストを照会できます。
コマンド構造は前のステップと同様ですが、--dbs が追加されます。
sqlmap -u "http://testphp.vulnweb.com/listproducts.php?cat=1" --dbs
このコマンドは、指定された URL の SQL インジェクションの脆弱性を介してアクセス可能なすべてのデータベースを特定し、リストするように sqlmap に指示します。
データベース列挙コマンドの実行
このステップでは、データベースを列挙するために --dbs フラグを指定して sqlmap コマンドを実行します。これがこの実験の主要なアクションです。
ターミナルで以下のコマンドを実行してください。
sqlmap -u "http://testphp.vulnweb.com/listproducts.php?cat=1" --dbs
sqlmap はテストを実行し、成功すればデータベース名のリストを出力します。このプロセスは、sqlmap が様々なインジェクション技術を実行するため、時間がかかる場合があります。
出力例:
_
___ ___ ___ ___
|_ -| . | . | . |
|___|_ |_ |_ |
|_| |_| |_| 3.7-1#stable
[!] legal disclaimer: Usage of sqlmap for attacking targets without prior mutual consent is illegal. You are responsible for your own actions.
[!] do you want to enable full support for HTTP(S) proxy? [y/N] N
[!] do you want to resume the previous session? [Y/n/q] n
... (出力は省略) ...
available databases [4]:
[*] information_schema
[*] mysql
[*] performance_schema
[*] acuart
出力には sqlmap の進捗状況と、最終的に「利用可能なデータベース」のリストが表示されます。この例では、information_schema、mysql、performance_schema、acuart がリストされています。
返されたデータベース名のリストを解釈する
このステップでは、sqlmap によって返されたデータベース名のリストを解釈します。これらの名前が何を表しているかを理解することは、その後の侵入テストのステップにとって非常に重要です。
前のステップの出力で、以下のようなリストを見たかもしれません。
available databases [4]:
[*] information_schema
[*] mysql
[*] performance_schema
[*] acuart
各 [*] アイテムは、ターゲットサーバー上で見つかったデータベースを表します。
information_schema: これは MySQL(およびその他の SQL データベース)における標準的なデータベースで、データベースメタデータへのアクセスを提供します。他のすべてのデータベース、テーブル、カラム、およびアクセス権限に関する情報が含まれています。これはシステムデータベースです。mysql: これは MySQL におけるもう一つの標準的なシステムデータベースで、MySQL サーバーの運用に必要な情報を格納します。ユーザーアカウント、権限、その他のサーバー構成データが含まれています。performance_schema: これは MySQL におけるシステムデータベースで、MySQL サーバーの実行を低レベルで監視するために使用されます。サーバーのパフォーマンスに関する洞察を提供します。acuart: このデータベース名は、おそらくユーザーが作成したデータベースで、サーバー上で実行されている Web アプリケーションに固有のものです。これは、アプリケーションのデータ(ユーザー認証情報、製品情報、その他の機密性の高いビジネスデータなど)を含む可能性が高いデータベースです。
acuart のようなユーザー作成データベースを特定することは、攻撃者にとって価値のある情報が含まれている可能性が高いため、しばしば主な目標となります。
システムデータベースとユーザーデータベースの区別
この最終ステップでは、列挙結果に基づいて、システムデータベースとユーザーデータベースを明確に区別します。この区別は、侵入テストにおける次のステップを優先順位付けするために重要です。
前のステップで観察されたように、information_schema、mysql、performance_schema のようなデータベースは、通常システムレベルのデータベースです。これらはデータベース管理システムのコア機能の一部であり、通常はメタデータ、DBMS 自体のユーザーアカウント、およびパフォーマンス統計情報を含んでいます。これらが悪用される可能性もありますが、攻撃者がしばしば探しているアプリケーション固有の機密データを含んでいることは稀です。
一方、標準的なシステム名ではない名前を持つデータベース(例:私たちの例の acuart、または webapp_db、users、products など)は、通常ユーザーが作成したデータベースです。これらのデータベースには、Web アプリケーションの実際のデータが格納されています。例えば:
- ユーザー認証情報(ユーザー名、ハッシュ化されたパスワード)
- 顧客情報
- 製品カタログ
- 財務記録
- その他の独自のビジネスデータ
侵入テストを実行する際、データベースを列挙した後、これらのユーザー作成データベースに焦点を移すべきです。次に論理的なステップは、これらのユーザーデータベース内のテーブルを列挙し、次にそれらのテーブル内のカラムを列挙し、最後にデータをダンプすることです。
この区別を理解することで、最も価値のある情報を抽出するために、後続の sqlmap コマンドを効率的にターゲットにすることができます。例えば、acuart データベース内のテーブルを列挙するには、次のようなコマンドを使用します。
sqlmap -u "http://testphp.vulnweb.com/listproducts.php?cat=1" -D acuart --tables
このコマンドは、特定されたユーザーデータベースに焦点を当てて、データ抽出の次の段階に進む方法を示しています。
まとめ
この実験では、sqlmap を使用してターゲットサーバー上のデータベースを列挙する方法を習得しました。まず、SQL インジェクションが成功したことを確認することの重要性を理解しました。次に、--dbs フラグを使用して利用可能なすべてのデータベースをリストし、コマンドを実行して結果を確認しました。最後に、返されたデータベース名を解釈し、システムデータベースと、より価値のある可能性のあるユーザー作成データベースを区別する方法を学びました。このスキルは、脆弱な Web アプリケーションから情報を抽出しようとするあらゆる侵入テスターにとって基本的です。


