sql注入绕过技术

大小写绕过

当访问id=1 and 1=1时返回no back,尝试使用任意关键字大小写绕过,比如将and大写AND(任意字母大小写都可以aNd、And都行),如果id=1 And 1=1返回与id=1相同结果,id=2 And 1=2返回与id=1不同的结果,说明存在SQL注入。后续命令如果被拦截,都进行一定的大小写尝试绕过。

双写绕过

如果访问id=1‘报错,后续访问id=1’ and 1=1也报错,且返回报错的信息只有“1=1”没有and的话,说明and被过滤了,尝试大小写绕过,如果不成功,就尝试双写的方式绕过,比如anandd 1=1,当anandd被过滤中间的and后,就只剩下了and,所以这时传入数据库中的语句是and 1=1,后续思路大差不差,通过返回的报错信息来双写相关语句。

编码绕过

访问id=1‘,发现报错,访问id=1 and 1=1和id=1 and 1=2时,发现关键字and被拦截,先使用大小写和双写的方法尝试绕过,不行的话,将关键词进行URL全编码(这里URL编码要编码两次,因为服务器会自动对url进行一次url解码)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#url编码和全编码的区别

#url编码
#定义
URL编码将URL中的非ASCII字符和特殊字符转换为 % 符号后跟两位十六进制数字的形式。例如,空格会被编码为 %20,问号 ? 会被编码为 %3F。

#示例
如果URL被编码,例如 http://example.com/path?param=value 可能会变成 http://example.com/path?param%3Dvalue,其中非ASCII字符和特殊字符转换为 % 符号后跟两位十六进制数字的形式。


#url全编码
#定义
全编码是指将URL中的所有字符(包括协议,域名,路径和查询参数等)都进行URL编码处理。这种方式将整个URL的所有部分都转换为安全的ASCII字符形式。

#示例
如果整个URL都被全编码,例如 http://example.com/path?param=value 可能会变成 http%3A%2F%2Fexample.com%2Fpath%3Fparam%3Dvalue,其中所有字符都经过了URL编码处理。

and进行两次url全编码后的结果是%25%36%31%25%36%45%25%36%34,所以如果访问id=1 %25%36%31%25%36%45%25%36%34 1=1返回与id=1相同的结果,访问id=1 %25%36%31%25%36%45%25%36%34 1=2返回与id=1不同的结果,说明该网址存在SQL注入漏洞。

内联注释绕过

访问id=1‘,返回MySQL报错,接着访问and 1=1和and 1=2,发现存在关键字拦截,前三种方法都不行时,就尝试使用内联注释绕过,当我们访问以下内容时,页面返回与id=1相同结果,(相关介绍请看前一篇内容mysql相关知识点章节),后续看返回结果确定漏洞存在与否。

1
2
3
id=1 /*!and*/ 1=1

id=1 /*!and*/ 1=2

修复建议

过滤危险字符

使用预编译语句