通常,我们在注入时会遇到各种过滤,这时候,我们就需要想办法去Bypass,这次遇到的是很常见的一种过滤,就是过滤了空格,一般的过滤空格的话我们可以使用注释符绕过,也就是用
/**/替代空格
达到注入的目的
但还有的时候,过滤的东西比较多,我们就不能使用了,比如这种过滤的代码
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的情况看看
这就是传入到代码层的变量值,这样看来明明中间就是空格啊,按理说应该会被过滤的
怎么会Bypass呢?
但是,这时候中间的空格却不仅仅只代表一个空格,我们在页面把它输出来
1'�AnD�1=2�union�select�1,user(),3�aNd�'1'='1
中间的空格变成了�
这个可算是一个不成汉字的中文字符了,那这应该就好理解了,因为%a0的特性,在进行正则匹配时,匹配到它时是识别为中文字符的,所以不会被过滤掉,但是在进入SQL语句后,Mysql是不认中文字符的,所以直接当作空格处理,就这样,我们便达成了Bypass的目的,成功绕过空格+注释的过滤