sqlmap 的指纹识别
WAF 指纹识别
该功能属于第三方插件,主要功能代码位于 sqlmap\thirdparty\identywaf 下。
- https://github.com/stamparm/identYwaf
对前 10 个请求数据包进行 WAF 识别
在发送请求数据包后,sqlmap 会对响应包自动进行 WAF 指纹识别,但是只会识别发送的前 10 个响应包内容,该流程位于 processResponse 函数中。大致流程如下:
- 首先 sqlmap 会将状态码+响应头+响应体整合成一个字符串 rawResponse 用于后续匹配。
- 直接将 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"] }, - 关于 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/ 路径下,主要有如下几个文件。
sharepoint.xml- 识别 SharePoint 服务器server.xml-识别各种类型服务器和操作系统(IIS, Apache, Nginx, GoogleWebServer, lighttpd, OpenResty, LiteSpeed, SunONE)* (Windows,各种类型的 Linux 操作系统)servlet-engine.xml- 识别 Java Servlet 中间件set-cookie.xml- 通过 cookie 参数类型识别语言或者 CMSx-aspnet-version.xml- 识别 ASP. NET 版本x-powered-by.xml- 通过 x-powered-by 识别语言或者 CMSgeneric.xml- 通用的字段,会尝试匹配所有的 Headers,主要是识别操作系统
HTTPResponseHeaders 的总体检测匹配流程如下:
- 对于每个响应包 Header 通过根据 header 名取 banner 路径下的 xml 文件进行正则匹配(此外所有的 header 都会过一边 generic. xml)。
- 当匹配成功后,会获取对应指纹下的信息内容。根据 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 文件。
errors.xml- 包含的是不同的 DBMS 会出现的报错信息。
因为响应包的内容较大,并且很可能存在大量的重复。因此 sqlmap 做了优化,每次匹配前计算一边 hash,并且将该值作为 key 值,将整个 page 缓存起来,防止重复匹配。并且首先会进行简单的匹配正则SQL (warning|error|syntax)尝试 , 匹配中了才会与errors.xml中内容进行匹配。
如果匹配成功后,sqlmap 会将对应的 dmbs 信息和 key 值一起保存到kb.cache.parsedDbms和kb.htmlFp中。