0

请给我一个提示,为什么我的代码不容易受到 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>

但无济于事。

测试.txt:

This is just a test.

试过:

<test>This is just a test.</test>

没有结果。

有什么提示吗?

反映@Paul Crovella,这是一个编辑:

CP-ing 你的代码导致:

DOMDocument::loadXML(): I/O warning : failed to load external entity file:// full path to file name

DOMDocument::loadXML(): 无法处理 Entity 中的实体

DOMDocument::loadXML(): Entity 'ent' 未在 Entity 中定义

4

1 回答 1

3

默认情况下,libxml 不会精确加载外部实体以避免此问题。要说服它这样做,您需要在加载之前设置或设置substituteEntities。例如:validateOnParsetrue

$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.
于 2018-07-24T17:48:10.800 回答