此段代码中最大的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软件测试网获电子工业出版社和作者授权连载本书部分章节。
任何个人或单位未获得明确的书面许可,不得对本文内容复制、转载或进行镜像,否则将追究法律责任。