某次渗透测试,注入绕过客户网站是注入绕过个老旧的Java应用,登录框后面连着Oracle数据库。注入绕过我试了十来分钟,注入绕过`' or 注入绕过1=1--` 这种常规货色全被拦了。WAF日志里明晃晃写着“SQL注入拦截”,注入绕过过滤规则严得跟筛子似的注入绕过。
转机出现在一个被忽略的注入绕过角落——搜索功能。它把输入拼进LIKE子句,注入绕过参数名是注入绕过`keyword`。我扔了个`%' AND 1=1--`进去,注入绕过页面正常返回。注入绕过再试`%' AND 1=2--`,注入绕过空白。注入绕过成了。注入绕过绕过的关键不是花哨的编码,而是WAF根本没监控这个参数。它只盯着用户名和密码字段,搜索框漏成了筛子。
这类故事在真实攻防里太常见了。注入绕过的本质,从来不是和规则硬碰硬,而是找规则的盲区。规则是人写的,人写的东西就有边界,有边界就能绕。
最常见的绕过思路是改变解析上下文。比如把payload塞进JSON字段,服务端反序列化后再拼SQL,WAF看到的是一堆花括号和冒号,自然放行。还有一招是玩字符集——MySQL的`GBK`编码下,`%bf%27`会被解析成`縗'`,单引号就这么混进去了。老DBA看到这种payload,后背发凉。
另一种思路更阴险:利用数据库自身的特性。PostgreSQL里有个`pg_sleep()`函数,但WAF可能只拦了`sleep`关键字。换成`pg_sleep`就过了。SQL Server的`WAITFOR DELAY`同理。规则库更新永远追不上数据库功能的迭代速度。
我还见过更野的路子——把注入点挪到注释里。MySQL的`/*!50000SELECT*/`这种版本化注释,老版本WAF根本不认识。或者干脆用`/*!*/`把整个查询包起来,规则引擎看到的是注释,数据库执行的是恶意代码。这招在2018年还能打穿不少商业WAF。
别迷信那些公开的绕过payload列表。真正好用的东西,都是针对特定目标现造的。你得先摸清对方用什么数据库、什么中间件、WAF是哪家的、规则更新频率如何。信息收集越透,绕过方案越精准。有一次我光是看响应头的`Server`字段和报错信息的格式,就判断出后面是台跑了IIS的MSSQL,直接用`;exec xp_cmdshell`试了个反向shell,一次成功。
当然,绕过的天花板永远是业务逻辑本身。如果开发者把参数化查询用到了极致,再花哨的技巧也是白搭。但现实是,大量遗留系统、第三方组件、甚至某些偷懒的ORM配置,都在给注入留后门。你不需要攻破最坚固的堡垒,只需要找到那扇没锁的侧门。
写代码的人总以为加上过滤函数就万事大吉,可攻击者眼里,那只是多了一道需要解的谜题。真正安全的系统,靠的是纵深防御——参数化查询、最小权限、输出编码、WAF规则动态更新,哪一层都不能省。但讽刺的是,多数公司连第一步都没做扎实,就急着吹嘘自己的安全能力。
最后说个观察:近两年的攻防演练里,注入绕过的成功率反而比五年前高了。不是因为漏洞变多了,而是云环境里配置错误太普遍。RDS实例暴露公网、默认端口没改、管理后台和业务系统共用数据库账号——这些低级错误,让注入攻击的性价比飙升。技术绕过的天花板在降低,但利用门槛也在降低,这买卖,怎么算都划算。