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

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

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

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

  10.2.2  绕过授权验证
  授权在网络上的意思是指,对特定资源的读写权限。通俗地讲,就是你的权限能让你做什么事情。而验证则表示你是否真的可以对这些资源进行读写。这就好比朋友在网上向你借钱,在转账时,你要求用电话确认一下,是否真的是朋友找你借钱,这就是验证。
  授权问题是指访问了没有授权的资源或信息,也叫作越权。顾名思义,越权就是超越原本的权限。越权又可以分为两种:水平越权与垂直越权。接下来,将深入分析水平越权与垂直越权。
  1.水平越权
  例如,http://www.secbug.org提供了用户修改资料的功能,当访问URL:http://www.secbug.org /userinfo.action?id=2时,将会显示自己的信息,并且可以编辑,UserInfo.java源代码如下:
  public String  execute(){
  int id = this.user.getUserId();
  this.user = new UserProxy.findUserById(id);
  return SUCCESS;
  }
  这段代码并没有对ID做任何验证,直接接收用户的ID,然后根据ID来查询用户信息。
  当提交URL为:http://www.secbug.org/userinfo.action?id=3时,程序就会按部就班地执行,返回ID为3的User信息到页面中,这就是水平越权。
  总的来说,水平越权就是相同级别(权限)的用户或者同一角色的不同用户之间,可以越权访问、修改或者删除的非法操作。如果出现此类漏洞,那么将可能会造成大批量数据泄露,严重的甚至会造成用户信息被恶意篡改。
  2.垂直越权
  水平越权是相同级别的用户之间的越权操作,而垂直越权则恰恰相反,是不同级别之间或不同角色之间的越权。
  垂直越权又被分为向上越权与向下越权。比如,某些网站,像发布文章、删除文章等操作是属于管理员做的事情,假设一个匿名用户也可以做相同的事情,这就叫作向上越权。
  向下越权与向上越权恰恰相反,向下越权是一个高级别用户可以访问一个低级别的用户信息。这样做似乎没错,而且很多网站都是这么做的,包括低级别密码也可以被高级别用户掌控,但这样做可以说是完全错误!因为即使权限再低的用户都有他自己的隐私,可能用户为了更方便,会将自己的银行卡号与密码记录在网站中,这些信息都属于用户的隐私。
  3.水平越权示例
  越权漏洞中水平越权访问是最常见的,当然水平越权也包括越权删除、越权修改、越权增加等逻辑漏洞。
  以任意密码的修改为例,UpDataUser.java源码如下:
public String  execute(){
int id = Integer.parseInt(request.getParameter("userId"));
String password = request.getParameter("password");
String password2 = request.getParameter("password2");
if(!("".equals(password)||"".equals(password2))){
return ERROR;
}
if(!password.equals(password2)){
return ERROR;
}
User u = new UserBiz().findUserById(id);  //根据ID来获取User具体对象
u.setPassword(password);
boolean flag = new UserBiz().saveOrUpate(u);//更新对象
if(flag){
return SUCCESS;
}else {
return ERROR;
}
}
  这段代码看起来没有任何错误,而且具有较高的通用性,只要是修改密码操作,均可以使用此方法。
  首先,程序将接收用户ID以及新密码,然后根据ID查询出用户的全部信息,再设置新密码,最后更新对象。
  但这里隐含了一个非常大的逻辑漏洞,那就是任意密码的修改,现在假设有两个用户,一个用户是Admin用户,UserID为1。另一个用户是Guest,UserID为2。Guest进行密码修改时,拦截HTTP请求,HTTP请求如下:
  POST /user/UpDateUser.action HTTP/1.1
  Host: www.xxser.com
  Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
  User-Agent: Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.17 (KHTML, like Gecko)
  Referer: http://www.xxser.com/user/userinfo.action
  Accept-Encoding: gzip,deflate,sdch
  Accept-Language: zh-CN,zh;q=0.8
  Accept-Charset: GBK,utf-8;q=0.7,*;q=0.3
  id=2&password=myuser123&password2=myuser123
  此时,ID为2,密码为myuser123,当Guest把用户的ID修改为1时, Admin用户的密码就会被修改为myuser123。程序会根据ID查询出Admin用户的所有信息,然后修改Admin用户的密码。
本文选自《Web安全深度剖析》第十章,本站经电子工业出版社和作者的授权。
版权声明:51Testing软件测试网获电子工业出版社和作者授权连载本书部分章节。
任何个人或单位未获得明确的书面许可,不得对本文内容复制、转载或进行镜像,否则将追究法律责任。
21/212>
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

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

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

沪ICP备05003035号

沪公网安备 31010102002173号