sqlmap注入实战
上周三凌晨两点,注入我盯着一个电商后台的实战登录框,手指在键盘上敲下最后一行命令。注入屏幕上滚出几十行数据库字段,实战用户名、注入密码哈希、实战邮箱、注入手机号,实战整整齐齐列在那里。注入sqlmap跑完,实战我灌了口凉掉的注入咖啡——这个站点的WAF形同虚设,连最基本的实战布尔盲注都没拦住。
很多人把sqlmap当成一键日站的注入神器,这误解挺深。实战它确实能自动化检测和利用SQL注入,注入但前提是你得知道往哪儿打、怎么打。拿那个电商站来说,登录框的username参数是注入点,可如果你直接sqlmap -u "http://target.com/login" --data="username=admin&password=123",大概率跑半天没结果。问题出在没加--level=3 --risk=2,默认配置只测最基本的几种payload,稍微有点过滤就绕不过去。
我习惯先手动确认注入类型。在username里输个单引号,页面返回500错误,说明存在SQL语法错误。再试admin' AND 1=1-- -,正常登录;换成admin' AND 1=2-- -,登录失败。典型的布尔盲注。这时候再上sqlmap,加上--technique=B指定布尔盲注,速度比全量扫描快得多。
有个细节值得说:sqlmap的--dbms参数能省不少时间。那个电商站后端是MySQL,我直接指定--dbms=mysql,它就不会去试Oracle或MSSQL的payload。还有--threads=10,默认1个线程跑盲注慢得让人想砸键盘,开到10之后,原本要跑两小时的库表枚举,十五分钟就出结果了。
跑出数据库名之后,别急着--dump全库。先--tables看有哪些表,再--columns看目标表的字段。那次我瞄了一眼,有个users表,字段包括id、username、password、email、phone。直接--dump -T users -C username,password,只拿需要的列。全库拖下来不仅慢,还可能触发流量告警。
遇到WAF怎么办?sqlmap自带--tamper脚本,比如space2comment把空格替换成注释,charencode做URL编码。那个电商站有云WAF,我试了--tamper=space2comment,between,randomcase,三个脚本串起来用,成功绕过。但别迷信tamper,有些WAF检测的是请求频率,这时候得加--delay=2,每个请求间隔两秒,慢是慢点,稳。
还有个坑:sqlmap默认用SELECT查数据,如果目标站禁用了SELECT或者只允许特定查询,就得换--technique=U走UNION注入,或者--technique=E走报错注入。我碰到过一个站,布尔盲注被拦,报错注入却能用,因为开发把mysql_error()直接输出到页面了。sqlmap跑--technique=E --dbms=mysql,十分钟拿到管理员密码。
最后说个真实教训。有次我图省事,直接sqlmap -u "http://target.com/news?id=1" --batch --dump-all,结果把生产库拖垮了。盲注请求量太大,数据库连接池爆满,站点直接502。后来学乖了,先--count看数据量,几万条以上的表就只--dump关键字段,或者用--where="id>1000"限制范围。工具再强,也得带脑子用。
sqlmap的--os-shell和--file-write功能更危险,能直接写webshell到服务器。除非是授权测试,否则别碰。我见过有人拿sqlmap扫了不该扫的站,--os-shell一执行,服务器上多了个shell.php,第二天警察就找上门了。技术本身没对错,用的人得有底线。