sqli-labs less24

管理员 2020-01-02 PM 169℃ 0条

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可以随意更改登录用户的账户,从而造成信息泄露或者财产损失。

关于二次注入的更多细节可以在网上查找更多的资料。

标签: 二次注入

非特殊说明,本博所有文章均为博主原创。

上一篇 sqli-labs less25
下一篇 sqli-labs less23

评论啦~