SQL注入ByPass的一些小技巧
作者:admin | 时间:2018-3-11 23:02:11 | 分类:黑客技术 隐藏侧边栏展开侧边栏
前言
SQL注入从古至今都是一个经久不衰的影响严重的高危漏洞,但是网络安全发展到现在,如果想通过SQL注入直接获取数据或者权限,多多少少都需要绕过一些网站前面的WAF,无论是基于规则的还是带有自学习的WAF。除了实战中需要绕过WAF,在很多CTF中也需要绕过各种过滤。
所以到最后SQL注入漏洞的利用关键就成了Bypass防御,而Bypass防御方法是在持续攻防对抗中研究出来,可以说SQL注入Bypass是一门艺术。
本文不会给出也不可能给出全部的绕过技巧,只是在最近发现的一些比较有趣且实用的绕过技巧分享给大家,后续发现姿势继续更新。
SQL注入Bypass技巧
注入点识别
SQL注入的第一步就是失识别注入点,一般都是在参数后面简单的and 1=1和and 1=2等来判断是否有注入点或者是否有WAF拦截,如果简单的and 1=1这种被WAF拦截了,可以使用如下方法绕过:
使用这些字符进行注入点识别:
+,-,*,%,/,<<,>>,||,|,&,&&,也可以将and换成or,&&, ||等
也可以不使用and或者or,直接使用异或截断:
1^1^0,1^0^0
还可以使用{``operation}来识别注入点:
上面这些都可以绕过and1=1的拦截进行SQL注入点识别判断。当然更多的情况下是根据实际场景,灵活应用。
空白符
在SQL注入时当空格被过滤了,在MySQL中可以使用:
%09%0A %0B %0C %0D %A0 %20 /**/
注释符
在SQL注入中使用的注释符主要为:#, --+, /*xxx*/, /*!xxx*/, /*!50000xxx*/,在实际场景中可以将这些注释符嵌套应用,会有意想不到的效果,比如只需利用一个*/闭合多个/*!
(此方法目前可以绕过很多WAF哦)
特殊符号
经常在SQL注入时使用一些特殊符号即可绕过很多WAF规则,比如~, !, ``, @``, {x key}, 1.1, 1e1, (), emoji表情符号, @:=等,在实际场景中将这些符号灵活应用就可以绕过很多WAF:
Like和regexp
经常在通过盲注获取数据时需要使用MySQL自带函数,比如substring()等这些处理字符串的函数,但是如果WAF过滤了()时,这些函数就无法使用了导致无法猜测数据,这时可以使用like或者regexp获取数据:
爆库名、表名、字段名
通常情况下我们在手工注入数据库内容的时候都是使用MySQL自带的表名等,如下图:
但是在某些场景中(比如CTF)将MySQL自带的information_schema,SCHEMATA,TABLES,COLUMNS这些禁掉或者过滤了,导致无法使用上面的方法来获取数据库名和表名等内容,那么我们可以使用下面的方法:
爆库名:
原理就是当一个库中不存在的自定义函数他就会爆出当前库中没有此函数,如上图成功爆出ctf数据库名。
爆表名:
这里爆表名可以使用Polygon和linestring函数
爆字段名:
利用下面的方法一次爆出各个字段名:
原理就是在使用别名的时候,表中不能出现相同的字段名,否则就会报错,从而爆出字段名,在使用using函数依次爆出其他字段名。
过滤字段名获取数据
通常情况下获取到数据库名,表名,字段名后,就可以直接查询数据了,但是之前遇到一个场景就是过滤了字符处理函数和字段名,从而导致无法直接获取该字段的内容。场景伪代码如下图所示,通过username字段回显数据,这里我们需要获取password的内容,但是password在filter函数中被过滤了:
下面介绍两种方法在过滤字段名时获取该字段数据。
第一种方法:不适用字段获取数据
原理就是利用虚表e,获取虚表e的第三列数据,在通过便宜获取一个内容,最后将此内容返回到username的位置,最后回显出来。
第二种方法:盲注法
我们来看一个例子:
可以看到,当我们使用order by 3 desc对第三列进行排序的时候,当我们在union里面select的内容不同时,返回的内容也不一样,原因是因为MySQL的字符串排序是从左往右一一使用字符串的ASCII码进行对比。
当我们union select 0x32时回显的username字段内容应该时2,当我们unionselect 0x31和0x30时,username字段内容应该时admin,所以这个时候我们能确定,0x31应该是跟我们需要查询的password的第一个字符的ASCII码值是相等的,从而可以编写脚本一位一位爆破出password的内容:
最后将ASCII码转换成字符串就是我们想获取的字段内容。
其他技巧
因为ByPass技巧方法是需要在持续的攻防对抗中进行总结,验证,积累的,所以没有一种万能的ByPass方法,我们在遇到具体的场景中,跟进实际情况将上面的内容灵活应用,将多种方法结合,比如:
-
过滤逗号了可以使用join;
-
过滤了空格使用其他空白符;
-
过滤了关键字可以使用编码结合注释;
-
过滤常用函数可以找非常用函数代替等等。
最终还是需要结合实际情况,熟练掌握漏洞原理和数据库特性,举一反三灵活多变。