2026-10-24 06:33:42
通过 SQL 函数绕过 SQL 注入 WAF 的案例研究主要涉及利用数学/逻辑运算、数据库函数、非法参数类型、NULL 值替代及 0xHEX 编码等技术,绕过 WAF 对恶意 SQL 语句的检测规则。 以下是具体案例及分析:
一、利用数学/逻辑运算绕过 WAFWAF 常通过检测关键字(如 AND 0)或简单逻辑表达式阻断 SQL 注入,但通过数学运算或复杂逻辑可绕过规则。
算术运算替代 AND 0使用 1*0、1-1、0/1 等数学表达式替代直接使用 0,避免触发 WAF 对 AND 0 的检测。示例:
此查询通过 1*0 生成 0,保持逻辑为假且不触发 WAF。
逻辑运算符组合利用 AND、OR 的逻辑等价性构造复杂表达式。示例:
通过 (1=0 or 1=1) 绕过对简单 AND 0 的检测。
数据库函数(如 MOD()、POINT()、POWER())可生成特定值,替代直接使用 0 或 NULL。
MOD() 函数MOD(a, b) 返回 a 除以 b 的余数,可通过参数设计使结果为 0。示例:
MOD(29,9) 结果为 2(此处示例可能有误,实际应为 MOD(27,9)=0),但原理是通过函数生成特定值绕过检测。
POINT() 函数POINT(x, y) 生成空间坐标点,但部分数据库可能将其转换为数值或字符串处理。示例:
通过 POINT(29,9) 生成非零值,但结合上下文可能绕过 WAF 对 0 的检测。
POWER() 函数POWER(a, b) 返回 a 的 b 次方,可通过参数设计生成大数或特定值。示例:
POWER(5,5) 结果为 3125,但结合其他操作可能绕过检测。
通过构造数据类型不匹配的查询,使 WAF 因解析失败而放行。
数据类型混淆在参数中混入非预期数据类型(如字符串、函数调用),干扰 WAF 的规则匹配。示例:
% 是取模运算符,但混入 point(29,9) 可能使 WAF 无法正确解析。
位运算符替代使用 &(位与)、|(位或)替代逻辑运算符,绕过对 AND、OR 的检测。示例:
通过 & 结合 point(29,9) 构造复杂表达式。
直接使用 NULL 易被 WAF 检测,但可通过替代方式(如 0、false、CHAR())绕过。
用 0 替代 NULL在 UNION SELECT 中使用 0 替代 NULL,避免触发对 NULL 的检测。示例:
UNION SELECT 0,0,0,0完整示例:
用 false 替代 NULL部分数据库支持 false 作为布尔值,可替代 NULL。示例:
UNION SELECT false,false,false,false完整示例:
用 CHAR() 函数生成 NULL 等价值通过 CHAR(0) 或 CHAR(0x4e554c4c)(NULL 的十六进制表示)生成 NULL。示例:
UNION SELECT char(0),char(0),char(0),char(0)完整示例:
将关键字或函数参数转换为十六进制格式,避免 WAF 对明文字符的检测。
通过数学/逻辑运算、数据库函数、非法参数类型、NULL 值替代及 0xHEX 编码等技术,可有效绕过 WAF 对 SQL 注入的检测。但需注意,这些技术仅用于安全研究,实际攻击可能违反法律。 防御方应结合 WAF 规则更新、输入验证、参数化查询等措施提升安全性。