在第一届爱奇艺安全沙龙上, lijiejie分享了内部代理扫描服务, 本篇介绍代理扫描的实现细节。

为什么需要代理扫描

互联网公司项目迭代更新快、上线接口多,安全测试人员常常难于及时地跟进。然而,产品上线之前,却一定会对接口的可用性、有效性进行必要的验证。

  1. 代理扫描将质量测试与安全测试结合起来

  2. 减轻安全同事的测试负担, 将重点放在一些逻辑问题的发现上

  3. 代理扫描可以集成到SDL流程, 有助于推广代码白盒扫描

框架图

代理扫描服务分成代理和扫描两个部分。

代理部分需要保证访问的实时性,不能延迟太高。

扫描部分需要保证结果的准确性,降低系统侵入性。

另一个获取全部URL的方式是解析镜像流量, 但这种方式:

  1. 获取、存储、解析流量非常消耗资源

  2. 不利于细粒度的控制,不便对SDL项目进行支持

综上,我们使用了mitmproxy这一成熟的框架。

mitmproxy的接口,可以参考官方scripting文档:  mitmproxy 在 defhandle_response(self,flow): 这个方法中, 获取想要的参数字段, 包括但是不限于: url, requestheader, requestparam, status_code, reponse等 或者参考猪猪侠的wyproxy: 在/utils/parser.py 这个目录下,修改 parser_data函数的内容,并push到redis中。

我们选择了直接存入redis, redis是线程安全的,不用担心锁的问题。以项目作为queue, 保证项目中间的测试不冲突

扫描

扫描目前主要是移植了awvs,包括TURL, HTTPJOB等。

插件加载方式和lijiejie的PPT中所讲的一致, 只要写同名的函数如do_scan即可。

重要的是如何快速的增加插件,提高扫描效率,类似巡风或者bugscan这类框架,只需要传入特定的参数,返回固定格式的结果,而不用考虑数据库的读写。

一些思考

在公司内部推广代理扫描时,可能出现

不同的项目中,特别是测试团队的同事, 对不同的测试地址会配置不同的Host,所以必须支持配置绑定Host

这导致

配置后可能会出现 Hosts冲突,即同一域名配置到不同的ip地址上

扫描节点无法准确识别出特定场景下某一个域名所对应的IP。因此,我们将上边的结构改成以docker作为某一个项目的扫描节点, 这样即解决了可能的hosts冲突,也能利用docker易于扩展和部署的优势。结构如下

总结

上面是自己开发过程中的一些总结,欢迎大家一起交流进步。

参考

  1. 爱奇艺安全沙龙: https://github.com/71src/iqiyi_security_conference_2018

  2. mitmproxy: https://mitmproxy.readthedocs.io/en/v0.17/scripting/mitmproxy.html

  3. wyproxy: https://github.com/ring04h/wyproxy

  4. 对awvs的一次简单分析: http://blog.wils0n.cn/archives/145/

作者:jiaxiaoyan

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