在本节中,将解释如何寻找不大明显的XXE漏洞的攻击面,有些可能并非在XML请求中。
XInclude攻击
一些应用程序接收客户端提交的数据,在服务器端将其嵌入到XML文档中,然后解析该文档。
当客户端提交的数据被放入后端SOAP请求中时,就会出现这种情况的一个示例,该请求随后由后端SOAP服务器处理。
在这种情况下,因为无法控制整个XML文档,我们无法通过定义或修改DOCTYPE元素来进行经典的XXE攻击。
但是,也许可以改用XInclude,XInclude是XML规范的一部分,它允许从子文档构建XML文档。我们可以在XML文档中任何数据值中防止XInclude攻击,因此可以在仅控制放置在服务器端XML文档中单个数据项的情况下执行攻击。
要执行XInclude攻击,需要引用XInclude命名空间并提供希望包含的文件路径,例如:
场景试验-利用XInclude检索文件:
https://portswigger.net/web-security/xxe/lab-xinclude-attack
场景说明:
这个试验场景具有“检查库存”功能,这个功能将用户的输入嵌入到随后在服务器端解析的XML文档中。因为无法控制整个XML文档,所以无法定义DTD来发起经典的XXE攻击。
试验目的:
要完成这个试验,需要注入XInclude语句来检索/etc/passwd文件的内容。
攻击过程:
①打开商品后查询下库存,将这个请求发送给Repeater,可以看到这里没有在请求中直接提交XML格式文档了
②将"productId"后面的参数设置为如下语句:
<foo xmlns:xi="http://www.w3.org/2001/XInclude">
<xi:include parse="text" href="file:///etc/passwd"/>
</foo>
③发送请求后,可以得到泄露文件的响应,完成试验
通过文件上传进行XXE攻击
一些应用程序允许用户上传文件,然后在服务器端进行处理。一些常见的文件格式使用XML或包含XML子组件。
基于XML格式的示例有DOCX等办公文档格式和SVG等图像格式。
例如,应用程序可能允许用户上传图像,并在上传后在服务器上处理或验证这些图像。即使应用程序希望接收对象是PNG或JPEG这样格式的,但正在使用的图像处理库也可能支持SVG图像。由于SVG格式使用XML,攻击者可以提交恶意SVG图像,从而达到XXE漏洞的隐藏攻击面。
场景试验-利用图像文件上传进行XXE攻击:
https://portswigger.net/web-security/xxe/lab-xxe-via-file-upload
场景说明:
这个试验场景允许用户将头像附加到评论中,并使用Apache Batik库来处理头像图像文件。
试验目的:
要完成这个试验,需要上传一张照片,显示处理后的/etc/hostname文件的内容,然后将主机名进行提交。
攻击过程:
①先在本地创建一个SVG类型的文件,文件中直接放入下列代码即可:
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="300" version="1.1" height="200">
<image xlink:href="expect://ls" width="200" height="200"></image>
</svg>
②在微博提交评论的地方,有个上传头像的地方,把这个图像文件上传上去并提交评论,如果被阻拦说格式不对的话,检查下后缀是否修改成.svg
③随后刷新下评论,可以看到头像这里有个图片,点击放大图片,就可以看到hostname了,将这个字符串提交即可完成试验
通过修改内容的类型进行XXE攻击
大多数POST请求使用由HTML表单生成的默认内容类型,例如application/x-www-form-urlencoded。
一些网站希望接收这种格式的请求,但会容忍其他内容类型,包括XML。
例如,如果一个正常的请求包含下面内容:
然后我们可以提交以下请求,结果相同:
如果应用程序接受消息正文中包含XML请求,并将正文内容解析为XML,那么我们只需将请求重新修改XML格式,就可以达到隐藏的XXE攻击面。
SQL注入攻击-检索隐藏的数据
HTTP Host头漏洞攻击-概念梳理
原文始发于微信公众号(H君网安白话):XML外部实体(XXE)注入-寻找隐藏攻击面
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论