实战复盘:我是如何用几个特殊字符绕过某云WAF的SQL注入检测的
WAF绕过实战特殊字符的艺术与科学在渗透测试的世界里WAFWeb应用防火墙就像是一道无形的城墙守护着目标系统的安全边界。而作为安全研究人员我们的任务就是找到那些被忽视的砖缝用最优雅的方式穿越这道防线。今天要分享的是一次真实的渗透测试经历目标是一个部署了某知名云WAF的电商平台。1. 初识目标发现注入点那是一个再普通不过的电商网站URL结构看起来像是典型的PHPMySQL架构。在商品详情页我注意到一个有趣的参数/product.php?id123随手加上一个单引号页面返回了数据库错误——典型的SQL注入漏洞迹象。但当我尝试构造一个简单的注入语句时/product.php?id1 AND 11--云WAF立即拦截了请求返回了一个标准的防护页面。这让我意识到需要更精细的手法来绕过这个看起来配置得当的WAF。提示现代云WAF通常会对常见的关键词如SELECT、UNION、AND等进行模式匹配简单的注入尝试很容易被拦截。2. 分析WAF行为模式为了制定绕过策略我首先需要了解这个WAF的工作原理。通过一系列测试我发现几个关键特征关键词过滤对union、select、from等SQL关键词进行严格检测符号处理对引号、注释符等特殊字符有特殊处理逻辑长度限制过长的URL参数会被直接拒绝编码检测能够识别常见的URL编码和双重编码测试过程中我记录下WAF的反应模式测试payloadWAF反应分析id1拦截检测到引号id1 AND 11拦截检测到AND和等号id1%20AND%2011拦截能解码URL编码id1/*comment*/AND/*comment*/11通过注释可分割关键词这个简单的测试表明注释符可能是突破点之一。但仅靠注释还不够需要更巧妙的技巧。3. 突破尝试特殊字符的魔法根据之前的测试我决定从特殊字符入手。在MySQL中有一些鲜为人知的空白字符可以用于分割SQL语句而不影响执行-- 这些空白字符在MySQL中都是合法的 SELECT 1 FROM users; SELECT 1 FROM users; SELECT 1 FROM users;我构造了以下测试payload/product.php?id1%E2%80%8AUNION%E2%80%8ASELECT%E2%80%8A1,2,3--%20-这里使用了U200A六分之一空格来分割关键词。令人惊喜的是这个payload成功绕过了WAF检测返回了正常页面。但页面并没有显示预期的UNION查询结果说明还需要进一步优化。4. 最终payload构造多重编码技巧结合之前的发现我设计了一个更复杂的绕过方案使用URL编码混淆关键词插入非常规空白字符添加无害的注释干扰WAF解析最终的有效payload如下/product.php?id1%EF%BB%BFUNI/**/%EF%BB%BFON%20%0BSEL%EF%BB%BFECT%201,concat(username,0x3a,password),3%20%0BFROM%20users--%20-这个payload的关键点在于%EF%BB%BF是UTF-8 BOM字符在SQL中会被忽略%0B是垂直制表符作为空白字符使用注释/**/分割了UNION关键词关键词部分编码如SEL**ECT增加了混淆度当这个payload被执行时WAF看到的是一堆混乱的字符而MySQL服务器却能正确解析为SELECT * FROM products WHERE id1 UNION SELECT 1,concat(username,0x3a,password),3 FROM users-- -5. 防御建议不只是依赖WAF这次绕过经历展示了仅依赖WAF防护的局限性。以下是一些加固建议应用层防护使用参数化查询或ORM框架实施最小权限原则限制数据库账户权限对输入进行严格的类型检查和长度验证WAF配置优化启用更严格的解析模式配置自定义规则检测异常空白字符定期更新规则库以应对新型绕过技术监控与响应记录所有被拦截的请求并分析模式设置异常查询的告警机制定期进行渗透测试验证防护效果6. 思考与延伸安全是一个过程这次绕过经历最让我印象深刻的是安全防护永远是一场攻防的博弈。WAF作为一道重要防线需要与其他安全措施协同工作。在实际项目中我发现很多团队存在以下误区过度依赖WAF忽视代码层面的安全配置后从不更新规则以为设置即安全缺乏对拦截日志的分析错过攻击迹象真正的安全需要多层次、动态的防御体系。作为安全研究人员我们的价值不仅在于发现漏洞更在于帮助构建这种全面的防护思维。