Libxml_disable_entitiy_loader (ложь);Внешние объекты еще не загружены - PullRequest
1 голос
/ 04 октября 2019

Я пытался имитировать уязвимость 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. код.

...