1、堆叠注入。
数据库查询语句语法是以分号;结尾。当数据库中出现允许多条查询语句同时成立时候,就能使用堆叠注入。
正常情况:
select * from users where id='1';
堆叠注入情况:
select * from users where id='1';insert into ....#';
演示案例:sqli-lab less38
-1'; insert into users (id,username,password) value (38,'admin38','pass38')%23
原因是我们的输入被放置在 mysqli_multi_query()中了,被允许执行多条数据库查询语句
2、二次注入
如果在初始输入点遇到有sql注入防护的时候,比如addslashes(),我们输入的单引号会被转义,变成反斜杠'。其问题就在于当初始输入被转义后存入数据库中的时候,数据库保存的时候会把\去掉,那一旦我们再次调用该数据的时候,就会形成二次注入。
演示案例:sqli-lab less24
通过对网站的观察,发现有个登陆口,有个注册口,登录后可以修改密码。刚好符合二次注入的场景
我们的攻击目标是 管理员账号admin
首先注册 admin '# ,密码随意,注册成功后,在数据库中显示的就是:
admin '#
然后使用上述账户登录,修改密码,此时数据库的查询就变成:
update users set password='123456' where username = 'admin'' #;
通过上述语句可以看出,实际上'闭合前面的单引号,#注释了后面的单引号,最终修改的username就变成了admin了,也达到了我们在不知道管理员密码的情况下重置了他的密码。
3、宽字节注入
所谓宽字节,主要出现在中文页面上,因为汉字字符的关系,中文编码会占用2个字节位,编码使用的是GBK编码,会把两个字符组合一个汉字。
宽字节注入的产生也是因为对引号的过滤,在url编码中,\的编码是%5c,而'的编码是%27,当被addslashes等过滤手段过滤后,本来输入的: 1' =》1'=>1%5c%27,这本来是一种很好的防御手段。可是在宽字节编码中,%5c恰好可以和其他字符组成一个宽字节汉字。当我们输入1%df'的时候:=>1%df%5c%27 =>1(宽字节)%27,这样就使我们的单引号脱离了反斜杠的束缚,形成特殊字符注入。
以kuan.php为例:
想使用常规的sql注入语句的时候,输入id=1' ,其在数据库中就变成:
select * from wuser where id ='1\''
当使用宽字节注入,输入id=1%df',其在数据库中就变成:
select * from wuser where id ='1運''
接着就可以继续使用常规的sql注入来攻击,输入id= -1%df' union select 1,2,3%23:
select * from wuser where id ='-1運' union select 1,database(),3#'
在sqli-lab less33中,也有类似的应用
4、urldecode编码注入
这种注入的场景主要出现在有urldecode()解码函数的地方。正常的话,浏览器在接收到http请求的时候,特殊字符都是通过url编码的,浏览器会自动解一次码。