2019年 第10篇
本文共5286字 预计阅读时间14分钟
前言
如何实现安全漏洞的自动化检测?相信这是众多IT人员共同关心的话题。这背后有几大驱动力:从安全角度看,专业渗透测试人员的增长跟不上安全测试需求的增长速度,况且上线前后要测,后续发版前后都要重新来一遍,枯燥无味;从测试角度看,为什么安全测试不能跟功能测试或者性能测试一样提前准备好测试用例?开发完成后一条命令通过脚本自动化执行完并输出报告;从开发角度看,现在搞敏捷,运维和开发已经逐步融合了,测试为什么不能?特别是安全测试还需要手工检测更耗费时间,严重影响发版效率。
诚然,安全测试有它的特殊性和专业性,目前还不能实现完全自动化的漏洞检测,但出于自身安全建设的需要,中通安全团队正在开发流水线的不同环节积极探索局部的可行方案,在半自动化的越权漏洞检测方面已有相关实践和应用,虽然在覆盖率方面仍然有改进空间,但确实能极大提高人工安全测试的效率,故利用此文分享和开源,对于全自动化的越权漏洞检测方案在文末展望部分简述,待内部落地后将在开源项目中提供升级版本。
越权漏洞概念
在安全测试中我们经常会遇到各类逻辑漏洞,而越权漏洞是逻辑漏洞中一种很常见的安全漏洞。在OWASP TOP10中,越权漏洞更是长期榜上有名,一方面是因为越权造成的危害一般都比较大,例如越权获取敏感信息、越权删除他人订单、越权添加管理账号等;另一方面,也是因为越权漏洞比较难以全面的检测。
越权漏洞的检测
我们知道,服务端接收的每个请求都会有它自己对应的一个身份,而这个身份会在请求中的某个地方进行一定的标识,例如cookie、token、jwt等。越权行为可以认为是用一种身份标识去请求获得非其拥有的权限,若生效,则说明该请求存在越权问题。
而目前,针对越权漏洞常见的检测方式大致如下:
水平越权
通过更换请求中的某个ID之类的身份标识,从而使A账号获取(修改、删除等)B账号数据。
垂直越权
使用低权限身份的账号,发送高权限账号才能有的请求,获得其高权限的操作。
未授权访问
通过删除请求中的认证信息后重放该请求,依旧可以访问或者完成操作。
为了能够快速地进行越权漏洞检测,我们开发了一款半自动化的工具来辅助,下面介绍这款工具的设计思路。
系统认证
目前各类系统认证实现的方式和协议都存在很大的差异,但是从安全测试的角度实现自动化系统认证还是有很多种方案的,常见的方案有:
手动录入认证信息
在人工登陆待测系统后,直接获取认证后的认证信息,例如token等信息,然后将认证信息录入越权检测系统。
手动登录
在安全测试前,通过在越权检测工具内模拟在待测站点的登陆界面登录,使用越权检测工具记录整个登录流程中的认证信息进行登录。
自动登录
随着统一认证架构的普及,为自动登录提供了非常有利的条件。在中通内部几乎所有系统均使用统一认证进行安全接入,这时可以直接将越权检查工具接入统一认证体系就可以实现自动登录,另外在不同的认证体系中,对于应用间存在隔离的体系,还需要对其开放特定的支持跨应用的权限。而如果在缺少统一认证体系,每个系统的账号体系及登录流程都不同的环境中,想要实现自动登录需要为每个系统准备一套登录流程,在面对大量不同认证方式的系统时,就难以实现通用性。
流量获取
在未接入公司统一权限管理系统的时,想要获取系统的全部权限,通常的做法是对系统的全部功能进行验证然后获取功能验证的流量。而抓取功能验证的流量,通常有如下几种解决可选方案:
使用无界面浏览器对站点进行动态的爬取
虽然从WEB2.0开始,前端框架的使用以及JS的混淆导致了主动爬取站点的复杂度增加了,但是可以使用无界面浏览器对站点进行动态的爬取,这个方案的具体实现思路可参考猪猪侠在先知白帽大会分享的WEB2.0启发式爬虫实战,详细可以见文末参考链接,这里就不再赘述了。
通过流量网关,获取测试/生产中所有的流量
在有流量网关的情况下,可以直接从流量网关抓取流量。依赖于流量网关,对于需要测试的目标系统,可直接从流量网关中筛选出目标的请求即可。但是此方案存在一定的局限性,还是需要对系统的全部功能进行触发,若获取到的请求数量不足,就难以覆盖到整个系统。
通过代理或插件等形式,被动的获取流量
通过在测试人员的浏览器中安装插件并配置好测试系统相关信息后,在测试人员手动点击待测功能,就可以通过插件或代理服务器等方式收集到待测流量。中通的分布式被动扫描系统就是基于此方式实现流量的抓取,详细介绍可以查看中通安全文章分享中通分布式被动安全扫描实践。
越权判断
无论是垂直越权还是水平越权,我们想要的实际是以某个身份发送不属于该身份的请求。通过上述的第一步可以得到不同身份下的认证信息,第二步中得到该站点下待测的请求,但是还缺少这些请求与权限策略的对应关系。在这一步里,根据请求抓取方式的不同,可以考虑不同的判断依据:
使用无界面浏览器对站点进行动态的爬取
对于垂直越权,若可以成功抓取到请求,只需要再对不同身份下的请求做个减法便可以得到不属于该身份的请求。但是对于一些公共接口还是需要通过手动判断或者通过关键字白名单的方式进行过滤。
对于水平越权,相对于垂直越权来说较难以判断。对于一些简单的站点可以根据表单中的禁止编辑属性以及隐藏表单等属性来得到判断依据,但是对于复杂的前端框架,还未找到比较好的方法,如果有较好的方法还希望可以分享和指教。
通过流量网关,获取测试/生产中所有的流量
通过流量网关获取到的流量只是单纯的流量,还需要对获取到每个请求进行进一步的处理后重放,例如修改认证信息等,通过对比重放前后的返回信息内容进行判断是否存在越权。
通过代理或插件等形式,被动的获取流量
在此方案中,流量的来源就是在测试系统点击界面时交互所获取到的,所以可以直接通过测试人员的对返回信息的对比进行判断是否存在越权问题。
工作流程
工作空间配置流程
准备测试时,需要为待测系统创建工作空间,对于接入统一认证的系统可考虑实现自动认证,不方便实现自动认证的系统可通过手动录入认证信息来实现系统认证。
图1 工作空间配置流程
测试流程
测试时需要通过插件等形式捕获流量,同时为了标识测试人员身份,需要对测试人员进行身份认证,如图2所示。
图2 测试流程
系统架构
系统整体架构如图3所示,主要包括身份认证API、流量传输装置、工作空间、扫描任务和结果展示五部分。
图3 系统架构
身份认证API
通过身份认证API可以返回当前用户的唯一标识,在接收测试人员传来的流量时通过该标识确定测试人员身份。
流量传输装置
流量传输装置负责将测试人员的请求传送至越权检测的服务器中,可以通过多种方式,例如burp插件、浏览器插件、代理服务器等。
工作空间
待测系统的一些基础信息会存放在工作空间中,比如待测系统的名称、所属部门等。同时也可以与其他系统相关联,如我们在使用时会关联到具体的安全测试申请单。此外,待测系统的一些配置信息也会放在工作空间中,如待测系统的认证方式、测试地址、待使用的测试账号等。
扫描任务
系统启动时,会开启一个线程池,消费redis队列中的扫描任务。根据请求包中的host及其所属人经过一定的筛选后流入与之匹配的工作空间。根据工作空间的配置开启不同的处理流程。
结果展示
扫描后的结果会存入对应的工作空间中,展示时会将可能存在问题的请求高亮,测试人员可实时监听每个请求的扫描结果,并根据需要进行筛选、过滤和重放等操作。
效果演示
测试前需要对工作空间进行配置,这里以接入统一认证的系统作为演示。
图4 工作空间配置
配置完成后,即可开始测试,实时观察测试流量。并根据需要进行数据包比对及请求重放。
图5 测试过程
图6 数据包比对
图7 请求重放
参考资料:
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,中通快递信息安全工程师,主要负责日常的风险评估和安全测试工作。
欢迎加入中通SRC文章交流群
跟作者零距离交流
(若二维码失效,请添加中通SRC运营微信:Sunandcc1022)
关注我们,后台留言你感兴趣的内容, 后续文章提供更多精彩
团队介绍
中通信息安全团队是一个年轻、向上、踏实以及为梦想而奋斗的大家庭,我们的目标是构建一个基于海量数据的全自动信息安全智能感知响应系统及管理运营平台。我们致力于支撑中通快递集团生态链全线业务(快递、快运、电商、传媒、金融、航空等)的安全发展。我们的技术路线紧跟业界发展,从大前端到云原生、从大数据到机器学习、从DevSecOps到零信任安全架构都有涵盖。全球日均件量最大快递公司的数据规模也将是一个非常大的挑战。我们关注的方向除了国内一线互联网公司外,也关注 Google、Facebook、Amazon 等在基础安全、数据安全方面的实践。
加入我们
如果您对我们的团队或者我们做的事有兴趣,也希望在工程技术领域有所成就,非常欢迎加入我们,我们需要信息安全、分布式平台开发、大数据、风控、产品、运营等方面的人才,Base上海,工作地点任选虹桥万科中心及中通总部。简历投递地址:security@zto.com。