Я пытался имитировать уязвимость XXE на моей виртуальной машине в учебных целях. Тем не менее, я думаю, что я неправильно понял что-то. Когда я вызываю libxml_disable_external_entities (false);Я думаю, что внешние объекты теперь загружены, однако внешние объекты, похоже, не загружаются.
Когда я устанавливаю флаг LIBXML_NOENT, он работает. Но это оставляет меня с вопросом, что же тогда делает libxml_disable_external_entities? Я установил как ложное, так и истинное, с одинаковыми результатами.
Так что я пошел в Интернет с тем же вопросом и заметил отчет CVE на веб-сайте Ubuntu (я тестировал на Ubuntu). CVE заявил, что libxml является стандартно уязвимым для XXE. Исправлено было прекращение загрузки внешних объектов по умолчанию. См .: https://usn.ubuntu.com/1904-1/
Мои настройки теста:
<?php
$xml= '<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE foo [
<!ELEMENT foo ANY >
<!ENTITY xxe SYSTEM "http://www.localhost:8000" >]><foo>&xxe;</foo>';
libxml_disable_entity_loader(false);
$document = new DOMDocument();
$document->loadXML($xml);
?>
Я ожидал, что мой веб-сервер получит вызов, но это не так. Обработчик PHP не дает мне никакого вывода. Итак, мой вопрос: что на самом деле делает libxml_disable_entity_loader?
PS: Не удалось найти ничего в коде libxml. Может найти исправление для остановки загрузки внешних объектов, если не указано иное.
Спасибо!
ОБНОВЛЕНИЕ: Я обнаружил, что это работает только с комбинацией, если libxml_disable_entitiy_loader (false);и флаг LIBXML_NOENT, установленный в методе «loadXML».
EDIT: метод выполняет следующие действия (в коде PHP):
PHP_LIBXML_API zend_bool php_libxml_disable_entity_loader(zend_bool disable) /* {{{ */
{
zend_bool old = LIBXML(entity_loader_disabled);
LIBXML(entity_loader_disabled) = disable;
return old;
}
Однако поиск entity_loader_disabled не приводит к результатам в libxml. код.