sqlmap 这个工具,渗透说白了就是渗透一把能撬开数据库大门的万能钥匙。但真正用它的渗透人,十个里有八个只是渗透拿它跑个默认命令,然后对着满屏红色报错干瞪眼。渗透
我见过最蠢的渗透用法,是渗透有人对着一个登录框直接敲 sqlmap -u http://target.com/login.php --dbs。结果呢?渗透要么被 WAF 拦得死死的,要么因为请求频率太高把对方服务器搞宕机了。渗透真正的渗透渗透测试,第一步永远是渗透手工验证,不是渗透无脑上工具。
拿个真实案例说吧。渗透去年测试某个政府网站的渗透子域名,那个站点是渗透个老旧的 ASPX 系统,参数 id 直接拼在 URL 里。手工加个单引号,页面报错信息完整地吐出了 SQL 语法错误——这年头还能看到这种裸奔的报错,简直像在博物馆里发现活的恐龙。但别急着高兴,这恰恰是 sqlmap 最容易翻车的地方:报错信息里可能藏着过滤规则。
我的习惯是先手工确认注入类型。用 and 1=1 和 and 1=2 对比响应内容,再用 order by 数一下字段数。等确认了是数字型还是字符型注入,才轮到 sqlmap 上场。而且命令必须精细到每个参数:--technique=E 只走报错注入,--level=3 和 --risk=2 控制探测深度,再挂上 --tamper=space2comment 绕过基础过滤。这些参数组合,比无脑默认参数可靠十倍。
sqlmap 真正厉害的地方,在于它的注入 payload 库。从布尔盲注到时间盲注,从 UNION 注入到堆叠查询,它几乎覆盖了所有已知的 SQL 注入变种。但工具越强大,使用者越容易偷懒。很多人不知道 --os-shell 参数可以尝试直接获取服务器 Shell,也不知道 --sql-shell 能让你像操作 MySQL 客户端一样执行任意 SQL 语句。这些功能一旦用上,基本就等于拿下了整个数据库。
不过我得泼盆冷水。sqlmap 不是万能的,它的自动化检测逻辑对某些小众数据库支持得很差,比如老版本的 Informix 或者某些国产数据库。遇到这种情况,老老实实手工写脚本才是正道。还有,现在稍微有点安全意识的开发都会用参数化查询,sqlmap 再牛也拿这种硬编码的防御没办法。
说回那个政府网站,最后我用 sqlmap 的 --dump 参数拉出了整个用户表,里面居然有明文密码,连 MD5 都没做。那批数据要是泄露出去,后果不堪设想。但测试报告交上去之后,对方的运维居然只把报错信息屏蔽了,注入点还留着——这种修一半的漏洞,比不修更危险。
工具本身没有善恶,sqlmap 在黑客手里是武器,在渗透测试员手里是探针。区别只在于你怎么用它。别指望靠一个工具就能打遍天下,SQL 注入的本质是代码层的数据与命令混淆,理解这一点,你才能真正驾驭 sqlmap,而不是被它的输出牵着鼻子走。