之前我们简单介绍了一下的部分,接下来将继续介绍一下扫描器中一些我们认为比较有趣的技巧。
0×01 编码/解码/协议在很久以前有人提问 AMF 格式的请求怎么进行检测,或者有什么工具可以检测。既然我们要讲解的是 Web 漏洞扫描器,那么就先假设是 AMF over HTTP (这里并不需要你了解 AMF,你只需要知道 AMF 是一种数据格式类型就行)
假设我们需要测试一个 AMF 格式数据的 SQL 注入问题,那么按照通常的思路就是在 SQL 注入模块中
1.先解析 HTTP 中 AMF 格式数据
2.然后在测试参数中填写 payload
3.重新封装 AMF 格式数据
4.发送 HTTP 请求
伪代码如下:
req = {"method": "POST", "url": "http://fatezero.org", "body": "encoded data"} data = decode_amf(req["body"]) for key, value in data.items(): d = copy.deepcopy(data) d[key] = generate_payload(value) body = encode_amf(d) requests.request(method=req["method"], url=req["url"], body=body)整个流程下来没什么问题,但是如果又来了一个 X 协议(X over HTTP),那么我们就得继续修改 SQL 注入模块以便支持这种 X 协议,但是扫描器中可不是只有 SQL 注入检测模块,还有其他同类模块,难道每加一个新协议我还得把所有检测模块都改一遍?所以我们需要把这些协议解析和封装单独抽出来放在一个模块中。
伪代码如下:
# utils.py def decode(data): if is_amf(data): data = decode_amf(data) if is_X(data): data = decode_X(data) # 递归 decode for i in data: data[i] = decode(data[i]) return data # detect_module.py req = {"method": "POST", "url": "http://fatezero.org", "body": "encoded data"} data = decode(req["body"]) for key, value in data.items(): d = copy.deepcopy(data) d[key] = generate_payload(value) body = encode(d) requests.request(method=req["method"], url=req["url"], body=body)上面的递归 decode 主要是为了解码某种格式的数据里面还有另外一种格式的数据,虽然看起来这种场景比较少见,但是仔细想一下 multipart 带着 json,json 里的字符串是另外一个 json 字符串,是不是又觉得这种情况也并不少见。
那 encode/decode 剥离出来就可以了吗?请注意到上面伪代码使用了 requests.request 发送请求,那如果某天需要我们去测试 websocket 协议,那是不是又得在检测模块中多加一套 websocket client 发送请求?所以我们也需要将具体的网络操作给剥离出来,具体的协议类型直接由上面来处理,检测模块只需要关注具体填写的 payload。
伪代码如下:
for key, value in x.items(): data.reset() x[key] = generate_payload(value) x.do() # 负责将数据重新组装成原来的格式,并按照原始协议发送 # check因为每个检测模块的检测依据大致就几种:
1.返回内容
2.消耗时间 (time based)
3.另外一条信道的数据 (比方说 dnslog)
所以即便是我们将网络操作剥离出来也不会影响检测的效果。
在编写检测模块的时候,编写者可以不用关心基础协议是什么,怎么对数据编码解码,只用关心根据 value 生成 payload 并填写到相对应的 key 中,假如某天出现了这么一种流行编码格式 ,value1,key2,value2,那我们所有的检测模块也无需修改,仅仅需要在上一层再添加一套 encode/decode 操作即可。假如某天出现了一种比较流行的协议,我们也仅需要在上一层提供一套 client 即可。检测模块的工作就仅仅剩下生成并填写 payload。
0×02 PoC 分类在 2014 年的时候,我做了大量的竞品分析,包括使用逆向工程逆向商业的 Acunetix WVS, HP Webinspect, IBM AppScan, Netsparker 扫描逻辑,也包括阅读开源的 w3af, arachni 代码。如果不谈扫描质量,只关注整体项目设计以及产品中使用到的猥琐技巧,那么其中最让我眼前一亮的当属 AWVS,接下来我将详细介绍一下我从 AWVS 中学习到的 PoC 分类。
PoC 分类:
用于检测比较常用的 Web 应用的漏洞
类型 描述PerServer 用于检测 Web Server 级别中存在的漏洞,比方说各种中间件,Web 框架的漏洞
PerFile 用于检测某个文件中是否存在漏洞,比如对应文件的备份,Bash RCE 等
PerFolder 用于检测某个目录中是否存在漏洞,比如敏感信息的泄漏,路径中的 SQL 注入等
PerScheme 用于检测某个参数中是否存在漏洞,比如 SQL 注入,XSS 等
PostCrawl 在爬虫结束之后启动,直接使用爬虫的资源进行检测
PostScan 在扫描结束之后启动,img alt=”awvs.png” 用于检测二阶注入,存储 XSS等
WebApps
大致的流程图如下: