【问题标题】:External entities not working in simplexml外部实体在 simplexml 中不起作用
【发布时间】:2015-04-25 19:02:55
【问题描述】:

我在 PHP 5 中使用 SimpleXML 解析 XML,但外部实体不起作用。 XML 解析,但实体只是空白。底层库是 libxml2。

这是代码:

libxml_disable_entity_loader(false);
simplexml_load_file($target_file);

它按预期解析 XML,但不解析外部实体,似乎忽略了它们。

【问题讨论】:

  • 实施问题(像这样)最好在 SO 上提出。
  • 你也应该发布有问题的xml,如果它不是那么长

标签: php xml


【解决方案1】:

这是预期的行为,因为您需要在加载文档时告知以展开(并因此删除)这些实体:

libxml_disable_entity_loader(false);
simplexml_load_file($target_file, 'SimpleXMLElement', LIBXML_NOENT);
                                                      ############

这个常数也在the manual page of libxml_disable_entity_loader上交联。

函数本身只启用或禁用默认实体加载器。此外,需要通过基于 libxml2 的选项标志告诉解析器,这些实体应该被替换。只有这样默认加载器(或者如果您已将其设置为不同的加载器)才会启动。

Online Demo:

<?php
/**
 * @link https://stackoverflow.com/a/29864193/367456
 */

$buffer = <<<XML
<?xml version="1.0"?>
 <!DOCTYPE foo [  
  <!ELEMENT foo ANY >
  <!ENTITY xxe SYSTEM "data://text/plain,test" >]><foo>&xxe;</foo>
XML;

libxml_disable_entity_loader(false);

$xml = simplexml_load_string($buffer);
$xml->asXML('php://output');

$xml = simplexml_load_string($buffer, 'SimpleXMLElement', LIBXML_NOENT);
$xml->asXML('php://output');

5.2.11 - 5.6.8、php7@20140507 - 20150401、hhvm-3.5.0 - 3.6.1 的输出

<?xml version="1.0"?>
<!DOCTYPE foo [
<!ELEMENT foo ANY>
<!ENTITY xxe SYSTEM "data://text/plain,test">
]>
<foo>&xxe;</foo>
<?xml version="1.0"?>
<!DOCTYPE foo [
<!ELEMENT foo ANY>
<!ENTITY xxe SYSTEM "data://text/plain,test">
]>
<foo>test</foo>

XML 基于XML External Entity (XXE) Processing (OWASP Wiki) 上概述的漏洞利用示例,并针对您的问题进行了修改以用于 PHP 演示。

比 PHP 版本更重要的是系统上的 libxml 版本和 PHP 中的绑定。只是说,以防 3v4l.org 演示代码给人的印象是它在所有 PHP 版本中的行为总是相同的 - 绝对不能这样。

相关问答

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-04-17
    • 1970-01-01
    • 2011-02-20
    • 1970-01-01
    • 2013-03-15
    • 1970-01-01
    • 2019-02-11
    相关资源
    最近更新 更多