1. 从流量视角看SQL注入攻击
去年在内部安全演练时,我遇到一个典型的SQL注入案例。攻击者通过精心构造的注入语句,成功绕过了基础防御措施。当时抓取的网络流量包,成了分析注入手法的绝佳样本。今天我们就以这个真实案例为蓝本,聊聊如何从流量层面识别和防御SQL注入。
不同于常规的漏洞扫描工具,流量分析能直观展现攻击者的操作路径。通过Wireshark捕获的HTTP请求中,可以清晰看到攻击者如何逐步试探、确认漏洞,最终构造出有效的注入语句。这种动态视角对安全人员理解攻击逻辑特别有帮助。
2. 注入流量特征解析
2.1 初始探测阶段
攻击者通常会先发送试探性请求。在我们的案例中,首轮流量包含如下特征:
GET /product.php?id=1' AND 1=1-- HTTP/1.1 GET /product.php?id=1' AND 1=2-- HTTP/1.1这两个请求通过布尔逻辑测试注入点是否有效。第一个请求应返回正常页面,第二个请求因1=2不成立应返回异常。这种有规律的测试请求是SQL注入的明显标志。
2.2 信息收集阶段
确认存在注入漏洞后,攻击者开始收集数据库信息。典型流量包括:
GET /product.php?id=1 UNION SELECT 1,version(),3,4-- HTTP/1.1 GET /product.php?id=1 UNION SELECT 1,table_name,3,4 FROM information_schema.tables-- HTTP/1.1这些请求利用UNION操作获取数据库版本、表结构等元数据。流量中突然出现information_schema查询是高风险信号。
3. 深度注入手法分析
3.1 时间盲注特征
当页面没有明显回显时,攻击者会采用时间盲注:
GET /product.php?id=1' AND IF(SUBSTRING(database(),1,1)='a',SLEEP(5),0)-- HTTP/1.1这类请求会伴随异常的响应延迟(如5秒)。在流量中表现为请求间隔突然增大,且包含SLEEP()等时间函数。
3.2 报错注入特征
利用数据库报错信息获取数据的请求示例:
GET /product.php?id=1' AND ExtractValue(1,CONCAT(0x5c,user()))-- HTTP/1.1这类注入会在响应中携带数据库报错信息,流量特征包括:
- 请求中包含ExtractValue/UpdateXML等特殊函数
- 响应状态码为200但内容包含数据库错误信息
4. 防御方案与检测建议
4.1 WAF规则配置要点
基于流量特征建议配置以下规则:
- 检测连续出现的单引号、注释符(-- /*)
- 监控information_schema的访问请求
- 识别非常规函数调用(SLEEP/BENCHMARK等)
- 检测异常的UNION SELECT语句结构
4.2 应用层防护实践
在代码层面建议:
// 使用预处理语句 $stmt = $pdo->prepare("SELECT * FROM products WHERE id = ?"); $stmt->execute([$id]); // 严格限制错误信息输出 ini_set('display_errors', 'Off');5. 分析工具实战技巧
5.1 Wireshark过滤技巧
使用显示过滤器快速定位注入流量:
http.request.uri contains "'" || http.request.uri contains "UNION" || http.request.uri contains "SLEEP"5.2 日志分析关键点
在Apache日志中重点关注:
- 异常的URL编码参数(%27对应单引号)
- 超长URI请求(可能包含复杂注入语句)
- 同一IP短时间内大量相似请求
我曾遇到攻击者使用/**/替代空格的变种注入,通过日志分析发现其请求中大量出现这种注释符,最终溯源到攻击入口。
6. 企业级防护建议
对于重要业务系统建议:
- 部署RASP运行时防护
- 定期进行流量审计
- 建立SQL注入特征库
- 对开发人员进行安全编码培训
最后提醒:所有防护措施都要经过充分测试。有次我们部署的WAF规则误拦了正常的BI查询,就是因为没有做好兼容性测试。安全防护需要在保障业务和防范风险之间找到平衡点。