SQL注入绕过技术

目录

1 大小写绕过技术

2 双写绕过技术

3 编码绕过技术

4 内联注释绕过注入

5 SQL注入修复建议

5.1 过滤危险字符

5.2 使用预编译语句


1 大小写绕过技术

访问id=1',发现页面报出MySQL错误,当访问id=1 and 1=1时,页面返回"no hack",显然是被拦截了,说明有关键词被过滤。使用关键字大小写的方式尝试绕过,如And 1=1 (任意字母大小写都可以,如aNd 1=1, AND 1=1等),可以看到访问id=1 And 1=1时页面返回与id= 1相同的结果,访问id=1 And 1 = 2时页面返回与id= 1不同的结果,得出存在SQL注入漏洞的结论。
使用order by查询字段数量,发现还是被拦截了,还是利用修改关键字大小写来绕过它,尝试只改order这个单词,结果发现当order改成Order后,页面显示正常,说明by并没有被拦截,最终通过尝试,发现数据库表中存在3个字段。
接着,使用Union方法完成此次注入,如果仍然遇到关键字被拦截,则尝试使用修改大小写的方式绕过拦截。

2 双写绕过技术

访问id=1',发现页面报出MySQL错误,接着访问id=1 and 1=1,页面依然报出MySQL的错误,但是从错误信息中可以看出,输入的and 1=1变成了1=1。
因此可以得知,关键字and被过滤了。这时尝试使用双写的方式绕过,如aanndd 1=1,当and被过滤后,anandd变成了and,所以这时传入数据库的语句是and 1=1,成功执行并返回正常页面。
接着,输入aandnd 1=2,返回错误信息,判断页面参数存在SQL注入漏洞。当访问id=1 order by 3时,MySQL的错误信息为"der by 3”,这里并没有过滤order整个单词,而是仅过滤or,因此只需要双写or即可。

3 编码绕过技术

访问id=1',发现页面报出MySQL错误,接着访问id=1 and 1=1和id=1 and1=2时,发现关键字and被拦截。尝试使用URL全编码的方式绕过拦截。由于服务器会自动对URL进行次URL解码, 所以需要把关键词编码两次,这里需要注意的地方是,URL编码需选择全编码,而不是普通的URL编码。关键字and进行两次URL全编码的结果是%25%36%31 %25%36%65%25%36%34,访问id=1%25%36%31% 25%36%65%25%36%34 1=1时,页面返回与id=1相同的结果,访问id=1 %25%36%31%25%36%65%25%36%34 1=2时,页面返回与id=1不同的结果,所以该网址存在SQL注入漏洞。后面的注入过程与Union注入的一致,只需判断过滤的关键词,并经过两次URL全编码即可。

SQL注入绕过技术
SQL注入绕过技术

4 内联注释绕过注入

访问id=1',发现页面报出MySQL错误,接着访问id=1 and 1=1id=1 and 1=2时,发现页面提示"no hack" ,即关键字被拦截。尝试使用内联注释绕过。内联注释的相关内容在介绍MySQL的知识点时讲解过。访问id=1/*! and*/1=1时, 页面返回与id=1相同的结果;访问id=1/*! and*/1=2时,页面返回与id=1不同的结果。

MySQL的/*!语法是针对MySQL特定命令的。它旨在让您能够编写可移植的SQL(可以在任何数据库上运行),但仍然能够发送MySQL特殊命令。

5 SQL注入修复建议

常见的SQL注入漏洞的修复方法有两种。

5.1 过滤危险字符

多数CMS都采用过滤危险字符的方式,例如,采用正则表达式匹配union、sleep、load_file等关键字,如果匹配到,则退出程序。

使用过滤的方式,在一定程度上可以防止SQL注入漏洞,但仍然存在被绕过的可能。

5.2 使用预编译语句

其实使用PDO预编译语句,需要注意的是,不要将变量直接拼接到PDO语句中,而是使用占位符进行数据库的增加、删除、修改、查询。