目录
#知识点:
1、XML&XXE-原理&发现&利用&修复等
2、XML&XXE-黑盒模式下的发现与利用
3、XML&XXE-白盒模式下的审计与利用
4、XML&XXE-无回显&伪协议&产生层面
#思路点:
参考:https://www.cnblogs.com/20175211lyz/p/11413335.html
#详细点:
XML被设计为传输和存储数据,XML文档结构包括XML声明、DTD文档类型定义(可选)、文档元素,其焦点是数据的内容,其把数据从HTML分离,是独立于软件和硬件的信息传输工具。XXE漏洞全称XML External Entity Injection,即xml外部实体注入漏洞,XXE漏洞发生在应用程序解析XML输入时,没有禁止外部实体的加载,导致可加载恶意外部文件,造成文件读取、命令执行、内网端口扫描、攻击内网网站等危害。
XML与HTML 的主要差异:
XML被设计为传输和存储数据,其焦点是数据的内容。
HTML被设计用来显示数据,其焦点是数据的外观。
HTML旨在显示信息 ,而 XML 旨在传输信息。
dtd是xml的一个实体文件,里面写的是xml的代码
XML用于网络传输,配置网络文件。xml标签都是自定义的,xml的语法严格,xml是存储数据的。
XXE就是XML外部实体注入。当允许引用外部实体时,通过构造恶意内容,可导致读取任意文件、执行系统命令、探测内网端口、攻击内网网站等危害。
客户端通过xml发送数据,然后服务端用xml解析数据。这个xml就好比json是传输数据的一种类型。
案例:
#XML&XXE-黑盒-原理&探针&利用&玩法等
首先我们搭建好网站,然后输入账号密码admin,admin进行抓包。会发现数据包中数据类型为XML,并且下面数据传输的方式就是xml,如果说是字符串类型的话那应该是那种一个名字一个等号一个数据这种的(name=xiaopei),如果是json的话,那它应该是那种键值对的形式。
那这里应该就会有XXE漏洞,我们进行文件读取的操作尝试一下,发现可以读取到d盘下的e.txt。内容为xiaopeisec
这个时候我们还可以通过引用外部实体来解决拦截过滤等问题,但是这个是无法解决没有回显的问题的。相当于就是引用自己服务器的实体文件evil2.dtd,然后文件里面的内容就是读取e.txt的内容。
但是当我们写上payload点击go之后,返回的东西是空,那么就会有三种可能,第一种就是无回显,第二种就是payload写错了,第三种就是这个地方没有漏洞。
具体是什么原因我们可以测试一下,可以尝试利用带外测试看它有没有漏洞,如果带外测试成功那就代表它有这个漏洞,没有显示可能是payload写错了或则不回显。
带外测试操作:
这个就要利用到之前我们讲的dnslog,我们先用dnslog生成一个随机的域名,然后利用http协议去进行网络探针,相当于就是访问这个域名,下面dnslog也是收到了请求,那么说明就是有漏洞。
这个时候我们看源码,这里数据包中请求的是dologin.php这个文件,我们打开它,通过下面的源码可以知道,将获取的账号密码比对之后,正确的话输出1加上读取的文件或则其他操作的结果,错误的话就是0加上读取的文件或则其他操作的结果。那如果把那两行输出的给注释掉的话,就会出现一个问题就是无回显。这个时候可以用下面的方法解决。
无回显解决方法如下图,就是先读取这个e.txt,读取到的信息复制给变量file。然后引用外部实体test.dtd,然后外部实体里面写上用get.php这个文件的file参数去接收上面的变量file的内容。那么最后我们读取到的内容就会在file.txt这个文本文档中显示
上面之说了两种协议,一个file协议,一个http协议。还有很多其他协议的玩法见下图
XML&XXE-前端-CTF&Jarvisoj&探针&利用
http://web.jarvisoj.com:9882/,点击链接就是这道题了,我们点击go然后进行抓包发现这个格式是json,然后右键源代码会发现这个题的源码就出来了,看着是黑盒实际是白盒,
虽然抓包是json格式,但是看源码可以知道它原本是xml格式,然后后面又换成了json格式,相当于是二次处理了,这个题也是考的是xml,我们把数据改成payload会发现返回的是400状态码,这是因为数据包中的数据类型还是json,但是下面的数据是xml。当这个数据包发送到对方服务器之后,服务器会以json的格式去解析数据,那这肯定是不行的。所以我们把数据类型那里改成xml即可
XXE黑盒发现:
1、获取得到Content-Type或数据类型为xml时,尝试进行xml语言payload进行测试
2、不管获取的Content-Type类型或数据传输类型,均可尝试修改后提交测试xxe
流程:功能分析-前端提交-源码&抓包-构造Paylod测试
#XML&XXE-白盒-CMS&PHPSHE&无回显审计
首先我们应该知道一点,在进行xxe漏洞挖掘的时候应该针对的是根据函数去找漏洞,不是根据功能点去找漏洞,这是和其他漏洞不一样的地方,其他漏洞比如文件上传,我们肯定是看哪里有文件上传功能的地方找漏洞,但这个xml是用来传输数据的,这个功能点太多了,所以我们应该根据函数去找漏洞。
我们可以直接在网上搜php相关的xml解析函数,然后去源码中全局搜索即可。
本案例审计流程:
1、漏洞函数simplexml_load_string
2、pe_getxml函数调用了漏洞函数
3、wechat_getxml调用了pe_getxml
4、notify_url调用了wechat_getxml
访问notify_url文件触发wechat_getxml函数,构造Paylod测试
这里先尝试读取文件,发现没有回显,然后进行带外测试看它有没有漏洞,发现有漏洞,只是访问notify_url这个文件的输出结果被写死了,只能输出它设定好的那个,所以就是没有回显,我们就可以按照刚才的方法解决无回显。
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