Пожалуйста, дайте мне подсказку, почему мой код НЕ уязвим для XXE.
код:
$text = $_POST['textarea'];
$doc= new DOMDocument();
$doc->loadXML($text);
echo $doc->textContent;
контрольный пример 1:
<justsomexmltag>Hello world</justsomexmltag>
результат 1:
Hello world
Все идет нормально. Тем не менее, когда я пытаюсь внедрить код XML для получения содержимого локального файла:
<?xml version="1.0"?>
<!DOCTYPE log [
<!ENTITY ent SYSTEM "test.txt">
]>
<log><text>&ent;</text></log>
тогда ничего не печатается. «test.txt» находится на том же уровне в файловой структуре, что и файл php, где я выполняю атаку. я пытался
<!ENTITY ent SYSTEM file:///"test.txt">
так же как
<!ENTITY ent SYSTEM file:///full path to the file>
но безрезультатно.
test.txt:
This is just a test.
Пытался:
<test>This is just a test.</test>
Нет результатов.
Есть намеки?
отражая @Paul Crovella, вот редактирование:
CP-код вашего кода привел к:
DOMDocument :: loadXML (): предупреждение ввода-вывода: не удалось загрузить файл внешнего объекта: // полный путь к имени файла
DOMDocument :: loadXML (): сбой при обработке объекта в Entity
DOMDocument :: loadXML (): Entity ‘ent’ не определен в Entity
По умолчанию libxml не будет загружать внешние объекты точно, чтобы избежать этой проблемы. Чтобы убедить это сделать, вам нужно установить либо substituteEntities
или же validateOnParse
в true
до загрузки. Например.:
$xml = <<<'XML'
<?xml version="1.0"?>
<!DOCTYPE log [
<!ENTITY ent SYSTEM "test.txt">
]>
<log><text>&ent;</text></log>
XML;
$dom = new DOMDocument();
$dom->substituteEntities = true;
$dom->loadXML($xml);
echo $dom->textContent;
Выходы:
This is just a test.
Других решений пока нет …