本文以联合查询关键字union select为例讲解绕过关键词过滤的一些方法。之所以了解绕过,关键是发现sqlmap有时候真的是不靠谱,只能指定命令跑。有一些简单过滤很容易绕过却不能检测。虽然麻烦点,手工yyds~~。
1、大小写变种
UNION SELECT=>uNIon SElecT
选择几个字母变换大小写,可以绕过部分不太聪明的过滤器。在sql查询中是不区分大小写的所以查询语句正常执行
2、使用SQL注释
union select=>/**/UNION/**/SELECT/**/
在每个需要使用“空格”隔开的地方将“空格”换成/**/(mysql、orcale数据库中的注释符号其他数据库同理)因为一些过滤器是检查你的每个关键词后边是不是存在“空格”。
3、使用URL编码
union select=>%75%6e%6f%69%6e %73%65%6c%65%63%74
每次输入URL浏览器都会自动进行一次URL解码。这样我们在URL栏中输入的内容就不会出现那些被过滤的关键词了
4、使用动态查询(用数据库中的一些函数)
前提是知道有什么函数,这就需要用到前期收集信息时候了解到的数据库种类及版本了
mysql:union select=>'uni'+'on' 'sele'+'ct'
orcale:union select=>'uni'||'on' 'sel'||ect'' select=>cha(83)||cha(69)||cha(76)||cha(69)||cha(67)||cha(84)
MS_SQL:union select=>'uni''on' 'sele''ct' select=>char(83)+char(69)+char(76)+char(69)+char(67)+char(84)
这样就可以绕过那些过滤含有完整的select或union关键词的过滤器了
5、绕过剥离关键词(套娃)
union select=>uniunionon seselectlect
可以绕过那些剥离关键词之后传入查询的过滤器当ununionion中的完整union被过滤掉之后就得到了我们想使用的关键词
6、使用空字节
union select=>%00 union select
在过滤器过滤的关键词前面加上URL编码的空字节%00即可。因为性能原因一些过滤器用的语言往往是C/C++,在C/C++中空字节代表语句的结束(过滤结束)。而SQL语句对空字节的解释则不同,它会继续执行后边的代码
有时候想要绕过注入不是单单靠一种方法就可以的(因为你想到的大部分做防护的也可能想到)可以尝试联合这几种过滤方法一起使用。如果实在不行~~ 还可以盲注嘛~~
参考《SQL注入的攻击预防》Justin Clarke