hacktricks/pentesting-web/file-inclusion/lfi2rce-via-temp-file-uploads.md

4.2 KiB
Raw Blame History

{% hint style="success" %} AWSハッキングを学び、実践するHackTricks Training AWS Red Team Expert (ARTE)
GCPハッキングを学び、実践するHackTricks Training GCP Red Team Expert (GRTE)

HackTricksをサポートする
{% endhint %}

この技術の詳細はhttps://gynvael.coldwind.pl/download.php?f=PHP_LFI_rfc1867_temporary_files.pdfで確認してください。

PHPファイルアップロード

PHPエンジンがRFC 1867に従ってフォーマットされたファイルを含むPOSTリクエストを受け取ると、アップロードされたデータを保存するための一時ファイルが生成されます。これらのファイルは、PHPスクリプトにおけるファイルアップロード処理にとって重要です。永続的なストレージが必要な場合は、move_uploaded_file関数を使用してこれらの一時ファイルを所定の場所に移動する必要があります。実行後、PHPは残りの一時ファイルを自動的に削除します。

{% hint style="info" %} セキュリティ警告:攻撃者は一時ファイルの場所を知っているため、ローカルファイルインクルージョンの脆弱性を悪用して、アップロード中にファイルにアクセスすることでコードを実行する可能性があります。 {% endhint %}

不正アクセスの課題は、一時ファイルの名前を予測することにありますが、これは意図的にランダム化されています。

Windowsシステムでの悪用

Windowsでは、PHPはGetTempFileName関数を使用して一時ファイル名を生成し、<path>\<pre><uuuu>.TMPのようなパターンになります。特に:

  • デフォルトのパスは通常C:\Windows\Tempです。
  • プレフィックスは通常「php」です。
  • <uuuu>は一意の16進数値を表します。重要なことに、この関数の制限により、下位16ビットのみが使用されるため、定数のパスとプレフィックスで最大65,535の一意の名前が可能になり、ブルートフォースが実行可能です。

さらに、Windowsシステムでの悪用プロセスは簡素化されています。FindFirstFile関数の特異性により、ローカルファイルインクルージョンLFIパスでワイルドカードを使用することができます。これにより、一時ファイルを見つけるために次のようなインクルードパスを作成できます

http://site/vuln.php?inc=c:\windows\temp\php<<

特定の状況では、より具体的なマスク(例えば php1<<phpA<<)が必要になる場合があります。これらのマスクを体系的に試すことで、アップロードされた一時ファイルを発見することができます。

GNU/Linuxシステムでの悪用

GNU/Linuxシステムでは、一時ファイル名のランダム性が強固であり、名前は予測不可能であり、ブルートフォース攻撃に対しても脆弱ではありません。詳細は参照された文書に記載されています。