我一直试图在我的虚拟机上模仿 XXE 漏洞以用于学习目的。但是,我想我误解了一些东西。当我调用 libxml_disable_external_entities(false); 我认为现在加载了外部实体,但是,外部实体似乎没有加载。
当我设置标志 LIBXML_NOENT 时,它确实有效。但这给我留下了一个问题,那么 libxml_disable_external_entities 实际上做了什么?我已将其设置为 false 和 true,结果相同。
所以我带着同样的问题上网,注意到ubuntu网站上有一个CVE报告(我在ubuntu上测试过)。CVE 声明 libxml 标准易受 XXE 攻击。修复是默认停止加载外部实体。见:https ://usn.ubuntu.com/1904-1/
我的测试设置:
<?php
$xml= '<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE foo [
<!ELEMENT foo ANY >
<!ENTITY xxe SYSTEM "http://www.localhost:8000" >]><foo>&xxe;</foo>';
libxml_disable_entity_loader(false);
$document = new DOMDocument();
$document->loadXML($xml);
?>
我希望我的网络服务器会接到一个电话,但它没有。PHP 处理程序没有给我任何输出。所以我的问题是: libxml_disable_entity_loader 实际上做了什么?
PS:在 libxml 代码中也找不到任何东西。除非另有说明,否则可以找到停止加载外部实体的修复程序。
谢谢!
更新:我发现它仅适用于 libxml_disable_entitiy_loader(false); 的组合;以及在“loadXML”方法中设置的 LIBXML_NOENT 标志。
编辑:该方法执行以下操作(在 PHP 代码中):
PHP_LIBXML_API zend_bool php_libxml_disable_entity_loader(zend_bool disable) /* {{{ */
{
zend_bool old = LIBXML(entity_loader_disabled);
LIBXML(entity_loader_disabled) = disable;
return old;
}
但是,在 libxml 代码中搜索 entity_loader_disabled 不会产生任何结果。