这里我还没有配置好书中所测试的环境,所述的测试地址目前无法连接。我便记录了书中提到的测试步骤及调试方法,方便日后查看和演练。如果有配置了环境的小伙伴们可以一试。
1.大小写绕过注入
大小写绕过注入的测试地址:http://127.0.0.1/sql/1.php?id=1
访问id=1',页面报出mysql错误;访问id=1 and 1=1,页面返回"no back",显然信息被拦截了,说明关键词有过滤。使用关键词大小写方式尝试绕过,如And 1=1,访问id=1 And 1=1 时页面返回与id=1相同的结果,访问id=1 And 1=2 时页面返回与id=1不同的结果,得出存在SQL注入漏洞的结论。
使用order by 查询字段数量,发现会被拦截,利用修改关键字大小写来绕过它。当order修改为Order后,页面显示正常,说明by并没有被拦截,可查询到数据库表中存在的字段数。
接着,使用union方法完成此次注入,如果仍遇到关键字被拦截,可尝试适应修改大小写的方式绕过拦截。
2.双写绕过注入
双写绕过注入的测试地址:http://127.0.0.1/sql/2.php?id=1
访问id=1',页面报出mysql错误;访问id=1 and 1=1,仍然报出MySQL的错误,错误信息中显示输入的and 1=1 变成了1=1.可知关键字and 被过滤了,尝试使用双写的方式绕过,如anandd 1=1,当and 被过滤后,anandd变成了and,这是传入数据库中的语句是and 1=1 便可成功执行并返回页面。
接着,输入anandd 1=2,返回错误信息,判断页面参数存在SQL注入漏洞。
当访问id=1 order by 3,MySQL的错误信息若为“der by 3”,只需双写or , 如“ororder by 3”便可,后面的注入过程与Union注入一致。
3.编码绕过注入
编码绕过注入的测试地址为:http://127.0.0.1/sql/3.php?id=1
访问id=1',页面报出mysql错误;访问id=1 and 1=1和id=1 and 1=2 时,发现关键字and 被拦截。尝试使用URL全编码的方式绕过拦截。由于服务器会自动对URL进行一次URL解码,所以需要把关键词编码两次。注意URL编码需选择全编码,而不是普通的URL编码。
后面的注入过程与Union注入的一致,只需判断过滤的关键词,并经过两次URL全编码即可。
4.内联注释绕过注入
内联注释绕过注入的测试地址: http://127.0.0.1/sql/4.php?id=1
访问id=1',页面报出mysql错误;访问id=1 and 1=1和id=1 and 1=2 时,发现页面提示" no hack ",即关键字被拦截。尝试使用内联注释绕过。访问 id=1/*!and*/1=1时,页面返回与 id=1相同的结果;访问 id=1/*!and*/1=2时,页面返回与 id=1不同的结果。
后面的注入过程与Union注入的一致。
5.SQL注入修复建议
(1)过滤危险字符
多数CMS都采用过滤危险字符的方式。如,采用正则表达式匹配union,sleep,load_file等关键字,如果匹配到,则退出程序。
使用过滤的方式,在一定程度上可以防止SQL注入漏洞,但仍然存在被绕过注入的可能。
(2)使用预编译语句
其实就是使用PDO预编译语句,注意不要将变量直接拼接到PDO语句中,而是使用占位符进行数据库的增删改查。