本文作者:李勤,雷锋网网络安全专栏作者,安全圈大姐姐,入错行的八卦爱好者。该文大部分内容为Gr36_的演讲内容,经过Gr36_本人确认。该文首发于雷锋网宅客频道(微信id:letshome),欢迎关注公号和大姐姐一起畅聊网络安全哟!
Gr36_,男,阿里云云盾先知平台白帽子贡献排行榜排名第一的白帽子。
从 2016 年开始,Gr36 在先知平台活跃,也在国内其他众测平台“挖洞”。他对自己身份的定义是“众测玩家”。虽然 Gr36 在先知平台已经累计拿到 285950 元的奖金,他表示,赚取额外收入只是他成为众测玩家的原因之一,他在三年前接触众测,像玩游戏一样,爱上了这项“劳动”,有乐趣,还能交到好朋友,一起提升技能。
Gr36_认为,众测多方共赢的模式可以改变很多人的生活。
《葵花宝典》伤身,挖洞秘籍有益。
3月24日,Gr36 在 2017 先知白帽大会上,就传授了这种有益身心的挖洞宝典。以下为 Gr36 的秘籍实录,雷锋网在不修改原意的基础上略有修订和删节,PPT 截图为 Gr36_ 授权雷锋网发布。
[Gr36_ 在 2017 先知白帽大会上]
我们都知道打仗时搜集情报是重中之重,安全测试中前期的信息搜集工作也是关系着整个项目成败的关键因素。
众测时拿到一个给定的测试范围,比如,一个主域名,获取到的各种信息越多,拓展出去的测试范围越广,能挖到高危漏洞的概率也越大。有一些做常规信息搜集的手段,如,IP端口扫描、子域名的爆破。但是,我要介绍一些平常容易被忽略的信息。
时下,微信已经成为全新的社交方式,大大小小的公司也开始运营自己微信公众号,很多公司采用第三方微信公众平台,有的自己研发微商城、微官网这样的系统。
这样的系统往往存在问题,如果遇到的测试背景是第三方微信公众平台,需要多花一些精力,这样会得到比较好的效果。通过微信公众号的搜索功能,直接搜索到测试目标微信公众平台的测试程序,我发现了很多安全漏洞。
公司系统经过长久的测试与开发,安全系数越来越高,我们挖到安全漏洞的难度也越来越大。相对而言,APP 作为最近几年才兴起的新鲜事物,很多公司在该领域的安全投入稍微欠缺,APP 也很容易成为测试过程中的突破口,因为可能用同样的业务逻辑,APP 有可能也存在安全问题。
这是WEB系统的密码找回最后一步的流程,整个流程在找回输入注册时候预留的邮箱,系统会将密码找回的链接,输入了密码以后抓包,就可以来到这一步,正常而言,KEY 的参数应该是随机生成的,但当时测试几次后发现KEY是不变的,那么 KEY 会不会是和用户身份相关的标识呢?能够从系统中找到用户的ID和KEY的对应关系,就可以重置任意一个用户的密码,但是我在整个系统中都没有找到相关踪迹,这时我把眼光投向了移动 APP ,果不其然,我在移动 APP 登录请求发现了一些蛛丝马迹,经过比对和之前密码找回的 KEY是一样的,把这两个请求组合起来就能做到——知道用户名就可重置任意用户的密码了!
先看一个命令执行漏洞的案例。这个漏洞的奇葩之处不在于漏洞本身的利用方式有多复杂,就是一个稀疏平常的,由于拼接 os 命令造成的命令执行,关键的地方在于这个子域名是如何发现的。像这种多级子域名,光靠字典爆破是很难跑出来的,这里就是用 passive dns 数据获取到子域名数据。
通俗而言,passive dns 就是 dns 解析记录的历史数据。国内外都有提高 dns 解析历史数据的网站,利用这些网站提供的查询功能或 api ,可以获取到很多利用暴力猜解没办法获取到的子域名数据。
我有一个非常深刻的感受:漏洞从来不单独出现,某个系统出现了某种类型的漏洞,说明负责开发这个系统的程序员的安全意识不强,安全编码不规范,有非常大的概率,在系统中还隐藏着没有被我们找到的漏洞。最好的例子是,前段时间肆虐各大网站的 strusts 2 命令执行漏洞,大家可以猜一下 st2 命令执行漏洞的编号会达到多少?所以,历史漏洞在众测中可以给我们提供很多参考。通过漏洞平台的历史漏洞数据,能得到很多的启示和参考。
我认为,挖洞是一项非常需要想象力的活动,在测试的过程中应该多考虑一些特殊的情景,多开脑洞。
双编码注入和宽字节注入,这两种在 PHP 源代码审计中比较的常见,但是按照经验,众测过程中,在黑盒时也可以碰到这种非常规注入,测试注入时如果只是用单引号、双引号做测试,这两种特殊的注入就跟你无缘了。
排序注入,为什么要把排序注入单独拿出来说?对大多数的程序员而言,参数化查询、预编译处理可以解决绝大部分注入处理,但是,排序注入比较特殊,预编译处理对它无效,这种注入特别容易成为漏网之鱼。
在系统中只要输入单引号系统就会返回一个空,这种情形应该不存在注入,但是,这里是不是存在全局过滤机制?遇到单引号或者是其他的特殊字符系统就返回空?我把请求变成 POST 请求,经过这样的变换,发现这个系统是可以注入的,用这种方式可以绕过程序全局的过滤。
细节决定成败,在测试过程中不仅要胆大而且要心细,多注意一些细枝末节,有时,会有一些比较意外的发现。我有个比较良好的习惯,喜欢察看网页的源代码。
上述案例中,我当时是以普通用户权限登录到系统中,察看网页源码中发现有一堆注释,注释包含着一些链接,这些链接看上去是管理员功能的链接,最后这个链接普通用户也可以访问,这是属于垂直权限的越权漏洞。
类似的 JS 源码也是隐藏着一些看不到的信息,这些信息往往可以往往可以打开测试的局面,我当时在测试过程中遇到后台系统,这个系统没有帐号,经过暴力破解也没有成功进入系统中,这时我去查阅系统加载的 JS 文件,其中一个文件中发现这样一个函数,看上去应该是注册函数,根据里面的逻辑拼接成一个请求,最后发现利用这个请求确实能够注册一个后台系统的帐号密码,然后就可以进一步登录后台系统进行测试。
奇葩的支付漏洞,电商网站选购完商品最后一步进行结算支付,当时选择的支付方式是网银在线,这个请求输入一个订单号,系统会返回一个表单,最终会拼接成网银在线的最终支付链接,如果不仔细看可能就不会发现里面多了一点东西。看 KEY参数,在一般支付宝或者是网银支付链接里,肯定有一个参数校验的过程,为了防止用户篡改支付过程的金额和订单号会做参数交验, KEY 会不会就是参数交验过程中遇到的密钥?当时我找到网银在线的文档,经过仔细研究,猜想 KEY 可能是参数交验所需要的密钥,根据规则结合前面的 KEY ,自己手动构造一个算参数交验,自己算出来的数值和系统反馈回来的数值一样,印证了我的猜想是正确的,我就可以结合这个规则和 KEY 构造出任意金额的支付链接,而且可以保证支付链接完完全全合法有效,所以,这可以算是真真正正的任意金额支付漏洞。
测试过程中要有挖高危漏洞的心,如果是挖到低危或者是中危漏洞也要想方设法把它变成高危的漏洞。
某次测试中找到某个系统存在 PHP 文件包含漏洞,经过测试发现这个系统没有任何上传点,文件包含是本地文件包含,意味着无法通过上传或者是远程文件包含拿到 web shell ,这时通过文件包含漏洞继续读系统源代码,最后在某一个文件中发现了这么一行代码,这行代码意味着可以控制 session 变量,PHP的 session 保存服务器某个固定的路径下,而且文件名是固定的前缀加上 session ID,路径可以知道,session 的变量也可以控制,可以通过这个页面往 session 文件里写一句话,最终通过包含session文件的方式获取到web shell。
论坛程序,在众测的过程中遇到很多,对于这种程序大家都有自己的方法,有些是用社工管理员的帐号,或者是利用历史漏洞去入手,自带统一管理的程序。
如果仔细看过漏洞详情,就会知道 UC 有很多的 API 设计非常不安全,利用 API 爆破 UC 创始人的密码,这个爆破不受验证码请求次数的研制,爆破创始人密码可以登录 UC 的后台,相当于可以获得论坛至高无上的权限,我在众测过程中发现很多厂商对这里有一些加固,可能会做访问的限制,比如,针对源 IP 的限制,出现这种情况可以回到这里,在拿到创始人密码情况下,可以获得论坛对应的 uc key,可以结合之前UC 的漏洞进行选项,还可以进行注入,注入写本地的中转脚本,可以利用自动化工具完成。
很多白帽子在众测的时候都用自己的专属的工具包,有些是自己定制化开发的工具,我平常使用比较多的是一款基于被动式的扫描工具,在这种被动式扫描工具出现之前,也有大牛开源了一款工具,但是要经过注入检测,我推荐的这款适用范围更广一些,技术差不多也是利用现成的轮子组合,技术含量不是很高,主要是分享一些思路。
程序搭载的流程,访问代理服务器可以抓取用户所有的请求流量,可以对流量进行存储,后端的扫描程序再对流量进行安全检测。
程序分三部分,对于 host 字段网站的域名和 IP ,会进行端口服务的识别,根据服务识别的结果再系统自动匹配调用相关的漏洞扫描的插件。系统扫描结果发现目标完善运行一个服务,自动从系统中调用爆破之类的检测脚本检测,url 会进行外部指纹的识别,识别目标网站使用中间件,系统会自动调用一些反序列化弱密码的爆破之后进行检测。对于动态页面,会调用文件包含之类的常规的外部扫描的插件进行检测。完整的流程走下来可以省去很多烦琐重复性的劳动,也可以提高扫描的效率,提高漏洞发现的准确度,达到事半功倍的效果。
用到两个框架,Tornado、Twisted,意味着在资源比较少的情况下,单机情况下都可以获得比较不错的扫描效率。