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 中,假设某天呈现了这么一种盛行编码格局 https://www.hack56.com/images/jltqo2054es.png” 用于检测二阶注入,存储 XSS等
WebApps
大致的流程图如下:
[1][2]黑客接单网