大小写混用可绕过WAF关键字过滤,因SQL不区分大小写而部分WAF仅匹配小写关键词,如用UnIoN SeLeCt替代union select;实操中若失败,可结合内联注释/!UNION//!SELECT/或/**/替代空格,并注意数据库类型与版本兼容性。

大小写混用绕过关键字过滤
很多WAF或自定义过滤逻辑只匹配小写的 union、select,而SQL本身不区分大小写。攻击者用 UnIoN、sElEcT 就能直接逃逸。
实操建议:
- 测试时先尝试
id=1' UnIoN SeLeCt 1,2,3--+,观察是否报错或回显变化 - 如果页面返回正常但无数据,可能是大小写被部分识别,改用内联注释:
id=1' /*!UNION*/ /*!SELECT*/ 1,2,3--+ - 注意MySQL 5.7+默认关闭内联注释执行(除非启用了
sql_mode含IGNORE_SPACE),Oracle/PostgreSQL不支持/*!*/
空格被过滤时的替代方案
当 union select 中的空格被删掉或拦截,整个语句会语法错误。但空格不是必需的,数据库有多种合法替代方式。
实操建议:
- 用
/**/替代:例如union/**/select/**/1,2,3 - 用括号包裹函数或标识符:
select(database())、select(1),此时括号自动充当分隔符 - 用反引号或双引号包裹字段名:
select`version`()或select"version"()(需确认数据库是否启用ANSI_QUOTES) - 避免用
+——它在MySQL中是加法运算符,不是空格等价物;只有在URL编码上下文(如GET参数)中%2B才可能被后端解码为空格
注释符被过滤后的闭合技巧
如果 --、#、/* */ 全被清空或拦截,无法注释掉原始SQL尾部,就不能靠“截断”来控制语句逻辑。
实操建议:
- 改用逻辑闭合:比如原语句是
WHERE id='$id',输入1' and 1=1 and '1'='1,让前后单引号成对闭合 - 用布尔条件补全语法:
1' or 1=1 and 'a'='a,既绕过注释需求,又保持语句合法 - 慎用
;——多数PHP+MySQL环境不支持多语句,且现代WAF普遍拦截分号 - 老系统中
%00(空字符)曾可截断字符串,但PHP 7.4+已禁用,仅限特定CTF或老旧靶机
等价函数与操作符替换
当substring()、or、=被关键词过滤,可换用功能相同但字面不同的表达式。
实操建议:
-
or→||(MySQL)、or→|(某些上下文);and→&& -
=→like(无通配符时行为一致)、rlike、in(如id in (1)) -
substring()→mid()(MySQL)、substr()、left()/right() - 注意Oracle中
||是字符串拼接,不是逻辑或;PostgreSQL中~是正则匹配,不是like等价物
绕过手段的有效性高度依赖目标数据库类型、版本、字符集和WAF规则细节。同一payload在MySQL 5.6和8.0上表现可能完全不同,更别说跨数据库了。别迷信通用payload,先确认数据库指纹,再选对应变形。

















