这段时间一直在搞漏洞扫描方面相关的东西,之前也写过一些小的扫描器 demo,接触到挺多开源和商业版漏扫。简单念叨一些 web 扫描器相关的思路吧,也算做个记录。
注:本文只提供一些思路
其实 web 扫描器形式分很多种
1、主动扫描例如 AWVS、APPScan
2、被动扫描例如 Xray
3、还有一些一把梭的插件类型扫描器,包括资产域名自动收集,指纹识别,POC 扫描等
4、IAST 插桩也是挺好的一种方式
可能按照不同角度会有不同的区分类型吧,这几种类型的基本也都写过一些。其实无论哪种方式,最核心的还是要拿到流量才能往下走。
参数解析
为什么先说参数解析呢,因为后面的很多模块都会依赖这里。参数解析的是否完整,对扫描结果影响还是比较大的。
无论是 GET还 是 POST,先把参数的 raw 拿回来,最后封装回去就好
先看常见的格式
id=1&name=bey0nd
{“id”:1,”name”:”bey0nd”}
这两种是最简单的,格式较为统一,urlencode 或 json 格式,只需要判断并解析一下,然后加入 payload 的 flag
id=1__PAYLOAD__FLAG__&name=bey0nd__PAYLOAD__FLAG__
{“id”:”1__PAYLOAD__FLAG__”,”name”:”bey0nd__PAYLOAD__FLAG__“}
看下几种复杂格式
{“age”:1,”service”:”getUserInfo”,”data”:[{“ID”:”0”,”name”:”sdf”},{“ID”:”3”,”name”:”sdf2”}]}
id=3&pdata={”service”:”getUserInfo”}&t=&group=0
id=3&pdata={”service”:”getUserInfo”,”data”:{”records”:[{”groupID”:”0”}]}}&version=1.1
{“test”: 1,”record”:{“data”: {“test”: 12222, “pdata”: {“service”: “getUserInfo”}}}}
以上这几种都是我在实际的线上环境中遇见的,在完全不知道参数格式时,解析还是比较麻烦的,burpsuite 的 API在获取参数时对于这种混合格式就无法解析。之前调研一些商业漏扫也是无法识别的。后来自己写的时候看 sqlmap源码有了思路解决了这个问题,有兴趣的可以看一下 libcorecommon.py 的 walk 函数。
流量去重
我对于重复请求包的定义是域名及协议和 url 路径相同,同时参数的 key 是完全一致。
像这种为重复
https://www.beysec.com/test.php?id=2&name=bey0nd
https://www.beysec.com/test.php?id=6&name=zhangsan
这种则需要再次扫描
https://www.beysec.com/test.php?id=2&name=bey0nd
https://www.beysec.com/test.php?id=6&name=zhangsan&data=hello
所以是否能完美的完成参数解析,就会影响到去重,把url与参数的key排序后判断是否已经存在就可以判定是否重复,对于复杂格式的依然可行。然后把去重后的流量入库后就可供扫描引擎调用,实时扫描或者计划任务都可以。
漏洞检测
这块就是一些重头戏部分了。我在做的时候参考了 AWVS 的设计模式。做了一些合并,把扫描插件大致分成了三类,目录结构为:
CoreScanEngine.py ——base ——perFolder ——perHost ——perRequest
举个例子,当扫描 https://www.beysec.com/pro/test.php?id=2&name=bey0nd 这个 url 时
1、CoreScanEngine.py 就是扫描入口了,负责调用所有的扫描插件
2、base 目录为一些扫描基类,定义一些基础方法
3、perFolder 目录为扫描当前目录( https://www.beysec.com/pro/)的一些插件,例如一些备份文件 https://www.beysec.com/pro/test.php.bak, https://www.beysec.com/pro/test.bak 。一些敏感文件等等之类的
3、perHost 目录就是一些单个主机的扫描插件了,例如心脏滴血,中间件,一些 0/1/Nday 这种
4、perRequest 目录就是比较熟悉的常见 web 漏洞了,SQL 注入,SSRF,命令执行这些。
这里有个调度的问题就是 perHost 只扫一次,perFolder 只扫当前目录,perRequest 每来一个包都扫。所以如果再来 https://www.beysec.com/notpro/hello.php perHost 插件就不再扫描。
总结
这些都是一些大的方向,其实每个模块都有许多细节需要处理,比如 SQL 注入检测模块中去掉返回包垃圾数据, restful 接口返回数据尽可能去掉无关项,用分词作相识度识别的阈值设置,来提高准确率减少误报。SSRF 的反链平台,每个扫描插件和模块都需要迭代优化,以及漏洞扫出来后如何闭环和打通别的平台,还是比较刺激的。
欢迎光临本人博客查看其他文章,点击阅读原文直达文章地址
本文始发于微信公众号(信安之路):Web 漏洞扫描碎碎念
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论