sqlmap测试
用sqlmap扫一个站,测试有时候几秒钟就出结果,测试有时候挂一晚上也跑不出东西。测试差别不在工具本身,测试而在你怎么喂它参数。测试很多人上来就sqlmap -u "http://target.com?测试id=1",然后盯着屏幕等它自己发挥——这种用法跟买台服务器只拿来扫雷差不多。测试
先看一个真实场景。测试朋友丢过来一个URL,测试带id=1,测试说“帮我看看有没有注入”。测试我直接跑sqlmap -u "http://xxx.com/news.php?测试id=1" --batch --dbs,三分钟不到,测试数据库列表就出来了。测试但同一台机器上另一个参数cat=2,测试同样的命令跑了二十分钟,返回“parameter 'cat' is not injectable”。不是sqlmap不行,是那个参数确实没洞。工具不会撒谎,它只是把你给它的输入原样测试一遍。
真正让sqlmap效率翻倍的操作,是先把请求丢给Burp或者浏览器开发者工具抓下来,保存成txt文件,再用-r参数加载。我试过一个后台登录接口,URL里看不到参数,全在POST body里。直接-u根本没法测。抓包存成login.txt,跑sqlmap -r login.txt --level=3 --risk=2 --batch,两分钟后它告诉我username字段存在布尔盲注。如果只靠自动爬虫,这个点大概率被漏掉。
参数调优比工具本身更值得花时间。--level默认是1,只测GET和POST。调到3会加测User-Agent和Referer,调到5连Cookie都扫。我一般从3起步,除非目标特别敏感。--risk默认1,调到2会加测基于时间的盲注,3会尝试OR注入——后者容易把表搞坏,生产环境别用。还有--threads,默认1,调到10能快不少,但有些WAF会直接封IP。我吃过亏,一个站刚跑--threads=10,三秒后返回403,换IP才恢复。
sqlmap的输出信息量很大,但很多人只看最后那几行。其实中间有一行很关键:[INFO] testing 'AND boolean-based blind - WHERE or HAVING clause'。它告诉你正在测哪种注入类型。如果卡在时间盲注上不动,说明目标响应很慢,或者网络延迟高。这时候加--time-sec=5把等待时间拉长,反而比默认的5秒更稳——默认值有时候会误判。
一个容易被忽略的细节:--dbms参数。如果你已经知道目标跑的是MySQL,直接--dbms=mysql,sqlmap会跳过其他数据库的测试用例,速度提升非常明显。我测过一个WordPress站,不加这个参数跑了八分钟还没出库名,加上之后四十秒就拿到information_schema。不是玄学,就是少做了无用功。
还有--technique。默认全测:B布尔、E报错、U联合、S堆叠、T时间。如果你从报错信息里已经看到You have an error in your SQL syntax,直接--technique=E,只测报错注入。快,而且准。我见过有人用默认配置跑一个明显有报错回显的站,等了半小时才出结果——sqlmap在按顺序试其他四种技术,纯属浪费时间。
最后说个反直觉的:--flush-session。sqlmap会把每个目标的测试会话缓存到~/.sqlmap/output/下。第二次跑同一个站,它会直接读缓存,跳过已经确认不存在的注入点。这本来是好事,但如果你改了参数(比如加了Cookie),缓存不会自动失效。结果就是你以为在测新参数,其实sqlmap在拿旧数据糊弄你。这时候加--flush-session强制清缓存,或者手动删掉那个目录。我因为这个坑浪费过整个下午。
工具就是工具,sqlmap不会帮你思考。它把请求发出去,把响应收回来,按规则匹配。真正决定成败的是你给的URL、抓的包、调的参数。别指望一条命令走天下,多看看-hh里的高级选项,比背命令有用得多。