绕过授权验证—Web安全深度剖析(4)

发表于:2015-5-12 10:45

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:张炳帅    来源:51Testing软件测试网原创

分享:
  (51Testing软件测试网获电子工业出版社和作者授权连载本书部分章节。任何个人或单位未获得明确的书面许可,不得对本文内容复制、转载或进行镜像,否则将追究法律责任。)
  此段代码中最大的BUG在于程序中并没有进行二次密码验证,也就是原密码验证,如果对密码进行二次验证,则不会存在任意密码修改漏洞,增加二次密码验证的代码如下:
public String  execute(){
int id = Integer.parseInt(request.getParameter("userId"));
String oldpass = request.getParameter("oldpass");
User  u  = new UserBiz().findUserById(id);    //根据ID查找用户
if(!(u.getPassword().equals(oldpass))){      //比较原密码是否相同
return "-1";
}
String password = request.getParameter("password");
String password2 = request.getParameter("password2");
if(!("".equals(password)||"".equals(password2))){
return "0";
}
if(!password.equals(password2)){
return "0";
}
u.setPassword(password);
boolean flag = new UserBiz().saveOrUpate(u);   //保存或者更新User对象
if(flag){
return SUCCESS;
}else {
return ERROR;
}
}
  以上代码必须输入原始密码才可以修改密码,如果你希望不输入原始密码就使用该功能,可以通过Session来实现,当用户登录成功后,就将用户信息放到Session中,当进行修改密码的操作时,将用户信息从Session中取出即可,虽然这样可以不输入旧密码就能修改密码,但不建议这样做,因为无法确定修改密码的用户一定是本人。
  4.垂直越权示例
  垂直越权的漏洞也不少见,下面将以向上越权为例,分析垂直越权。
  后台管理页面一般只允许管理员访问,如果普通用户可以访问,就存在向上越权漏洞。
  解决向上越权是比较容易处理的事情,如果管理员表与普通用户表是同一张数据库表,就必须要存在权限验证字段,权限验证字段用来区分是否为管理员。
  以Java为例,做一个Filter即可,当用户登录后,就把此用户的信息放到Session中,当访问设定路径时,过滤器就起作用了,CheckAdmin代码如下:
public void doFilter(ServletRequest req, ServletResponse res,
FilterChain filter) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse) res;
User user = (User) request.getSession().getAttribute("user");
if(user==null){
request.getRequestDispatcher("/").forward(request, response);//  跳转操作
}
boolean flag = user.getIsAdmin();
if (flag) {
filter.doFilter(request, response);
} else {
request.getRequestDispatcher("/").forward(request, response);//  跳转操作
}
}
  以上代码中的getIsAdmin()就是用于判断是否为管理员。
  如果不是一张表,就更容易操作,在过滤器中直接取出管理员信息即可,代码如下:
public void doFilter(ServletRequest req, ServletResponse res,
FilterChain filter) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse) res;
Admin admin =    request.getSession().getAttribute("admin");
if (admin!=null) {
filter.doFilter(request, response);
} else {
request.getRequestDispatcher("/").forward(request, response);//  跳转操作
}
}
  Filter路径配置如下:
  <filter>
  <filter-name>checkAdmin</filter-name>
  <filter-class>com.xxser.filter.CheckAdmin</filter-class>
  </filter>
  <filter-mapping>
  <filter-name>checkAdmin</filter-name>
  <url-pattern>/admin/*</url-pattern>
  </filter-mapping>
  当访问admin路径下的所有资源时,将自动调用CheckAdmin过滤器。如果你使用的是Struts2框架,也可以使用Struts2自带的拦截器。拦截器与过滤器存在的意义相同。
本文选自《Web安全深度剖析》第十章,本站经电子工业出版社和作者的授权。
版权声明:51Testing软件测试网获电子工业出版社和作者授权连载本书部分章节。
任何个人或单位未获得明确的书面许可,不得对本文内容复制、转载或进行镜像,否则将追究法律责任。
预防跨站请求伪造—Web安全深度剖析(3)
22/2<12
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号