这是一件关于我参与Hackerone平台某漏洞邀请项目的事,在此我要感谢该项目发起公司,他们友善的态度、及时的漏洞修复和奖金发放效率,让所有存在的提交漏洞都能在7天之内有所处理解决,我个人非常荣幸能参与这样的漏洞众测项目。
我是一个漏洞挖掘小白,现阶段来说,奖金并不是我参与漏洞众测项目的主要原因,目前我在Hackerone上发现的漏洞已达85个,声誉值也超过2600多分并呈快速上升趋势。在Hackerone上,我有时一星期可收到4到5个邀请项目。大家知道,邀请项目对“漏洞赏金猎人”的提高非常重要,我个人就从这些邀请项目中学到了很多非训练平台上的实际挖掘漏洞经验,这非常能起到锻炼作用。
由于是私密性质的邀请项目,所以抱歉在下文中我提到的一些发现,并不代表对漏洞细节本身的公开披露,其仅只是方法介绍和总结,我总不能过河拆桥,还望大家理解。
介绍
在与项目发起公司进行接触联系之后,在朋友@Geekboy的引荐下我顺利入围参与了该项目。最终,我成功发现了目标范围站点多个RCE漏洞、SQL注入漏洞以及账户劫持漏洞,成果还算不错。
第一个RCE漏洞发现
针对一个子域名目标,我在用Dirb爆目录时发现了其.git目录,接着我用gitpillage深入探测时,又发现了很多有意思的文件:
server.conf,这足够说明问题的了,直接看源码,发现PHP环境是由Zend Studio 5.5 集成开发的:
接下来在源码分析中,我发现了多个对exec()的调用,运行机制用它来执行一些系统命令。深入分析该调用机制后,我又注意到其中一个调用的POST参数并未被过滤审核,其代码如下:
你猜怎么着,其中竟然可关联到一个远程代码执行漏洞(RCE)!
于是乎,我美滋滋地上报了这个漏洞。
漏洞一发不可收拾
几个星期之后,我又在目标站点上发现了一些CORS、CSRF、源码泄露和速率限制漏洞,而且其主站上竟然还存在一个SQL注入漏洞:
1个月后,我再次对上述发现漏洞进行了复现检测,它们确实已经被完美修复了。但我又在其它地方发现了3个RCE漏洞。其中一个RCE漏洞需要在输入中具备以下3个参数值:
该漏洞涉及脚本会把在路径下创建的文件内容进行写入操作,但….,这就是一个隐藏后门啊!
从一个RCE漏洞到另一个RCE漏洞
当我远程连接到测试目标站点之后,发现其服务中包含了 ImageMagick图片处理功能,所以,我理所应当地检查了其ImageMagick的版本:
可能大家都知道,ImageMagick在6.9.3-9之前的版本都存在包含RCE在内的多种漏洞,当然,幸运的是,该站点服务器也不可避免地沦陷了:
从Javascript文件中发现漏洞
之前,我看过@zseano发布的如何从Javascript文件中挖掘漏洞的视频后,我就尝试着自行编写了一些从源码中提取目标服务端和其它有用信息的小工具。因此,在这里,我把测试站点的所有JS文件进行了下载,然后用我的小工具进行了一番分析,在数百个服务端的闪现中,其中一个映入了我的眼帘:
/[REDACTED].php?[REDACTED]=[REDACTED]&template=[REDACTED].tpl
前端开发者们都明白,.tpl是用于HTML代码中的模块Template文件,它的文件名能作为参数使用吗?那么,我先来试试/etc/passwd值,一试不得了:
一开始,我认为这是一个本地文件包含漏洞(Local File Inclusion),所以我尝试用fimap、dotdotpwn或Kadimus等工具来把它提权为RCE漏洞,但由于不清楚该应用的具体路径,所以也就不能包含调用其它PHP文件。为保持漏洞的有效性,我及时提交了该漏洞。
但第二天,我看到漏洞还处于分类未修复状态时,我一下脑洞大开,Ding Dang,何不尝试一下包含调用该PHP服务端本身呢?就像这样:
/the_vulnerable_script.php?[REDACTED]=[REDACTED]&template=the_vulnerable_script.php
意想不到的是,我就这样得到了整个未解析执行的源码文件,所以,本质上来说,这就是一个本地文件泄露漏洞( Local File Disclosure)。
在对不同文件的挖刨之后,我找到了一些包含数据库凭据、API密钥和第三方服务信息的配置文件,另外,我还发现了一些启动加载文件(Autoload file),它包含了一些认证或文件加载信息,如下:
总之,我可以获取了目标站点上该项应用服务的所有源码,虽然不像RCE威胁巨大,但也足够说明问题,因为,我能通过工具把这些源码文件进行抓取:
在稍微地进行了一些验证之后,我就及时停止了深入测试,上报了漏洞。
综合利用
用上述发现的漏洞,结合该目标站点的其它应用,我在其中又发现了多个SQL注入漏洞,和4个XSS,以及以下这个账户劫持漏洞:
在该请求中,如果把我的email地址换成他人用户的email地址,就能用请求包中设置包含的密码,替换更改他人的账户密码,整个过程不需要任何验证机制。