XML 外部实体 (XXE) 攻击失败
XML External Entities (XXE) attack failing
请提示我为什么我的代码不容易受到 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-ing 您的代码导致:
DOMDocument::loadXML():I/O 警告:加载外部实体文件失败:// 文件名的完整路径
DOMDocument::loadXML(): 无法处理 Entity
中的实体 ent
DOMDocument::loadXML(): 实体 'ent' 未在实体
中定义
默认情况下,libxml 不会精确加载外部实体以避免此问题。要说服它这样做,您需要在加载之前将 substituteEntities
or validateOnParse
设置为 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.
请提示我为什么我的代码不容易受到 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-ing 您的代码导致:
DOMDocument::loadXML():I/O 警告:加载外部实体文件失败:// 文件名的完整路径
DOMDocument::loadXML(): 无法处理 Entity
中的实体 entDOMDocument::loadXML(): 实体 'ent' 未在实体
中定义默认情况下,libxml 不会精确加载外部实体以避免此问题。要说服它这样做,您需要在加载之前将 substituteEntities
or validateOnParse
设置为 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.