0x00 前言之前我们简单介绍了一下扫描器中爬虫的部分,接下来将继续介绍扫描器中一些我们认为比较有趣的技巧 。
0x01 编码/解码/协议在很久以前有人提问 AMF 格式的请求怎么进行检测,或者有什么工具可以检测 。
既然我们要讲解的是 Web 漏洞扫描器,那么就先假设是 AMF over HTTP (这里并不需要你了解 AMF,你只需要知道 AMF 是一种数据格式类型就行) 。
假设我们需要测试一个 AMF 格式数据的 SQL 注入问题,那么按照通常的思路就是在 SQL 注入模块中:
1.先解析 HTTP 中 AMF 格式数据
2.然后在测试参数中填写 payload
3.重新封装 AMF 格式数据
4.发送 HTTP 请求
伪代码如下:
1req = {"method": "POST", "url": "http://fatezero.org", "body": "encoded data"}2data = https://www.isolves.com/it/aq/wl/2020-06-20/decode_amf(req["body"])3for key, value in data.items():4d = copy.deepcopy(data)5d[key] = generate_payload(value)6body = encode_amf(d)7requests.request(method=req["method"], url=req["url"], body=body)
整个流程下来没什么问题,但是如果又来了一个 X 协议(X over HTTP),那么我们就得继续修改 SQL 注入模块以便支持这种 X 协议,但是扫描器中可不是只有 SQL 注入检测模块,还有其他同类模块,难道每加一个新协议我还得把所有检测模块都改一遍?
所以我们需要把这些协议解析和封装单独抽出来放在一个模块中 。
伪代码如下:
1# utils.py 2def decode(data): 3if is_amf(data): 4data = decode_amf(data) 5 6if is_X(data): 7data = decode_X(data) 8 9# 递归 decode10for i in data:11data[i] = decode(data[i])1213return data141516# detect_module.py17req = {"method": "POST", "url": "http://fatezero.org", "body": "encoded data"}18data = decode(req["body"])19for key, value in data.items():20d = copy.deepcopy(data)21d[key] = generate_payload(value)22body = encode(d)23requests.request(method=req["method"], url=req["url"], body=body)
上面的递归 decode 主要是为了解码某种格式的数据里面还有另外一种格式的数据,虽然看起来这种场景比较少见,但是仔细想一下 multipart 带着 json,json 里的字符串是另外一个 json 字符串,是不是又觉得这种情况也并不少见 。
那 encode/decode 剥离出来就可以了吗?请注意到上面伪代码使用了 requests. request 发送请求,那如果某天需要我们去测试 websocket 协议,是不是又得在检测模块中多加一套 websocket client 发送请求?
所以我们也需要将具体的网络操作给剥离出来,具体的协议类型直接由上面来处理,检测模块只需要关注具体填写的 payload 。
伪代码如下:
1for key, value in x.items():2data.reset()3x[key] = generate_payload(value)4x.do()# 负责将数据重新组装成原来的格式,并按照原始协议发送56# check
因为每个检测模块的检测依据大致就几种:
- 返回内容
- 消耗时间 (time based)
- 另外一条信道的数据 (比方说 DNSlog)
在编写检测模块的时候,编写者可以不用关心基础协议是什么,怎么对数据编码解码,只用关心根据 value 生成 payload 并填写到相对应的 key 中 。
假如某天出现了这么一种流行编码格式 http://www.a.com/key1, value1,key2,value2,那我们所有的检测模块也无需修改,仅仅需要在上一层再添加一套 encode/decode 操作即可 。假如某天出现了一种比较流行的协议,我们也仅需要在上一层提供一套 client 即可 。检测模块的工作就仅仅剩下生成并填写 payload 。
0x02 PoC 分类在 2014 年的时候,我做了大量的竞品分析,包括使用逆向工程逆向商业的 Acunetix WVS, HP Webinspect, IBM AppScan, Netsparker 扫描逻辑,也包括阅读开源的 w3af, arachni 代码 。
如果不谈扫描质量,只关注整体项目设计以及产品中使用到的猥琐技巧,那么其中最让我眼前一亮的当属 AWVS,接下来我将详细介绍一下我从 AWVS 中学习到的 PoC 分类 。
PoC 分类:
类型描述PerServer用于检测 Web Server 级别中存在的漏洞,比方说各种中间件,Web 框架的漏洞PerFile用于检测某个文件中是否存在漏洞,比如对应文件的备份,Bash RCE 等PerFolder用于检测某个目录中是否存在漏洞,比如敏感信息的泄漏,路径中的 SQL 注入等PerScheme用于检测某个参数中是否存在漏洞,比如 SQL 注入,XSS 等PostCrawl在爬虫结束之后启动,直接使用爬虫的资源进行检测PostScan在扫描结束之后启动,用于检测二阶注入,存储 XSS等WebApps用于检测比较常用的 Web 应用的漏洞
推荐阅读
- 篮球过人技巧30招
- 埙的吹法与演奏技巧
- 华安解密之DDoS攻防 23 实战篇之城域网防护
- 淘宝开店技巧与营销 淘宝开店怎么运营有什么技巧
- 新手该怎么运营店铺 淘宝开店怎么运营有什么技巧
- 超级推荐优化技巧 超级推荐怎么优化
- 做淘宝店铺最基础的运营技巧 淘宝运营注意事项
- 茶在生活中的其他用处,玫瑰花茶泡法技巧
- 选品技巧有哪些 淘宝选品的方法和技巧
- 一篇文章告诉你,多肉到底应该如何浇水