sqlmap 的指纹识别

WAF 指纹识别

该功能属于第三方插件,主要功能代码位于 sqlmap\thirdparty\identywaf 下。

对前 10 个请求数据包进行 WAF 识别

在发送请求数据包后,sqlmap 会对响应包自动进行 WAF 指纹识别,但是只会识别发送的前 10 个响应包内容,该流程位于 processResponse 函数中。大致流程如下:

  1. 首先 sqlmap 会将状态码+响应头+响应体整合成一个字符串 rawResponse 用于后续匹配。
  2. 直接将 rawResponse 字符串与 sqlmap\thirdparty\identywaf\data.json 中每个 waf 的正则进行表示匹配,判断是否有命中 waf 拦截相关的字符串。如果有命中则会将识别的 waf 添加到全局变量 kb.identifiedWafs 中。(单个 WAF 正则如下)
    "airlock": {
    	"company": "Phion/Ergon",
    	"name": "Airlock",
    	"regex": "The server detected a syntax error in your request",
    	"signatures": ["3e2c:RVZXu261OEhCWapBYKcPk4JzWOtohM4IiUcMr2RXg1uQJbX3uhdOn9htOj+hX7AB16FcPxJPdLsXomtKaK59n+i6c4RmkwI2FZjxtDtAeq6c36A5chW1XaTD"]
    },
    
  3. 关于 signature 字段,sqlmap 没有使用。signautre 的使用可见 https://www.slideshare.net/stamparm/blind-waf-identification 和 identYwaf#signatures 识别中。

HTTP 数据包的指纹识别

sqlmap 几乎会在每次发送数据包调用 Connect. queryPage 中,都尝试对每个响应头和响应体进行指纹识别,并将识别出目标服务器的指纹信息更新到 kb.headersFp 该全局变量中。

HTTPResponseHeaders 指纹提取

sqlmap 会尝试从 header 中提取指纹信息,该指纹提取的流程位于 headersParser() 函数中。
首先HTTPResponseHeaders 的指纹位于 sqlmap/data/xml/banner/ 路径下,主要有如下几个文件。

HTTPResponseHeaders 的总体检测匹配流程如下

  1. 对于每个响应包 Header 通过根据 header 名取 banner 路径下的 xml 文件进行正则匹配(此外所有的 header 都会过一边 generic. xml)。
  2. 当匹配成功后,会获取对应指纹下的信息内容。根据 xml 中的字段将识别到指纹信息添加在 kb.headersFp 字典中:type,distrib,release,codename,dbmsVersion,technology,sp (Service Pack)
    xml 其中有一些关键字段使用生成上述字段添加到 kb.headersFp 中的,如下:
    • technology 表示识别的服务器/语言等类型
    • type 表示操作系统
    • distrib 表示操作系统发布类型
    • release 表示操作系统版本
    • codename 操作系统发布属性(testing, ustable 等)
    • dbms_version 数据库正则匹配上后 group 的位置,用于取值
    • tech_version 同上,均用于正则匹配取 Headers 中的值

HTTPResponseBody 指纹提取

从响应包 Body 提取指纹信息的流程位于 htmlParser() 函数中。在该函数中,使用的 xml 位于 sqlmap\data\xml 路径下,不同于上述的 banner 路径下的 xml 文件。