sql注入测试工具
打开一个登录框,入测输入 ' OR 1=1 --,试工页面直接跳进后台。入测这不是试工电影桥段,是入测上周我在一个客户内网里实际碰到的事。他们的试工运维图省事,把测试环境的入测弱口令带到了生产,SQL注入点就藏在登录接口的试工 username 参数里。我顺手用sqlmap跑了一下,入测数据库版本、试工当前用户、入测甚至几张用户表的试工字段名全出来了。整个过程不到三分钟。入测
很多人以为SQL注入是试工上古漏洞,现在WAF一挡就没事了。入测可现实是,WAF规则库更新永远慢半拍,开发写代码时又喜欢拼字符串。你随便找个CMS,翻翻 search.php 或者 id= 这种地方,手工测几个payload,总能有惊喜。sqlmap之所以被叫“神器”,不是因为它有多智能,而是它把布尔盲注、时间盲注、报错注入这些手工要磨半天的活,全自动化了。你只要给它一个URL,它连 --dbs 到 --dump 一条龙跑完。
但工具用多了容易变懒。我见过有人拿sqlmap对着一个静态页面扫了一下午,然后抱怨工具垃圾。sqlmap不是扫描器,它需要你提供一个明确的注入点。比如 http://target.com/news.php?id=1,你得先确认 id 参数有回显或者有延时,再丢给sqlmap。否则它连 --level 5 都跑不出东西。正确姿势是:手工测出 id=1 AND 1=1 正常,id=1 AND 1=2 异常,再上工具。这样sqlmap能直接锁定注入类型,省掉大量盲猜时间。
参数调优比工具本身更重要。默认的 --risk 1 --level 1 只发几百个请求,很多注入点藏在Cookie、User-Agent甚至Referer里,你不加 --level 3 根本覆盖不到。时间盲注更吃配置,--time-sec 5 是底线,网络延迟大的环境得调到10秒。有次我测一个内网系统,默认延时3秒死活跑不出数据,改成8秒后立刻爆出表名。另外 --threads 别开太高,10个线程足够,开20以上容易把目标数据库打挂,尤其是Access这种文件型数据库。
绕过WAF是另一个坑。sqlmap自带的 --tamper 脚本有几十个,space2comment 把空格换成 /**/,charencode 做URL编码,对付ModSecurity这种老牌WAF还行。但碰到云WAF,比如某里云盾,你得组合使用,甚至手动改payload。我试过用 --tamper=space2hash,randomcase 成功绕过一次,但换个参数又不行了。没有万能脚本,只能根据报错信息反复试。有时候直接上 --random-agent 加代理池更省事。
最后说个容易被忽略的点:sqlmap的 --os-shell 和 --file-read 功能。很多人只用来拖库,其实如果数据库权限够高,直接读服务器文件甚至拿shell都是可能的。前提是 secure_file_priv 没限制,MySQL的 INTO OUTFILE 能写文件。我见过一个站,sqlmap跑出 --is-dba 为True,直接 --os-shell 弹了个cmd回来。当然这种属于运气好,大部分生产环境权限都收得很紧。
工具终究是工具。你拿sqlmap扫别人的站,别人也可能拿它扫你的。与其天天研究怎么绕WAF,不如回去翻翻代码,把 PreparedStatement 用上。参数化查询能挡掉99%的注入,剩下1%是开发自己作死写了 ORDER BY ${ id} 这种动态拼接。我见过最离谱的,把用户输入直接拼进 LIMIT 后面,这种sqlmap都救不了你,只能靠代码审计。