楼主你的如下博客中的代码有安全漏洞
2016-09-12 21:22
495 查看
楼主你的如下博客中的代码有安全漏洞:
http://blog.csdn.net/xyang81/article/details/7727141
------------------------------------------------------------------------------------------
如果用户张三将邮件中收到的链接中的id或username改成别人的(如李四的),就能够:
1,
将其他用户(李四)已经验证的邮箱再变为未验证的状态
2,
查看其他用户(李四)的数据,因为他已经用李四的身份登录了,只是他(李四)的邮箱状态为未认证,权限有限制而已
3,
重设其他任何用户的密码,只要知道其username即可
------------------------------------------------------------------------------------------
1和2的证明如下:
http://localhost:8080/AccountActivate/activateAccount?id=800&checkCode=any_thing_here
上面id=800,而800是李四的,
张三用上面修改过id的链接访问网站,
在ActivateAccountServle中
User user = userDao.findUserById(id);
user.setActivated(GenerateLinkUtils.verifyCheckcode(user, request));
userDao.updateUser(user);
request.getSession().setAttribute("user", user);
request.getRequestDispatcher("/accountActivateUI").forward(request, response);
代码中未加判断,直接把李四的activated状态给set了, 由于checkCode的值是随便写的,或者是张三自己的checkcode,
verifyCheckcode()会返回false
那么李四的activated被设置为false,即邮箱状态又变成未验证了,因为update到DB里了.
更可怕的是,李四的user信息直接被存到session中去了,也就是说张三直接以李四的身份登录了
那么他可以做很多事情,只要不是那些要求邮箱必须为验证状态的事情,张三都可以做.
例如查看李四的账号信息,业务信息等.
当然这只是粗心所致,修改起来也很简单:
只要才上述几个步骤前加如下判断即可
if(GenerateLinkUtils.verifyCheckcode(user, request)){
//上面那些代码应放到这里
}
------------------------------------------------------------------------------------------
3的证明如下:
用户点击重置密码的链接后, servlet中没有检查checkcode的值, 所以无法判断此链接是否是伪造的,见下图
![](https://img-blog.csdn.net/20160913214453141)
即使上面判断了checkcode也不行,因为你在用户重置密码时,所修改的用户名居然是让用户自主提交的.
![](https://img-blog.csdn.net/20160913211450878)
String userName = request.getParameter("userName"); //这里的用户名来自客户提交的表单
String newPassword = request.getParameter("newPassword");
String newPassword2 = request.getParameter("newPassword2");
UserDao userDao = UserDaoImpl.getInstance();
User user = userDao.findUserByName(userName); //根据此用户名得到User
user.setPassword(newPassword); //然后未经判断,直接把此用户的密码给改掉了, 这样任何一个用户都可以修改其他人的密码了,只要得到别人的用户名.
解决方法: 通过验证码锁定用户信息后,将User对象存在session里,始终不要发给客户端, 注意:千万不要把此用户名发的客户端的hidden中,因为hidden是不安全的,客户可以通过源代码看到并很容易在提交前篡改.
http://blog.csdn.net/xyang81/article/details/7727141
------------------------------------------------------------------------------------------
如果用户张三将邮件中收到的链接中的id或username改成别人的(如李四的),就能够:
1,
将其他用户(李四)已经验证的邮箱再变为未验证的状态
2,
查看其他用户(李四)的数据,因为他已经用李四的身份登录了,只是他(李四)的邮箱状态为未认证,权限有限制而已
3,
重设其他任何用户的密码,只要知道其username即可
------------------------------------------------------------------------------------------
1和2的证明如下:
http://localhost:8080/AccountActivate/activateAccount?id=800&checkCode=any_thing_here
上面id=800,而800是李四的,
张三用上面修改过id的链接访问网站,
在ActivateAccountServle中
User user = userDao.findUserById(id);
user.setActivated(GenerateLinkUtils.verifyCheckcode(user, request));
userDao.updateUser(user);
request.getSession().setAttribute("user", user);
request.getRequestDispatcher("/accountActivateUI").forward(request, response);
代码中未加判断,直接把李四的activated状态给set了, 由于checkCode的值是随便写的,或者是张三自己的checkcode,
verifyCheckcode()会返回false
那么李四的activated被设置为false,即邮箱状态又变成未验证了,因为update到DB里了.
更可怕的是,李四的user信息直接被存到session中去了,也就是说张三直接以李四的身份登录了
那么他可以做很多事情,只要不是那些要求邮箱必须为验证状态的事情,张三都可以做.
例如查看李四的账号信息,业务信息等.
当然这只是粗心所致,修改起来也很简单:
只要才上述几个步骤前加如下判断即可
if(GenerateLinkUtils.verifyCheckcode(user, request)){
//上面那些代码应放到这里
}
------------------------------------------------------------------------------------------
3的证明如下:
用户点击重置密码的链接后, servlet中没有检查checkcode的值, 所以无法判断此链接是否是伪造的,见下图
即使上面判断了checkcode也不行,因为你在用户重置密码时,所修改的用户名居然是让用户自主提交的.
String userName = request.getParameter("userName"); //这里的用户名来自客户提交的表单
String newPassword = request.getParameter("newPassword");
String newPassword2 = request.getParameter("newPassword2");
UserDao userDao = UserDaoImpl.getInstance();
User user = userDao.findUserByName(userName); //根据此用户名得到User
user.setPassword(newPassword); //然后未经判断,直接把此用户的密码给改掉了, 这样任何一个用户都可以修改其他人的密码了,只要得到别人的用户名.
解决方法: 通过验证码锁定用户信息后,将User对象存在session里,始终不要发给客户端, 注意:千万不要把此用户名发的客户端的hidden中,因为hidden是不安全的,客户可以通过源代码看到并很容易在提交前篡改.
相关文章推荐
- 专家提醒:博客网站中存在的安全漏洞隐患
- php中使用in_array易产生代码安全漏洞
- bash代码注入的安全漏洞
- X.Org的新安全漏洞,最早上溯到1987年的代码
- Bash 远程任意代码执行安全漏洞(最严重漏洞)
- 检查代码是否存在整数操作安全漏洞
- Bash代码注入安全漏洞{Cool}
- bash代码注入的安全漏洞
- 微软2月补丁星期二推出12款安全补丁:主要针对执行代码漏洞
- 一时兴致偷了哈sina的博客文章,代码如下
- 从团购网的漏洞看网站安全性问题 -- 安全 -- IT技术博客大学习 -- 共学习 共进步!
- 亿能测试 发布 《Java常见安全漏洞与代码审查CheckList》 V1.0
- 由Strurts2漏洞引开谈谈web代码安全问题
- bash代码注入的安全漏洞原理详解
- Bash 远程任意代码执行安全漏洞(最严重漏洞)
- PHP惊现安全漏洞 易执行恶意代码和DoS攻击
- Android常见的漏洞与分析(阿里聚安全博客文章)
- ASP.NET(C#)后台安全登陆代码(防XSS攻击\万能密码漏洞)
- bash代码注入的安全漏洞
- bash代码注入的安全漏洞