XXE&XML漏洞
概念
XML 被设计为传输和存储数据,XML 文档结构包括 XML 声明、DTD 文档类型定义(可选)、文档元素,其焦点是数据的内容,其把数据从 HTML 分离,是独立于软件和硬件的信息传输工具。XXE 漏洞全称XML External Entity Injection,即 xml 外部实体注入漏洞,XXE 漏洞发生在应用程序解析 XML 输入时,没有禁止外部实体的加载,导致可加载恶意外部文件,造成文件读取、命令执行、内网端口扫描、攻击内网网站等危害。
XML与HTML的区别
XML 被设计用来传输和存储数据,其焦点是数据的内容
HTML 被设计用来显示数据,其焦点是数据的外观
HTML旨在显示信息,而XML旨在传输信息。
XML文档结构包括:
①XML声明
②DTD文档类型定义(可选)
③文档元素
<!ENTITY xxe SYSTEM "file:///c:/windows/win.ini" >
]>
SYSTEM标识符意味着该实体将从外部来源获取内容
危害
文件读取
RCE执行
内网攻击
Dos攻击
利用
1、输出形式
①有回显:
协议玩法:http、file、各个脚本支持协议
外部引用
②无回显:外部引用-反向连接配合
2、过滤绕过
①各种协议
②外部引用
③编码UTF-16BE
检测
1、白盒:
①函数及可控变量查找
②传输和存储数据格式类型
2、黑盒:
①人工:
数据格式类型判断:
Content-Type值判断:test/xml、application/xml
更改Content-Type值看返回
②工具:XXEinjector、XXExploiter等
#DTD —会被XML所识别并执行
文档类型定义(DTD)可定义合法的 XML 文档构建模块
它使用一系列合法的元素来定义文档的结构
DTD 可被成行地声明于 XML 文档中,也可作为一个外部引用
(1)内部的 DOCTYPE 声明
(2)外部文档声明
#DTD 实体
(1)内部实体声明
(2)外部实体声明
(3)参数实体声明
#xxe 漏洞修复与防御方案-php,java,python
#方案 1-禁用外部实体
PHP:
libxml_disable_entity_loader(true);
JAVA:
DocumentBuilderFactory dbf
=DocumentBuilderFactory.newInstance();dbf.setExpandEntityReferences(false);
Python:
from lxml import etreexmlData = etree.parse(xmlSource,etree.XMLParser(resolve_entities=False))
#方案 2-过滤用户提交的 XML 数据
过滤关键词:<!DOCTYPE 和<!ENTITY,或者 SYSTEM 和 PUBLIC
实验
pikachu靶场XML数据传输测试–回显,玩法,协议,引入
读取文件
]>
内网探测
]>
引入外部实体dtd
利用条件:网站未禁止外部实体应用
%file;
]>
test.dtd:
无回显-读取文件
日志文件:C:\phpStudy\Apache\logs
需要开启日志功能:打开httpd.conf配置文件,去掉CustomLog “logs/access.log” common前面两个##
注:dtd里的内容,内部的%号要进行实体编码成%
%dtd;%send;
]>
test.dtd:
“
%payload;
协议-读文件(绕过)
参考:https://www.cnblogs.com/20175211lyz/p/11413335.html
]>
xxelab靶场登陆框测试-检测发现
①提交的数据包含 XML 格式如:
②请求头中如:
Content-Type:text/xml 或 Content-type:application/xml
]>
CTF-Jarvis-OJ-Web-XXE 安全真题复现-数据请求格式
更改请求数据格式:application/xml
]>
xxe漏洞自动化注射脚本工具-XXEinjector(Ruby)
涉及资源
http://web.jarvisoj.com:9882/ CTF-Jarvis-OJ-Web-XXE靶场
https://github.com/c0ny1/xxe-lab xxe靶场
https://www.cnblogs.com/bmjoker/p/9614990.html XXEinjector注入工具
https://www.cnblogs.com/20175211lyz/p/11413335.html XXE基本知识