我在这里发表了一个最后的问题,我已经浏览了网络,经历了许多尝试,但没有成功.

复制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;

但是,我可以具体地传递一些参数来加载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;

现在,如果我们将实体更改为其他的东西,如下面的例子,实体被解决了,但我无法使用参数或函数禁用它…发生什么事?

$xml = <<<XML
<?xml version="1.0"?>
<!DOCTYPE root [
<!ENTITY c "Blah blah">
]>
<root>
    <test>Test</test>
    <sub>&c;</sub>
</root>
XML;

$dom = new DOMDocument();
$dom->loadXML($xml);

// Prints Test.
print $dom->textContent;

我可以找到的唯一方法是覆盖DOMDocument对象的属性.

> resolveExternals设置为1
> substituteEntities设置为1

那么他们是解决了,还是不解决.

所以总结一下,我真的很想明白我显然不明白.为什么这些参数和功能似乎没有效果? libxml2是否优先于PHP?

非常感谢!

参考文献:

> https://www.owasp.org/index.php/XML_External_Entity_%28XXE%29_Processing
> http://au2.php.net/libxml_disable_entity_loader
> http://au2.php.net/manual/en/libxml.constants.php
> http://www.vsecurity.com/download/papers/XMLDTDEntityAttacks.pdf
> http://www.mediawiki.org/wiki/XML_External_Entity_Processing
> How can I use PHP’s various XML libraries to get DOM-like functionality and avoid DoS vulnerabilities,like Billion Laughs or Quadratic Blowup?

保持简单..因为它应该很简单:-)

你的第一个代码片段

libxml_disable_entity_loader根据您的系统默认情况下是否解析实体(我的)不执行或不执行任何操作.这由libxml的LIBXML_NOENT选项控制.

没有它,文档处理器可能甚至不会尝试翻译外部实体,因此libxml_disable_entity_loader没有任何真正的影响(如果libxml未在默认情况下加载实体,这在您的测试用例中似乎是这种情况).

将LIBXML_NOENT添加到loadXML(),如下所示:

$dom->loadXML($xml,LIBXML_NOENT);

你会很快得到:

PHP Warning:  DOMDocument::loadXML(): I/O warning : Failed to load external entity "/etc/passwd" in ...
PHP Warning:  DOMDocument::loadXML(): Failure to process entity c in Entity,line: 7 in ...
PHP Warning:  DOMDocument::loadXML(): Entity 'c' not defined in Entity,line: 7 in ...

你的第二个代码片段

在这种情况下,您通过使用LIBXML_NOENT选项启用实体解析,这就是为什么它在/ etc / passwd之后.

该示例在我的机器上正常工作,即使是外部URL – 我将ENTITY更改为外部URL:

<!ENTITY c PUBLIC "bar" "https://stackoverflow.com/opensearch.xml">

然而,它甚至可以受到例如的影响. allow_url_fopen PHP INI设置 – 将其设置为false,PHP将不会加载远程文件.

你的第三个代码片段

您提供的XML实体不是外部的,而是内部的(参见例如here).

您的实体:

<!ENTITY c "Blah blah">

内部实体的定义如何:

<!ENTITY % name "entity_value">

因此,PHP或libxml没有任何理由阻止此类实体的解析.

结论

我已经很快地建立了一个PHP XXE tester script,它尝试了不同的设置,并显示XXE是否成功,在哪种情况下.

实际显示警告的唯一一行是“LIBXML_NOENT”.

如果任何其他线路加载警告,外部实体加载!您的设置默认允许加载外部实体.

使用SHOULD USE libxml_disable_entity_loader(),无论您的/您的提供商的机器默认设置如何,您都不能出错.如果你的应用程序被迁移,它可能会立即变得脆弱.

正确使用

正如Mediawiki在link you’ve posted所说.

Unfortunately,the way that libxml2 implements the disabling,the library is crippled when external entities are disabled,and functions that would otherwise be safe cause an exception in the entire parsing.

$oldValue = libxml_disable_entity_loader(true);
// do whatever XML-processing related
libxml_disable_entity_loader($oldValue);

注意:libxml_disable_entity_loader()还禁止直接加载外部xml文件(而不是通过实体):

<?PHP
$remote_xml = "https://stackoverflow.com/opensearch.xml";

$dom = new DOMDocument();

if ($dom->load($remote_xml) !== FALSE)
    echo "loaded remote xml!\n";
else
    echo "Failed to load remote xml!\n";

libxml_disable_entity_loader(true);
if ($dom->load($remote_xml) !== FALSE)
    echo "loaded remote xml after libxml_disable_entity_loader(true)!\n";
else 
    echo "Failed to remote xml after libxml_disable_entity_loader(true)!\n";

在我的机器上

loaded remote xml!
PHP Warning:  DOMDocument::load(): I/O warning : Failed to load external entity "https://stackoverflow.com/opensearch.xml" in ...
Failed to remote xml after libxml_disable_entity_loader(true)!

这可能与this PHP bug有关,但PHP真的很愚蠢:

libxml_disable_entity_loader(true);
$dom->loadXML(file_get_contents($remote_xml));

工作很好

澄清整个PHP版本的XXE漏洞的更多相关文章

  1. ios – 如何使用Objective C类中的多个参数调用Swift函数?

    本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请发送邮件至dio@foxmail.com举报,一经查实,本站将立刻删除。

  2. ios – Swift 4添加手势:覆盖vs @objc

    我想在我的视图中添加一个手势,如下所示:但是,在Swift4中,我的编译器给出了以下错误:建议添加@objc以将此实例方法公开给Objective-C.实现此目的的另一个选项将覆盖touchesBegan()函数并使用它来处理点击.我试图以“Swift”的方式做到这一点,而不必带入Obj-C.有没有纯粹的Swift方式来添加这个轻击手势而不使用@objc?

  3. ios – 将视频分享到Facebook

    我正在编写一个简单的测试应用程序,用于将视频从iOS上传到Facebook.由于FacebookSDK的所有文档都在Objective-C中,因此我发现很难在线找到有关如何使用Swift执行此操作的示例/教程.到目前为止我有这个在我的UI上放置一个共享按钮,但它看起来已禁用,从我读到的这是因为没有内容设置,但我看不出这是怎么可能的.我的getVideoURL()函数返回一个NSURL,它肯定包含视

  4. ios – 以编程方式在Swift中添加联系人

    我想在Swift中以编程方式添加联系人.我发现了一些Objective-C示例,但我没有让它们工作,甚至在Objective-C中也没有.我不希望这涉及到AddressBookUI,因为我想从我自己的UI中获取值.解决方法这是在Swift中添加联系人的快速方法.我在我的iPhone5iOS7.1上验证了它,因为我发现模拟器并不总是与我的手机对AB的东西相同.您可以添加一个按钮并指向此方法:顺便说一下–它假设你已经分配了一个地址簿var,你可以通过覆盖viewDidAppear来打开视图.它也会执行安全提示

  5. xcode – Cordova plugin.xml添加“Header Search Paths”条目

    我希望将Cordova插件添加到Xcode项目后,在“HeaderSearchPaths”下添加一个新条目.如何在Cordovaplugin.xml文件中进行配置?

  6. ios – 为目标c中的方法传递未知类型的参数,可能吗?

    是否可以将未知类型的参数传递给objective-C方法?在C#中你可以写实现这一点,但我知道Objective-C没有泛型,所以有没有其他方法可以在Objective-C中实现这一点?我需要这个,因为我想创建一个方法来改变不同对象的文本颜色,如UITextField和UIButton的占位符文本.所以我的计划是创建一个名为textWhite的方法,然后在此方法中检查对象的类型,然后运行匹配的代码以使文本颜色变为白色.解决方法是的,可以传递未知类型的参数.见下面的例子.请参考使用id对象的链接作为参数Us

  7. ios – Swift指针算术和解除引用;将一些类似C的地图代码转换为Swift

    我有一点似乎没有工作的Swift代码……解决方法您正在指定locationPointer指向新位置,但仍在下一行中使用ptr,并且ptr的值尚未更改.将您的最后一行更改为:或者你可以改变指向var的指针并推进它:

  8. ios – 有关多个连接/提要/视图的XML解析的设计/实现建议

    >我应该在每个视图中都有解析器类/对象或解析XML提要吗?

  9. ios – “禁用模块时使用’@import’”错误 – 启用模块和链接框架= YES

    我有一个使用CocoaPods并使用’SCLAlertView-Objective-C’窗格的项目.该pod使用@importUIKit;模块样式导入.我在目标和项目设置中将“启用模块(C&Objective-C)”和“自动链接框架”设置为YES.当模块被禁用时,我仍然得到“使用’@import’错误.有没有什么可以阻止Xcode能够启用模块,如使用.pch文件,任何链接器标志,或者我没有提到的任

  10. iOS 10 Safari问题在DOM中不再包含元素

    使用此链接,您可以重现该错误.https://jsfiddle.net/pw7e2j3q/如果您点击元素并从dom中删除它,然后单击链接测试.你应该看到旧的元素弹出选择.是否有一些黑客来解决这个问题?解决方法我能够重现这个问题.问题是,每当您尝试删除其更改事件上的选择框时,iOS10都无法正确解除对选择框的绑定.要解决此问题,您需要将代码更改事件代码放在具有一些超时

随机推荐

  1. PHP个人网站架设连环讲(一)

    先下一个OmnihttpdProffesinalV2.06,装上就有PHP4beta3可以用了。PHP4给我们带来一个简单的方法,就是使用SESSION(会话)级变量。但是如果不是PHP4又该怎么办?我们可以假设某人在15分钟以内对你的网页的请求都不属于一个新的人次,这样你可以做个计数的过程存在INC里,在每一个页面引用,访客第一次进入时将访问时间送到cookie里。以后每个页面被访问时都检查cookie上次访问时间值。

  2. PHP函数学习之PHP函数点评

    PHP函数使用说明,应用举例,精简点评,希望对您学习php有所帮助

  3. ecshop2.7.3 在php5.4下的各种错误问题处理

    将方法内的函数,分拆为2个部分。这个和gd库没有一点关系,是ecshop程序的问题。会出现这种问题,不外乎就是当前会员的session或者程序对cookie的处理存在漏洞。进过本地测试,includes\modules\integrates\ecshop.php这个整合自身会员的类中没有重写integrate.php中的check_cookie()方法导致,验证cookie时返回的username为空,丢失了登录状态,在ecshop.php中重写了此方法就可以了。把他加到ecshop.php的最后面去就可

  4. NT IIS下用ODBC连接数据库

    $connection=intodbc_connect建立数据库连接,$query_string="查询记录的条件"如:$query_string="select*fromtable"用$cur=intodbc_exec检索数据库,将记录集放入$cur变量中。再用while{$var1=odbc_result;$var2=odbc_result;...}读取odbc_exec()返回的数据集$cur。最后是odbc_close关闭数据库的连接。odbc_result()函数是取当前记录的指定字段值。

  5. PHP使用JpGraph绘制折线图操作示例【附源码下载】

    这篇文章主要介绍了PHP使用JpGraph绘制折线图操作,结合实例形式分析了php使用JpGraph的相关操作技巧与注意事项,并附带源码供读者下载参考,需要的朋友可以参考下

  6. zen_cart实现支付前生成订单的方法

    这篇文章主要介绍了zen_cart实现支付前生成订单的方法,结合实例形式详细分析了zen_cart支付前生成订单的具体步骤与相关实现技巧,需要的朋友可以参考下

  7. Thinkphp5框架实现获取数据库数据到视图的方法

    这篇文章主要介绍了Thinkphp5框架实现获取数据库数据到视图的方法,涉及thinkPHP5数据库配置、读取、模型操作及视图调用相关操作技巧,需要的朋友可以参考下

  8. PHP+jquery+CSS制作头像登录窗(仿QQ登陆)

    本篇文章介绍了PHP结合jQ和CSS制作头像登录窗(仿QQ登陆),实现了类似QQ的登陆界面,很有参考价值,有需要的朋友可以了解一下。

  9. 基于win2003虚拟机中apache服务器的访问

    下面小编就为大家带来一篇基于win2003虚拟机中apache服务器的访问。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  10. Yii2中组件的注册与创建方法

    这篇文章主要介绍了Yii2之组件的注册与创建的实现方法,非常不错,具有参考借鉴价值,需要的朋友可以参考下

返回
顶部