Bugku-login1(SKCTF)(SQL约束攻击)
原因
sql语句中insert和select对长度和空格的处理方式差异造成漏洞。
select对参数后面的空格的处理方式是删除,insert只是取规定的最大长度的字符串。
逻辑
1、用
select *** from table where username='$username'
检测输入的用户名,如果存在,说明注册过,则提示用户名已存在。
2、若用户名不存在 ,那么在注册的时候用
insert into table values('$username','$password')
将注册的用户名和密码插入数据库中。
漏洞分析
假设数据库中存在一个admin,而且最大的限制长度是25,我们在注册的时候输入用户名admin[20个空格]1,密码随意输入。那么数据库在判断我们注册的用户名是否存在时,使用select语句,那么空格就会被删除,剩下admin1。这时因为数据库中只有admin,所以会被注册成新用户,但在注册的时候用的是insert语句,不删除空格,只取最大字符串,那么我们实际注册的用户名就是admin[20个空格]。
在登陆的时候select语句查找,以为查找的时候select回删除空格,就会返回两个admin,一条是真正的admin,另一条是admin[20个空格],那么我们就可以用admin和我们自己的密码登录了。
例子:Bugku-login1(SKCTF)
先正儿八经的注册一个账号,发现提示不是管理员还想看flag?!,根据sql约束攻击的套路,我们注册一个admin[空格](因为是管理员账号,所以猜已经存在了一个admin用户),注册的时候insert会取最大字符串,所以我们会注册一个用户名为admin[空格]的用户。再返回登录页面,用admin[空格]登录,select在查找的时候会去掉空格,那么就会用admin管理员账号登录,得到flag.