当数据库字符串长度过短,并且后端没有对字符串进行长度限制时
CREATE TABLE users( username varchar(20), password varchar(20) )
漏洞代码逻辑如下:
代码由登录和注册构成
- 用
select * from table where username='$username'
检测你输入的用户名,如果存在,说明你注册过,那么不让你注册。
- 用户名不存在,用
insert into table values('$username','$password')
把你输入的用户名密码插入数据库。
- INSERT和SELECT语句执行不一样造成
- INSERT语句:截取前20个字符
- SELECT语句:输入什么就是什么
当我们注册时字符串长度超过20,那么使用SELECT检测时就会不存在,那么就使用INSERT插入,这时候由于长度超过20,截取前20个字符。
大致流程:注册admin a -> SELECT认为不存在 -> INSERT了前20位 -> 使用自己注册的admin和对应密码进行登录
INSERT插入了admin+15空格,实际上是插入了admin,末尾的空格会被MySQL忽略掉,这样就修改admin的密码了