我在这里发布一个问题作为最后的手段,我浏览了网页并经历了许多尝试,但没有成功.
复制XXE攻击是我想要做的,为了防止它们,但我似乎无法理解PHP与XML实体的工作方式.为了记录,我在Ubuntu 12.04上使用PHP 5.5.10,但是我已经对5.4和5.3进行了一些测试,而libxml2似乎是2.7.8版(它似乎没有包含默认的不解析实体).
在下面的示例中,使用true或false调用libxml_disable_entity_loader()无效,或者我做错了什么.
$xml = <<<XML
<?xml version="1.0"?>
<!DOCTYPE root [
<!ENTITY c PUBLIC "bar" "/etc/passwd">
]>
<root>
<test>Test</test>
<sub>&c;</sub>
</root>
XML;
libxml_disable_entity_loader(true);
$dom = new DOMDocument();
$dom->loadXML($xml);
// Prints Test.
print $dom->textContent;
Run Code Online (Sandbox Code Playgroud)
但是,我可以专门将一些参数传递给loadXML()以允许一些选项,并且当实体是本地文件时工作,而不是当它是外部URL时.
$xml = <<<XML
<?xml version="1.0"?>
<!DOCTYPE root [
<!ENTITY c PUBLIC "bar" "/etc/passwd">
]>
<root>
<test>Test</test>
<sub>&c;</sub>
</root>
XML;
$dom = new DOMDocument();
$dom->loadXML($xml, LIBXML_NOENT | LIBXML_DTDLOAD);
// Prints Test.
print $dom->textContent;
Run Code Online (Sandbox Code Playgroud)
现在,如果我们将实体更改为其他内容,如下例所示,实体已解析但我无法使用参数或函数禁用它...发生了什么?!
$xml = <<<XML
<?xml version="1.0"?>
<!DOCTYPE root [
<!ENTITY c "Blah …
Run Code Online (Sandbox Code Playgroud)