SQL注入的绕过技术
大小写绕过
SQL语句是不区分大小写的,如果过滤器通过关键字进行过滤并没有识别大小写,我们就可以使用大小写进行绕过,对特殊字符进行大小写混写
select * from users where id=1 AnD 1=1;
and与or
过滤注释
– # 注释不能用导致了什么问题?
会导致无法注释后面的’ 导致SQL语句报错,注入后无法正常的执行
$reg = "/#/"; 规则1
$reg1 = "/--/"; 规则 2
$replace = "";;“匹配到之后替换为什么内容?
$id = preg replace(/#/, "", $id);
$id = preg replace(/--/. "", $id);
and
preg_replace(mixed $pattern,mixed $replacement, mixed $subject):执行一个正则表达式的查找和替换``
正常闭合SQL语句让SQL语句可以成功执行
双写绕过
$id= preg_replace('/or/i',"", $id);
$id= preg_replace('/AND/i',"", $id);
return $id;
只过滤一遍,过滤了关键词and or
如果 or可以替换为 ‘’ ‘’,可以写为 oorr 中间的替换为’’ ‘’,外侧字母为or
and替换为anandd
等价替换绕过
and && 如果报错可以采用编码
or ||
异或
^ xor
思路:寻找能够替代的方法
空格被过滤怎么处理?
id=1’unionselect 空格被过滤后,输入的语句无法识别
空格 %20
用户输入空格 URL内是%20 服务器收到%20 还原成空格 代码处理
1.使用+替代
2.%09 %20 %0A %0B %0C %0D %A0,经测试后 %0B ,%A0成功纪律更大
3.注释可以等价空格 /注释内容/ 把20%替换为/**/
MySQL宽字符绕过
字符编码 默认GBK 一个字符用两个字节
UTF8 一个字符默认三个字节
PHP和MySQL大部分情况默认GBK或UTF8
宽字节注入存在场景限制
1.PHP和MySQL编码为GBK
2.addslashes()转义的SQL注入
输入 1'union
addslashes(1'union)
经过转义后为1\'union
SQL注入报错
由于\是一个字节,在前面再添加一个编码两个字节组成一个汉字
\ %5C
df5c
id=‘運’ union select 1,2,3
区间是81-FE ascii码大于127
81’
81’ 815c’