1、背景介绍

前言

如何实现安全漏洞的自动化检测?相信这是众多IT人员共同关心的话题。这背后有几大驱动力:从安全角度看,专业渗透测试人员的增长跟不上安全测试需求的增长速度,况且上线前后要测,后续发版前后都要重新来一遍,枯燥无味;从测试角度看,为什么安全测试不能跟功能测试或者性能测试一样提前准备好测试用例?开发完成后一条命令通过脚本自动化执行完并输出报告;从开发角度看,现在搞敏捷,运维和开发已经逐步融合了,测试为什么不能?特别是安全测试还需要手工检测更耗费时间,严重影响发版效率。

诚然,安全测试有它的特殊性和专业性,目前还不能实现完全自动化的漏洞检测,但出于自身安全建设的需要,中通安全团队正在开发流水线的不同环节积极探索局部的可行方案,在半自动化的越权漏洞检测方面已有相关实践和应用,虽然在覆盖率方面仍然有改进空间,但确实能极大提高人工安全测试的效率,故利用此文分享和开源,对于全自动化的越权漏洞检测方案在文末展望部分简述,待内部落地后将在开源项目中提供升级版本。

越权漏洞概念

在安全测试中我们经常会遇到各类逻辑漏洞,而越权漏洞是逻辑漏洞中一种很常见的安全漏洞。在OWASP TOP10中,越权漏洞更是长期榜上有名,一方面是因为越权造成的危害一般都比较大,例如越权获取敏感信息、越权删除他人订单、越权添加管理账号等;另一方面,也是因为越权漏洞比较难以全面的检测。

越权漏洞的检测

我们知道,服务端接收的每个请求都会有它自己对应的一个身份,而这个身份会在请求中的某个地方进行一定的标识,例如cookie、token、jwt等。越权行为可以认为是用一种身份标识去请求获得非其拥有的权限,若生效,则说明该请求存在越权问题。

而目前,针对越权漏洞常见的检测方式大致如下:

  • 水平越权

通过更换请求中的某个ID之类的身份标识,从而使A账号获取(修改、删除等)B账号数据。

  • 垂直越权

使用低权限身份的账号,发送高权限账号才能有的请求,获得其高权限的操作。

  • 未授权访问

通过删除请求中的认证信息后重放该请求,依旧可以访问或者完成操作。

为了能够快速地进行越权漏洞检测,我们开发了一款半自动化的工具来辅助,下面介绍这款工具的设计思路。

2、设计思路

为了实现越权漏洞的检测,我们将整个越权漏洞的检测分为三个步骤:系统认证、流量获取、越权判断,通过尽可能地对这三步进行自动化以达到辅助检测越权漏洞的功能。

系统认证

目前各类系统认证实现的方式和协议都存在很大的差异,但是从安全测试的角度实现自动化系统认证还是有很多种方案的,常见的方案有:

  • 手动录入认证信息

在人工登陆待测系统后,直接获取认证后的认证信息,例如token等信息,然后将认证信息录入越权检测系统。

  • 手动登录

在安全测试前,通过在越权检测工具内模拟在待测站点的登陆界面登录,使用越权检测工具记录整个登录流程中的认证信息进行登录。

  • 自动登录

随着统一认证架构的普及,为自动登录提供了非常有利的条件。在中通内部几乎所有系统均使用统一认证进行安全接入,这时可以直接将越权检查工具接入统一认证体系就可以实现自动登录,另外在不同的认证体系中,对于应用间存在隔离的体系,还需要对其开放特定的支持跨应用的权限。而如果在缺少统一认证体系,每个系统的账号体系及登录流程都不同的环境中,想要实现自动登录需要为每个系统准备一套登录流程,在面对大量不同认证方式的系统时,就难以实现通用性。

流量获取

在未接入公司统一权限管理系统的时,想要获取系统的全部权限,通常的做法是对系统的全部功能进行验证然后获取功能验证的流量。而抓取功能验证的流量,通常有如下几种解决可选方案:

  • 使用无界面浏览器对站点进行动态的爬取

虽然从WEB2.0开始,前端框架的使用以及JS的混淆导致了主动爬取站点的复杂度增加了,但是可以使用无界面浏览器对站点进行动态的爬取,这个方案的具体实现思路可参考猪猪侠在先知白帽大会分享的WEB2.0启发式爬虫实战,详细可以见文末参考链接,这里就不再赘述了。

  • 通过流量网关,获取测试/生产中所有的流量

在有流量网关的情况下,可以直接从流量网关抓取流量。依赖于流量网关,对于需要测试的目标系统,可直接从流量网关中筛选出目标的请求即可。但是此方案存在一定的局限性,还是需要对系统的全部功能进行触发,若获取到的请求数量不足,就难以覆盖到整个系统。

  • 通过代理或插件等形式,被动的获取流量

通过在测试人员的浏览器中安装插件并配置好测试系统相关信息后,在测试人员手动点击待测功能,就可以通过插件或代理服务器等方式收集到待测流量。中通的分布式被动扫描系统就是基于此方式实现流量的抓取,详细介绍可以查看中通安全文章分享中通分布式被动安全扫描实践

越权判断

无论是垂直越权还是水平越权,我们想要的实际是以某个身份发送不属于该身份的请求。通过上述的第一步可以得到不同身份下的认证信息,第二步中得到该站点下待测的请求,但是还缺少这些请求与权限策略的对应关系。在这一步里,根据请求抓取方式的不同,可以考虑不同的判断依据:

  • 使用无界面浏览器对站点进行动态的爬取

对于垂直越权,若可以成功抓取到请求,只需要再对不同身份下的请求做个减法便可以得到不属于该身份的请求。但是对于一些公共接口还是需要通过手动判断或者通过关键字白名单的方式进行过滤。

对于水平越权,相对于垂直越权来说较难以判断。对于一些简单的站点可以根据表单中的禁止编辑属性以及隐藏表单等属性来得到判断依据,但是对于复杂的前端框架,还未找到比较好的方法,如果有较好的方法还希望可以分享和指教。

  • 通过流量网关,获取测试/生产中所有的流量

通过流量网关获取到的流量只是单纯的流量,还需要对获取到每个请求进行进一步的处理后重放,例如修改认证信息等,通过对比重放前后的返回信息内容进行判断是否存在越权。

  • 通过代理或插件等形式,被动的获取流量

在此方案中,流量的来源就是在测试系统点击界面时交互所获取到的,所以可以直接通过测试人员的对返回信息的对比进行判断是否存在越权问题。

3、工程实现

在实际的安全测试中,大多数的测试目标均为WEB系统,所以本次主要针对WEB系统实现一个半自动化的越权检测工具。通过上文对越权检测方案的设计思路,在系统认证和流量获取阶段都可以实现自动化,但是在越权判断阶段还是需要人工介入,但即使是半自动化的越权检测工具也极大地提高了安全测试的效率,所以我们决定将其实现为一个越权漏洞检测的辅助工具。

工作流程

  • 工作空间配置流程

准备测试时,需要为待测系统创建工作空间,对于接入统一认证的系统可考虑实现自动认证,不方便实现自动认证的系统可通过手动录入认证信息来实现系统认证。

图1 工作空间配置流程

  • 测试流程

测试时需要通过插件等形式捕获流量,同时为了标识测试人员身份,需要对测试人员进行身份认证,如图2所示。

图2 测试流程

系统架构

系统整体架构如图3所示,主要包括身份认证API、流量传输装置、工作空间、扫描任务和结果展示五部分。

图3 系统架构

  • 身份认证API

通过身份认证API可以返回当前用户的唯一标识,在接收测试人员传来的流量时通过该标识确定测试人员身份。

  • 流量传输装置

流量传输装置负责将测试人员的请求传送至越权检测的服务器中,可以通过多种方式,例如burp插件、浏览器插件、代理服务器等。

  • 工作空间

待测系统的一些基础信息会存放在工作空间中,比如待测系统的名称、所属部门等。同时也可以与其他系统相关联,如我们在使用时会关联到具体的安全测试申请单。此外,待测系统的一些配置信息也会放在工作空间中,如待测系统的认证方式、测试地址、待使用的测试账号等。

  • 扫描任务

系统启动时,会开启一个线程池,消费redis队列中的扫描任务。根据请求包中的host及其所属人经过一定的筛选后流入与之匹配的工作空间。根据工作空间的配置开启不同的处理流程。

  • 结果展示

扫描后的结果会存入对应的工作空间中,展示时会将可能存在问题的请求高亮,测试人员可实时监听每个请求的扫描结果,并根据需要进行筛选、过滤和重放等操作。

效果演示

测试前需要对工作空间进行配置,这里以接入统一认证的系统作为演示。

图4 工作空间配置

配置完成后,即可开始测试,实时观察测试流量。并根据需要进行数据包比对及请求重放。

图5 测试过程

图6 数据包比对

图7 请求重放

4、展望

在实际的越权漏洞检测过程中,想要完整地覆盖到整个系统并不是一件轻松的事,而稍有不慎遗漏的一个请求便可能放过了一个安全漏洞,埋下不可估量的安全风险,而目前我们实现的越权漏洞检测辅助工具相对来说还是比较“独立”的,没有侵入其他系统,类似于黑盒测试,从原理上看是无法做到全覆盖无差错的全自动化越权检测。要想做到这一点,从乙方的角度看我们认为是非常困难的,但是从甲方的角度来看,却是有可能的,下面我们提出一个在零信任安全架构下的全新思路,权且抛砖引玉。

首先我们来看,越权漏洞的本质是服务方没有正确地进行鉴权,如果能够准确无误地执行了鉴权的动作,那就不会存在越权漏洞。这里有一个前提就是合理的权限设定,判断是否正确地执行了鉴权,其实就是判断真实的响应结果是否和规划的权限设定里测试用例的预期结果是否一致,如果一致那就不存在越权漏洞,反之则存在,以上是整个方案的基础原理。

其次在工程上如何实现呢?要获取真实的响应结果和规划的权限设定,需要六个实体的参与:安全测试人员、检测应用、部署检测应用的设备、统一认证中心、统一权限中心、统一资源中心,关键点在于自动化地安全认证(安全测试人员登录检测应用的身份认证和检测应用作为独立身份与其它实体的应用间的认证)、自动化地获取被测系统包含的所有权限列表并授权(检测应用从统一权限中心拉取后以安全测试人员的身份请求权限中心进行逐一授权)、自动化地获取被测系统的所有对外服务及对应的包含预期结果的测试用例(服务及测试用例作为资源被自动化地解析到统一资源中心,检测应用从统一资源中心自动拉取),检测应用在通过相关认证和授权后可以自动化地按照拉取的服务列表执行对应的测试用例并进行判断,然后自动化地取消上一个授权获取下一个授权直到结束。

由于自动化授权的敏感性,可以由检测应用和部署检测应用的设备结合成网络代理并且由安全测试人员提供TOTP满足信任要求,另外测试用例要做到生产环境的无害性,这样也可以直接部署到生产环境进行定期自动化测试。接下来对部分细节作简要阐述,在传统开发模式中,系统规划的权限设定通常存在开发人员的大脑和服务的鉴权代码中,这样非常不利于上线前权限设计的合理性和正确性的评审以及上线后鉴权逻辑实现正确性的核查,也是越权漏洞频发的根因,我们需要在服务开发之初就文档化下来,包括服务的定义、安全测试用例及预期的结果,在开发实现方面,我们可以借助流行的IDL接口描述语言的一些特性,如protobuf的descriptor或option,IDL用来定义服务,其中的一些特性用来定义安全测试用例及预期的结果,结合起来可以支持非常复杂的场景,服务方面既可以提供RPC也可以提供RESTful形式,意味着既可以支持中台对外服务也可以支持对内的微服务(对内的微服务作为独立的身份实体),安全测试用例方面既可以支持行为、菜单等权限,也可以支持数据权限,整个的定义如proto文件需要自动化地解析到资源中心并且和应用标识关联起来。另外在统一权限中心的设计方面,我们需要将应用所有的权限集中配置和使用,并且做到配置项和服务的关联,这样可以实现任意权限模型的支持,如RBAC、ABAC等。

最后,有兴趣的朋友可以联系我们一起交流讨论或者加入我们的团队,一起打造包括自动化越权漏洞检测在内的零信任安全架构体系。

5、开源地址

中通安全团队本着开放共享和积极反哺开源社区的理念,我们决定对这款越权漏洞检测项目进行开源,并附带了一个简单的示例站点,欢迎大家参考或使用。开源地址为:https://github.com/ztosec/secscan-authcheck。

参考资料:

OWASP TOP10 :https://www.owasp.org/images/7/72/OWASP_Top_10-2017_(en).pdf.pdf

WEB2.0启发式爬虫实战:https://xzfile.aliyuncs.com/upload/zcon/2018/11_WEB2.0启发式爬虫实战_猪猪侠.pdf

作者简介

r00,中通快递信息安全工程师,主要负责日常的风险评估和安全测试工作。

声明:本文来自中通安全应急响应中心,版权归作者所有。文章内容仅代表作者独立观点,不代表安全内参立场,转载目的在于传递更多信息。如有侵权,请联系 anquanneican@163.com。