Я задаю вопрос здесь в качестве крайней меры, я просмотрел веб-страницы и прошел множество попыток, но не смог.
Репликация атаки XXE - это то, что я пытаюсь сделать, чтобы предотвратить их, но я не могу понять, как работает PHP с объектами XML. Для записи я использую PHP 5.5.10 на Ubuntu 12.04, но я провел несколько тестов на 5.4 и 5.3, а libxml2, похоже, имеет версию 2.7.8 (которая, похоже, не включает дефолт по умолчанию, чтобы не разрешать сущности).
В следующем примере вызов функции libxml_disable_entity_loader() с true или false не имеет никакого эффекта, или я делаю что-то неправильно.
$xml = <<<XML
<?xml version="1.0"?>
<!DOCTYPE root [
<!ENTITY c PUBLIC "bar" "/etc/passwd">
]>
<root>
<test>Test</test>
<sub>&c;</sub>
</root>
XML;
libxml_disable_entity_loader(true);
$dom = new DOMDocument();
$dom->loadXML($xml);
// Prints Test.
print $dom->textContent;
Но я мог бы специально передать некоторые аргументы loadXML(), чтобы разрешить некоторые параметры, и это работает, когда объект является локальным файлом, а не когда он является внешним URL-адресом.
$xml = <<<XML
<?xml version="1.0"?>
<!DOCTYPE root [
<!ENTITY c PUBLIC "bar" "/etc/passwd">
]>
<root>
<test>Test</test>
<sub>&c;</sub>
</root>
XML;
$dom = new DOMDocument();
$dom->loadXML($xml, LIBXML_NOENT | LIBXML_DTDLOAD);
// Prints Test.
print $dom->textContent;
Теперь, если мы меняем объект на что-то еще, как в следующем примере, объект разрешен, но я вообще не мог отключить его с помощью параметров или функции... Что происходит?!
$xml = <<<XML
<?xml version="1.0"?>
<!DOCTYPE root [
<!ENTITY c "Blah blah">
]>
<root>
<test>Test</test>
<sub>&c;</sub>
</root>
XML;
$dom = new DOMDocument();
$dom->loadXML($xml);
// Prints Test.
print $dom->textContent;
Единственный способ, которым я мог найти, - перезаписать свойства объекта DOMDocument.
- resolveExternals установлено в 1
- substituteEntities, установленный в 1
Затем они разрешаются или нет.
Итак, чтобы обобщить, я бы очень хотел понять, что я, очевидно, не понимаю. Почему эти параметры и функции кажутся неэффективными? Является ли libxml2 приоритетом над PHP?
Большое спасибо!
Литература:
- https://www.owasp.org/index.php/XML_External_Entity_%28XXE%29_Processing
- http://au2.php.net/libxml_disable_entity_loader
- http://au2.php.net/manual/en/libxml.constants.php
- http://www.vsecurity.com/download/papers/XMLDTDEntityAttacks.pdf
- http://www.mediawiki.org/wiki/XML_External_Entity_Processing
- Как я могу использовать различные XML-библиотеки PHP для получения DOM-подобных функций и избегать уязвимостей DoS, таких как Billion Laughs или Quadratic Blowup?