概述
一)SQL注入绕过手段
1)大小写绕过
2)双写绕过
3)编码绕过
4)内联注释绕过
5)去除注释符的代码分析【less-23】
a)绕过去除注释符的SQL注入
b)sqlmap安全检测
6)去除and和or的代码分析【less-25】
a)绕过去除and和or的SQL注入
b)sqlmap安全检测
7)去除空格的代码分析【less-26】
a)绕过去除空格的SQL注入
b)sqlmap安全检测
8)去除union、select的代码分析【less-27】
a)绕过去除union、select的SQL注入
b)sqlmap安全检测
二)补充知识
————————————————————————————————————————————————————————
一)SQL注入绕过手段
1)大小写绕过
如果程序中设置了过滤关键字但是过滤过程中并没有对关键字组成进行深入分析过滤,导致只是对整体进行过滤。例如:and 过滤,也就是说只是发现关键字出现并不会对关键字处理,对于这种方式的过滤我们可以采用“ 大小写绕过 ”这种过滤措施,例如:And 1=1 ,OrdEr by。
2)双写绕过
如果在程序中设置出现关键字之后就将其替换为空(例如:一旦出现关键字“ union ”就将其替换为“”(空)),那么此时SQL注入攻击也就不会发生了。对于这样的过滤策略我们可以使用双写绕过(例如:一旦出现关键字“ union ”就将其替换为“”那么就使用双写绕过:ununionion,此时过滤策略会将中间的union变成“”(空),之后剩下的un“”ion——>union)。也可以双写绕过结合大小写绕过:UnunioniOn
3)URL编码绕过
我们可以利用网络中的URL在线编码以此绕过SQL注入的过滤机制,如在线编码工具:
https://www.sojson.com/encodeurl.html
或者:http://tool.chinaz.com/Tools/urlencode.aspx
4)内联注释绕过
对于正常的SQL语句来说,注释符是起到解释说明的功能,但是在利用SQL注入漏洞中,注释符起到了闭合单引号、双引号、单括号、多括号等的功能。
在mysql的语法中,有三种注释方法:--空格、--+和#(单行注释)和 /* */(多行注释)
如果在/*
后加惊叹号 ! 意为/* */
里的语句将被执行。(/!内容/这种方法只适用于mysql数据库)
普通注释绕过:
例如:un/**/ion——>union
、se/**/lect ——>select
(常用注释符://,-- (空格) ,/**/, #,--+,-- -,;--a
)
内联注释绕过
例如:http://192.168.67.140/sqli/Less-7/?id=-1' /*!union*/ sel/**/ect 1,2,3 --+
5)去除注释符的代码分析:
上面的代码主要是用于过滤注释符的。
preg_replace(mixed $pattern,mixed $replacement,mixed $subject)——执行一个正则表达式的搜索和替换
解析:
第一个参数是 “指定要搜索的字符或字符串”,
第二个参数是 “要替换的新的字符或字符串”,
第三个参数是 “我们要进行搜索的原字符串”
所以,此时$id中一旦输入了“#”或者“/--/”就会被替换为"",从而使得注释符不生效。
a)绕过去除注释符的SQL注入:
因为网站使用了preg_replace()过滤注释符,那么之前的 --+和–空格等注释符就不能在使用了,所以我们可以使用 or ‘1’='1 去闭合单引号,或者:
http://192.168.67.143/Less-23/?id=-1' union select 1,database(),'3
此时将单引号加在3前面去闭合id=’'中的后一个单引号。
b)sqlmap安全检测:
6)去除and和or的代码分析:
在mysql中大小写不敏感,也就是说大写或者小写的效果是一样的,并且在mysql中可以自动对十六进制和URL编码进行转码识别,所以即使直接将十六进制和URL编码赋给mysql也可以正常执行;同时,在mysql中符号和关键字可以进行等效的替换,也就是说,and和&&等效,or和||等效。
前面我们已经对preg_replace()函数进行了功能和参数的详解,此处就不再累赘解释。以上的代码
中对用于接收用户输入的变量id的值进行了过滤,一旦id中出现了“or”或者“and”(不区分大小写)
就将它们全都替换为""。加上“i”其实是“ignore”就是为了实现不区分大小写的效果。
a)绕过去除and和or的SQL注入:
对于将“and”和“or”进行过滤的机制,如果没有加 “i” 那么可以采用大小绕过过滤,如果加上了 “i” 那么大小写绕过的方法就无效了。
当我们输入 and或者And或者or或者Or发现均无效就说明对 “and” 和 “or” 进行了不区分大小写的过滤:
此时,可以采用以下三种方法:
方法一:(注释符) 在这两个敏感词中添加注释,例如:a/**/nd
,而在mysql中/**/中的内容被注释掉不执行所以有效的还是and,o/**/r
==>or。
方法二:(双写) 利用双写绕过,例如:aandnd
,此时过滤机制会检测到id接收的值中有“and”这个敏感词,所以将它过滤(替换为""),所以此时就剩下aandnd==>and,oorr==>or。
方法三:(符号代替) 利用mysql中的and==&&,or==||,所以如果将“and”和“or”过滤,我们可以采用“&&”和“||”代替。
b)sqlmap安全检测:
7)去除空格的代码分析
第一个是将id中的“or”替换成""(不区分大小写)
第二个是将id中的“and”替换成""(不区分大小写)
第三个是将id中的“/*”替换成“.”
第四个是将id中的“--”替换成""
第五个是将id中的“#”替换成""
第六个是将id中的“s”替换成""(将空格替换)
第七个是将id中的“”替换成""(一旦出现反斜杠就替换)
a)绕过去除空格的SQL注入
当网站对空格进行了过滤时,我们可以采用hex urlencode(十六进制)编码将空格进行url编码。原本的空格可以进行如下的替换(以下均为有效替换):
空格<==>%20
%0a(新建一行)
%09(tab制表符【水平】)
%0c(新建一页)
%0d(return功能)
%0b(tab制表符【垂直】)
此时尝试 发现没有任何效果,因为没过滤了:
尝试一个 '
发现报错信息是“多了一个单引号”,所以存在字符类型的SQL注入:
因为过滤了空格,所以我们可以使用hex编码的 %0a
代替空格,又因为过滤了 or 所以使用 ||
代替or:
也可以使用 %09 (Tab制表符)代替空格:
b)sqlmap安全检测
8)去除union、select的代码分析【less-26】
注意:其中的/s是指区分大小写,也就是说指定过滤“select”和“UIONN”、“Union”那么“Select”、“uNIon”等其他的还是有效的。
a)绕过去除union、select的SQL注入
综合上面的过滤代码,我们使用 %09代替空格,|| 代替 or,union和select采用大小写、双写绕过:
采用union select 时,发现union select不见了(就是被过滤成""了):
所以我们使用大小写绕过:
又发现报错:union和select中间的空格不见了(被过滤了),所以我们用 %09 代替空格:
b)sqlmap安全检测
二)补充知识
https://blog.csdn.net/qq_25899635/article/details/90476644
最后
以上就是拼搏流沙为你收集整理的SQL注入的绕过手段的全部内容,希望文章能够帮你解决SQL注入的绕过手段所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复