转载

优化SQLMAP的批量测试功能

0×01 背景

做为一只甲方安全汪,平时工作很多系内部业务复杂,查询功能较多,此时任意功能都可能存在注入点。使用自动化扫描工具awvs,可以通过爬虫爬完所有页面,但现在很多的请求写在ajax里,对于在ajax交互这一块awvs并不能很好的支持经常漏测;手工测试时间紧,容易纰漏。

此时需要Burp Suite把所有的请求都记得到history记录里,再使用其他工具提取history记录并自动帮你分析问题所在。

0×02 过程

之前,有其他安全工作者自己开发proxy+sqlmapapi的方式批量检测( http://www.freebuf.com/tools/74445.html ),小哥我最近偶尔也在看sqlmap源代码(为什么说偶尔?做为一只甲方安全汪,杂事太多T_T),这次给大家带来的方式是通过sqlmap提取history记录实现批量sql检测。

讲到这里,可能你会吐嘈“sqlmap里不是有个-r或-l参数提取burp的history记录批量检测么?搞毛毛啊!”……先听我讲sqlmap源代码有个小bug,导致不能全量检测会漏掉一些URL和参数。

具体源代码如下: lib/core/option.py 中 _parseBurpLog() 模块代码第366行,如下图:

优化SQLMAP的批量测试功能

当kb.targets不为空或url不在addedTargetUrls里时就添加检测队列,这会导致什么问题呢?

例如:

#1:

post /1.php a=ok&b=ok

#2:

post /1.php a=ok&c=inject

两个url相同#1的参数不存在注入,#2的c参数存在注入。但sqlmap在批量提取url时由于两个url相同,所以只取了#1,而#2因为url跟#1的url一样,所以没添加到检测队列里。就这样我们的sqlmap就漏测#2存在注入的c参数了(真实被坑过)。

基于以上原因,我决定对sqlmap加入检测队列算法进行修造, 加入检测队列在url的基础上加入data的key做为判断条件(url+key),这样相同url而key不同请求history记录sqlmap也不漏测

首先,把data里的Key提取出来,并对key进行一次按字符顺序排序,然后跟url组合是否加入检测队列的判断条件。

具体实现代码如下:

if not(conf.scope and not re.search(conf.scope, url, re.I)): #处理data参数,把key提取出来,key值做为判断重复的条件之一 a = data b = a.split('&') #print b c = [] for i in b:  if i.find('=') > 0:   arr = i.split('=')   c.append(arr[0]) #print c #提取的key使用sorted按字符顺序排序一把,再组合成字符串。(如果数据庞大的话,建议把keystr转成hash值) keystr = "%s%s"%(url,''.join(sorted(c))) #if not kb.targets or url not in addedTargetUrls: if not kb.targets or keystr not in addedTargetUrls:  kb.targets.add((url, method, data, cookie, tuple(headers)))  #addedTargetUrls.add(url)  addedTargetUrls.add(keystr) 

0×03 优化效果

测试数据:

优化SQLMAP的批量测试功能

优化前:

优化SQLMAP的批量测试功能

优化后:

优化SQLMAP的批量测试功能

0×04 后话

sqlmap真的很强大,大家可以熟读sqlmap源代码做二次开发,加入新功能比如检测XXE,LIF,RCE等功能,让sqlmap功能变得更强大。好了,本篇文章到此结束,很感谢大家很有耐心的看完本篇文章。如果有什么好玩的点子,想法也希望大家一起交流、学习、进步,谢谢。

*本文作者:晴天,本文属FreeBuf原创奖励计划,未经许可禁止转载

正文到此结束
Loading...