1.这题比较像我们渗透测试中实际的环境。有注册、登录、修改密码、找回密码
登录界面
找回密码界面,没什么鸟用
注册界面,通常这是突破口
登录成功后的修改密码界面,
2.首先在登录的用户名跟密码框进行注入测试,均被无情嘲讽
查看后端代码后得知这里使用了mysql_real_escape_string()函数对输入的数据如果包含特殊字符就进行转义,所以这突破不了
$username = mysql_real_escape_string($_POST["login_user"]);
$password = mysql_real_escape_string($_POST["login_password"]);
3.然后我去注册用户的那里,输入用户名 admin 密码admin 发现弹窗,说用户名已存在。
4.然后我把用户名改为 amdin' 再注册,神奇的来了,居然注册成功。
发现我们的注册信息原封不动存入了数据库
然后我以 admin' 这个用户登录,居然登录成功了
然后我注册一个 admin'#的用户,密码是admin 。注册成功并且存入了数据库的user表
登录成功,尝试修改密码
我把 admin'# 这个用户的密码修改为 passord看看会发生什么
提示密码修改成功
然后我使用 账户 admin'# 密码password登录失败,这是为什么呢?
我又使用修改前的密码 admin登录,发现登录成功。这到底是怎么回事呢?我刚才不是修改密码成功了吗。
带着这个疑问,我们可以直接查看数据库中的users表,神奇的来了,发现没有,我们要修改的 admin'# 密码没变,反而把 admin 这个用户的密码改了
答案就在这句修改密码的关键sql语句中
UPDATE users SET PASSWORD='$pass' where username='$username' and password='$curr_pass';
是不是看到了熟悉的单引号?
问题就出在下面的代码中
他把数据库中的username 原封不动的拿了出来没有经过任何处理,存进去没做处理,拿出来也没做处理,这是多么危险的操作。
当我们修改 admin'# 的密码为password时,实际上mysql执行的语句是这样:
UPDATE users SET PASSWORD='password' where username='admin'#' and password='password';
也就是说注释符后面的被注释掉了,成了:
UPDATE users SET PASSWORD='password' where username='admin';
这便是二次注入(也叫存储注入),存入数据库时是无害,但把他拿出来二次执行时,便成了隐患。
这是个大问题,通过这个漏洞,hacker可以随意更改登录用户的账户,从而造成信息泄露或者财产损失。
关于二次注入的更多细节可以在网上查找更多的资料。