XML外部实体(XXE)攻击失败

时间:2018-07-24 17:06:41

标签: php windows xxe

请给我一个提示,为什么我的代码不易受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():I / O警告:无法加载外部实体file://文件名的完整路径

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

DOMDocument :: loadXML():未在实体中定义的实体“ ent”

1 个答案:

答案 0 :(得分:3)

默认情况下,libxml不会完全加载外部实体,以避免出现此问题。为了说服它这样做,您需要在加载之前将substituteEntitiesvalidateOnParse设置为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.