WAF拦不住?一篇搞懂SQL注入绕过原理与实战
【引言】想象一下你要给一个加了严密安检的仓库网站数据库送一份“特殊快递”。门口的保安就是WAFWeb应用防火墙手里拿着一张“黑名单照片”专门抓长得像坏人的包裹比如包裹上写着union select或者 or 11。但是如果你把包裹换个包装、用暗号说话或者把名字拆开写保安可能就认不出来了。这就是SQL注入绕过WAF 的核心逻辑不是去暴力破解大门而是把自己伪装成“正常请求”骗过安检规则。本文专为初学者打造不讲枯燥的理论只讲“伪装术”的底层逻辑和实战案例。读完这篇你不仅能看懂绕过原理还能明白为什么有些“看似危险”的代码却能顺利通过防火墙。一、前言为什么WAF会被绕过WAFWeb应用防火墙就像网站的“安检门”专门拦截SQL注入、XSS等攻击。但它有个致命弱点只能按预设规则检查流量。如果我们的攻击请求“伪装”成正常请求就能骗过WAF。本文用“快递安检”打比方带你理解绕过逻辑。二、绕过WAF的核心原理WAF的规则本质是“黑名单匹配”——比如看到union select就拦截。绕过的关键是让恶意请求看起来不像规则里的“坏请求”。常见思路有4种思路通俗解释例子规则盲区WAF没覆盖所有语法用编码伪装把攻击代码“翻译”成其他形式用%27代替单引号结构混淆打乱SQL语句结构用注释/**/分割关键词逻辑欺骗让WAF误以为是正常查询用11但加干扰字符三、实战绕过技巧技巧1大小写混合——最简单的“变装”原理WAF规则可能只匹配小写如select但SQL不区分大小写。实例原攻击union select 1,2,3绕过后uNiOn SeLeCt 1,2,3效果WAF可能只拦全小写的union select但对混合大小写无反应。技巧2注释分割——把关键词“拆碎”原理用SQL注释/**/或--插入关键词中间让WAF无法匹配完整关键词。实例原攻击union select 1,2,3绕过后union/**/select 1,2,3或union--select 1,2,3效果WAF规则可能只查union select连续字符串分割后无法识别。技巧3编码替换——给字符“换马甲”原理用URL编码、十六进制编码等替换特殊字符WAF可能无法解码检查。实例原攻击 or 11 --单引号闭合绕过后%27%20or%2011%20--%20URL编码单引号、空格或更隐蔽0x27十六进制单引号效果WAF可能只拦明文但编码后的%27能直接通过。技巧4等价函数替换——用“同义词”骗WAF原理SQL中很多函数功能相同但WAF可能只拦常用函数。实例原攻击union select user(),2,3user()获取当前用户绕过后union select current_user(),2,3current_user()功能相同或union select session_user(),2,3效果WAF可能只拦user()但current_user()能绕过。技巧5逻辑混淆——让WAF“算不过来”原理用多余逻辑干扰WAF的判断但数据库能正确执行。实例原攻击 or 11 --永远为真绕过后 or (11 and 21) --或 or 11 and aa效果WAF可能检查or 11的单一模式但复杂逻辑会漏判。四、真实场景实战案例假设某网站登录框存在SQL注入原始请求https://example.com/login?useradminpass123WAF拦截admin中的单引号。绕过步骤编码单引号admin%27→ 请求变为useradmin%27添加注释干扰admin%27/**/or/**/11--→ 最终请求https://example.com/login?useradmin%27/**/or/**/11--pass123结果WAF未拦截数据库执行select * from users where useradmin/**/or/**/11-- and pass123成功绕过。五、防御建议参数化查询预编译用?占位符代替直接拼接SQL如select * from users where user?从根源防注入。WAF规则升级定期更新WAF规则库覆盖更多编码和混淆方式。最小权限原则数据库用户只给必要权限如禁止union、drop等高危操作。六、总结绕过WAF的核心是“伪装成正常请求”——通过大小写、注释、编码、等价替换等方式让WAF的规则匹配失效。但记住技术用于防御而非攻击。本文仅用于学习Web安全原理请勿在未授权系统中测试新手提示先在本地搭建DVWA、sqli-labs等靶场练习再尝试实战~ 遇到问题欢迎留言讨论