LFI2RCE через PHP_SESSION_UPLOAD_PROGRESS

Reading time: 3 minutes

tip

Вивчайте та практикуйте AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Вивчайте та практикуйте GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Підтримайте HackTricks

Основна інформація

Якщо ви знайшли Local File Inclusion, навіть якщо у вас немає сесії і session.auto_start вимкнено. Якщо session.upload_progress.enabled увімкнено і ви надаєте PHP_SESSION_UPLOAD_PROGRESS у multipart POST даних, PHP увімкне сесію для вас.

bash
$ curl http://127.0.0.1/ -H 'Cookie: PHPSESSID=iamorange'
$ ls -a /var/lib/php/sessions/
. ..
$ curl http://127.0.0.1/ -H 'Cookie: PHPSESSID=iamorange' -d 'PHP_SESSION_UPLOAD_PROGRESS=blahblahblah'
$ ls -a /var/lib/php/sessions/
. ..
$ curl http://127.0.0.1/ -H 'Cookie: PHPSESSID=iamorange' -F 'PHP_SESSION_UPLOAD_PROGRESS=blahblahblah'  -F 'file=@/etc/passwd'
$ ls -a /var/lib/php/sessions/
. .. sess_iamorange

In the last example the session will contain the string blahblahblah

Зверніть увагу, що з PHP_SESSION_UPLOAD_PROGRESS ви можете контролювати дані всередині сесії, тому якщо ви включите свій файл сесії, ви можете включити частину, яку контролюєте (наприклад, php shellcode).

note

Хоча більшість навчальних посібників в Інтернеті рекомендують встановити session.upload_progress.cleanup на Off для налагодження. За замовчуванням session.upload_progress.cleanup в PHP все ще встановлено на On. Це означає, що ваш прогрес завантаження в сесії буде очищено якомога швидше. Отже, це буде Race Condition.

CTF

У оригінальному CTF, де коментується ця техніка, було недостатньо експлуатувати Race Condition, але вміст, що завантажується, також повинен починатися з рядка @<?php.

Через налаштування за замовчуванням session.upload_progress.prefix, наш файл SESSION почне з набридливого префікса upload_progress_, такого як: upload_progress_controlledcontentbyattacker.

Трюк, щоб видалити початковий префікс, полягав у тому, щоб кодувати payload 3 рази в base64 і потім декодувати його за допомогою фільтрів convert.base64-decode, це пов'язано з тим, що при декодуванні base64 PHP видалить дивні символи, тому після 3 разів залишиться тільки payload, надісланий атакуючим (а потім атакуючий може контролювати початкову частину).

Більше інформації в оригінальному описі https://blog.orange.tw/2018/10/ та фінальному експлойті https://github.com/orangetw/My-CTF-Web-Challenges/blob/master/hitcon-ctf-2018/one-line-php-challenge/exp_for_php.py
Ще один опис у https://spyclub.tech/2018/12/21/one-line-and-return-of-one-line-php-writeup/

tip

Вивчайте та практикуйте AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Вивчайте та практикуйте GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Підтримайте HackTricks