9-Web安全——SQL注入WAF绕过之select及union过滤

目录

1. select及union过滤绕过

2. 使用URL编码绕过


 

 

1. select及union过滤绕过

 

真实的注入环境中一般无法通过网站的源代码进行安全审计的,那么在注入过程中我们就需要使用常见的SQL注入绕过技巧来帮助我们进行绕过WAF。

 

首先需要判断网页的注入类型,输入参数?id=1%0Aand%0A1=2,测试URL为:

http://www.sqli.com/Less-27/?id=1%0Aand%0A1=2

页面返回的结果如下:

当我们输入id=1 and 1=2时,页面还是正常返回,说明这是一个字符型注入。

 

 

然后判断字符型注入的闭合方式,在前面的学习中说过,如果页面是字符型注入的话,需要考虑以下几种情况:

  1. 单引号闭合需要在后面增加一个单引号即可
  2. 双引号闭合需要在后面注入语句后面增加一个双引号
  3. ('')单引号加括号这种需要多加一个or ('')=('1
  4. ("")双引号加括号这种需要多加一个or ("")=("1

直接输入id=1',判断注入类型:

从mysql报错信息来看,Less-27是使用的“ ’ ”单引号闭合的,红色部分代表我们输入的参数,蓝色的单引号代表后台使用单引号来闭合的。

 

 

输入参数id=1''进行闭合:

页面返回正常,除了以上这种方式,输入id=1'%0Aor%0A'1'='1这种方式同样也能闭合成功。

 

 

接下来判断列数,前面我们说过判断列数方法可以通过group by或order by语句,还有union select语句来做到。

在当前web页面汇使用group by或order by无法看到任何报错信息,因此这里就只能使用union select语句了:

id=1'%0Aunion%0Aselect%0A1,2,3,4%0Aor%0A'1'='1

后台把union select关键字过滤掉了。

 

 

回忆一下之前学过的绕过方式:使用大小写和复写单词,构造sql注入语句如下:

?id=1'%0AUUNIONNION%0ASSELECTELECT%0A1,2,3,4%0Aor%0A'1'='1

页面返回了数据库报错信息,说明select和union成功绕过WAF,使用这种方式同样也能绕过waf:

?id=1'%0AUnioN%0ASeLeCt%0A1,2,3,4%0Aor%0A'1'='1

 

确定了注入点,注入类型,显示位后,就可以获取当前数据库,和数据库下所有表名,列名,以及用户名和密码,这里就不再演示了,交给你们去完成(其实我就是想偷个懒,逃......)。

 

 

2. 使用URL编码绕过

当SQL注入环境中,如果页面不返回任何的信息和数据库,怎么确定当前网站的注入类型:

直接输入参数?id=1' and '1'='1,页面能正常显示返回结果,初步看起来当前网站是使用“ ' ”单引号闭合的。但输入?id=1' and '1'='2的话,页面就不能正常显示返回结果了,也就是说当前网站并不是使用单引号闭合的,但也不可能是数字型注入。

 

 

那换一种思路:输入参数?id=3' and '1'='1 ,web页面的变化如下

按理说,如果当前页面是使用单引号闭合的话,页面应该返回id为3的用户名和密码,但页面仍然是返回的id=1的用户名和密码,因此这里我们猜测是使用了单引号加括号的闭合方式。

分析Less-28源码:

也就是说,之前输入的id=3' and '1'='1,在后台中实际上被替换成这样了(红色部分为替换的$id):

真实的注入环境中如果页面不反馈数据库报错信息,那么就可以通过这种方式进一步判断当前网站的闭合方式。

 

 

 

在注入的时候我们可能会碰到这样一个问题:就是凡事出现union select关键字的地方会被绕过,这种情况下可以尝试使用URL编码绕过:

输入的SQL命令中使用了大小写方式,union select关键字仍然还是被过滤掉了。

 

 

Less-28a源代码:

function blacklist($id)
{
    //$id= preg_replace('/[\/\*]/',"", $id);				//strip out /*
    //$id= preg_replace('/[--]/',"", $id);				//Strip out --.
    //$id= preg_replace('/[#]/',"", $id);					//Strip out #.
    //$id= preg_replace('/[ +]/',"", $id);	    		//Strip out spaces.
    //$id= preg_replace('/select/m',"", $id);	   		 	//Strip out spaces.
    //$id= preg_replace('/[ +]/',"", $id);	    		//Strip out spaces.
    //对于出现的union select,不区分大小写,一律过滤
    $id= preg_replace('/union\s+select/i',"", $id);	    //Strip out spaces.
    return $id;
}

 

这种情况下可以使用URL编码过滤方式进行绕过,将%0A替换成%A0进行绕过:

 

猜你喜欢

转载自blog.csdn.net/qq_35733751/article/details/106522011