欢迎关注:07v8论安全,技术干货等你来
这是07v8的第16篇技术文章,希望对你有用
分享xxe文件读取案例
作者:@Hanmeimei
* 本文参与双dan投稿活动
XXE漏洞全称XML External Entity Injection即xml外部实体注入漏洞,XXE漏洞发生在应用程序解析XML输入时,没有禁止外部实体的加载,导致可加载恶意外部文件,造成文件读取、命令执行、内网端口扫描、攻击内网网站、发起dos攻击等危害。
xxe漏洞触发的点往往是可以上传xml文件的位置,没有对上传的xml文件进行过滤,导致可上传恶意xml文件。
判断
1.检测xml是否会被解析
&test;
返回test,进行第二步
2.是否支持外部实体
%test;
]>
目标服务器是否向你所设置服务器发送请求,如果以上两点都存在的情况下,服务器没有回显可以进行blind xxe。
1. xxe(基于回显和报错)
攻击者只有在服务器有回显或者报错的基础上才能使用XXE漏洞来读取服务器端文件。
观察上面的请求与响应,我们可以看到,应用程序正在解析XML内容,接受特定的输入,然后将其呈现给用户。
为了测试验证XML解析器确实正在解析和执行我们自定义的XML内容,我们发送如下的请求:
我们在上面的请求中定义了一个名为entityes、值为’testing’的实体。 响应报文清晰地展示了解析器已经解析了我们发送的XML实体,然后并将实体内容呈现出来了。
由此,我们可以确认,这个应用程序存在XXE漏洞。
2.blind xxe
如果服务器没有回显,可以使用Blind XXE漏洞来构建一条带外通道提取数据。
为了避免不同xml解析器解析时产生的问题,采用嵌套的方式,且由于某些解析器无法在内层实体直接使用外部链接,所以首先由本地服务器首先读取构造好的xml文件,在远程服务端执行请求本服务器的请求,进而读取到本地服务端的的xml内容,造成远程文件读取。
Xml文件
本地服务端存放源码文件
%remote;
%all;
]>
&send;
在远程服务端发送请求
实体remote,all,send的引用顺序很重要,首先对remote引用目的是将外部文件evil.xml引入到解释上下文中,然后执行%all,这时会检测到send实体,在root节点中引用send,就可以成功实现数据转发。
当然,也直接在DTD中引用send实体,如果在evil.xml中,send是个参数实体的话,即以下方式:
%remote;
%all;
%send;
]>
案例(基于回显)
下书任意文件读取案例部分(基于回显):
1. 某次渗透测试中,提交登录请求发现是通过xml传值
2.于是在头部添加参数进行测试,发现没有成功。
防御
1.检查所使用的底层xml解析库,默认禁止外部实体的解析
2.使用第三方应用代码及时升级补丁
3.同时增强对系统的监控,防止此问题被人利用
对于PHP,由于simplexml_load_string函数的XML解析问题出在libxml库上,所以加载实体前可以调用这样一个函数
附录
测试存在回显xxe站地址:
http://testhtml5.vulnweb.com/
Blind xxe案例:
xml实体:
内容占位符,用于内容转义,代表一些重复的或无法通过键盘输入或与xml 规范保留字符相冲突的字符数据,有点似类于 c# 中的转义字符。
使用实体之前,必需先声时,声明语句位于xml文档的序言的内部子集中,实体声明必需使用大写方式,如: ,ENTITY必需是大写的。使用实本时,在实体名称前面加上 & ,并表在后面加上分号: ;。
07v8 Double-S说
本文作者在文中详细阐述了什么是xxe,同时给予案例供大家学习,希望大家会有所收获!
同时感谢作者Hanmeimei的分享,以及对07V8的支持,请继续关注!
更多干货,敬请关注
领取专属 10元无门槛券
私享最新 技术干货