欢迎来到 黑吧安全网 聚焦网络安全前沿资讯,精华内容,交流技术心得!

漏洞扫描技巧之Web漏洞扫描器研究

来源:本站整理 作者:佚名 时间:2019-09-07 TAG: 我要投稿

0×00 前言
之前我们简单介绍了一下扫描器中爬虫的部分,接下来将继续介绍一下扫描器中一些我们认为比较有趣的技巧。
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 中,假如某天出现了这么一种流行编码格式 http://www.a.com/key1,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
大致的流程图如下:

[1] [2]  下一页

【声明】:黑吧安全网(http://www.myhack58.com)登载此文出于传递更多信息之目的,并不代表本站赞同其观点和对其真实性负责,仅适于网络安全技术爱好者学习研究使用,学习中请遵循国家相关法律法规。如有问题请联系我们,联系邮箱admin@myhack58.com,我们会在最短的时间内进行处理。
  • 最新更新
    • 相关阅读
      • 本类热门
        • 最近下载