这个关卡可能有时候会出现一些小问题,有时候登陆后是没有修改密码的选项的,这是因为有时候解压时logged-in.php文件解压不正确,重新解压即可
本关卡为二次注入,其产生原因是:服务器端虽然对用户的直接输入做了一些过滤或者将一些字符进行转义,但是对于已经存入数据库的信息是完全信任的,即:不校验数据库信息是否合法
先来看看本关卡关于修改代码的部分:
UPDATE users SET PASSWORD='$pass' where username='$username' and password='$curr_pass'
这是一个看起来很正常的更新密码的update操作,通过输入用户名以及旧密码才能够成功修改密码,但是如果用户名是 admin’# 呢?
这时候该语句便成为了如下所示:
UPDATE users SET PASSWORD='$pass' where username='admin'#' and password='$curr_pass'
该语句实际执行代码如下:
UPDATE users SET PASSWORD='$pass' where username='admin'
后面的那部分已经被 # 注释掉了,这个时候应该看出问题来了,这个修改密码的update操作并不需要旧密码,仅仅有用户名即可修改密码
有了上面的讲解,本关卡的思路也是很明了了,通过构造一些特殊的用户名,使得在更新用户名时将update语句进行闭合,从而成功做到免密修改密码
我们假设我们的目标用户是 admin ,那么我们便需要注册一个 admin’# 用户
注册成功之后,我们便使用该账号进行登陆
接下来便是修改密码,这三个文本框我的填法如下:
Current Password:admin’#
New Passwoord:111111
Retype Password:111111
此时update语句如下:
UPDATE users SET PASSWORD='111111' where username='admin'#' and password='123456'
此时我们修改的其实并不是 admin’# 的密码,而是 admin 的密码,而且通过 ‘# 将其原密码进行注释,从而可以完成对 admin 密码的修改,语句成功执行后,数据库信息如下
可以看到,这里 admin’# 的密码并没有改变,而 admin 的密码却已经被成功改变,接下来便可以使用 admin 用户成功登陆,本关结束