0x00 奉上源码
0x02 解题过程
这题源码看上去虽然比较长,但是其中大多是正常的sql执行语句,和一些简单的get,post之类的语句
简单解释一下这个过程,首先注册,账号密码,如果账号重复会出现 user already exists的问题,密码方面,如果密码的长度小于8的话,会出现password too short的问题。然后登陆,如果不是以admin的账户登陆的话,会出现you are not admin的问题,所以说,这个题目要解出来,就必须以admin的账户登陆。
显而易见,我们这里如果注册admin的话,肯定是已经被注册掉的,所以需要换个思路,看了半天代码没发现什么,后来发现有个注释被我忽略了,来一下这个注释
导致注入的一点的地方是这里的一句注释
// SQL schema: create table users(username varchar(25), password varchar(25));
这行导致了类似于sql约束攻击的存在
首先我们得知道,sql数据库处理数据的时候,会把字符串后面的空格忽略掉,比如说"hello"和"hello "是一样的,所以说这里我们可以用这个来进行注入
可以看到这里数据库提取前25个字符,所以我们设计一个以admin开头,并且后面跟一串空格,超过25位时,加一个任意字符,就可以成功
原因是这样的,admin(插入20个或以上个空格)后面加一个任意字符,比如admin a,这个用户名和admin是不一样的,但是数据库只接受前25个,所以它就收录了,admin和一串空格,但是上面提到过,会忽略掉空格,所以这个方法就可以让我们伪装成admin来登录,所以我们注册admin a为用户名,123456789为密码,登录的时候用admin即可,密码当然是123456789,于是结果就出来了。