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 | #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 | id=1 /*!and*/ 1=1 |
修复建议
过滤危险字符
使用预编译语句