基础知识:基于约束的SQL注入
1.数据库字符串比较:在数据库对字符串进行比较时,如果两个字符的长度不一样,则会将较短的字符串末尾填充空格,使两个字符串的长度一致.
比如这两条语句
select * from admin where username='vampire'
select *from admin where username='vampire '
他们的查询结果是一致的.
2.INSERT截断: 这是数据库的另一个特性,当设计一字段时,我们都必须对其设定一个最大长度,比如CHAR(255),VARCHAR(20),但是当长度超过限制的时候,数据库就会将其截断,只保留限定的长度.(注意这里我们为什么需要insert注入:空格之后一定需要再跟一个或多个任意字符,防止程序在检查用户名是否已经存在时匹配到目标用户)
利用:
假设注=已有一个用户admin password
当我们注册新用户admin ’ 123456时
数据就会保存有
admin password
admin 123456
此时,登录admin便可使用admin 123456
解题思路
发现要注册
注册完后可以登录,但提示想要获取flag的话需要管理员身份,猜测管理员用户名为admin
重新注册
admin 1 //空格是为了截断,1是为了与原有的admin不冲突,不会显示已注册的提示,但是保存时则是admin
123456aA
使用admin 123456aA登录,得到flag