访问控制-越权

  sre, 开发

5fcdd7a906ebf5200.jpg_fo742.jpg
简介

访问控制,或者说是权限控制,就是指某个主体对某个客体需要实施某种操作,而系统对这种操作的限制就是权限控制。
访问控制漏洞是指访问了没有授权的资源或信息,也叫越权。越权可以分为两种:垂直越权和水平越权。接下来,将深入分析水平越权与垂直越权。

垂直越权

访问控制实际上是建立用户与权限之间的对应关系,现在应用广泛的一种方,就是“基于角色的访问控制”,简称RBAC。
RBAC事先会在系统中定义出不同的角色,不同的角色拥有不同的权限,一个角色实际上就是一个权限的集合。而系统的所有用户都会被分配到不同的角色中,角色之间有权限高低之分。在系统验证权限时,只需要验证用户所属的角色,就可以根据该角色所拥有的权限进行授权。
所以当用户在请求一些资源时,如果系统未对用户所属的角色进行权限验证,则用户就可以访问高权限的资源。这就是垂直越权。
对于垂直越权的攻击漏洞,一般的防御措施是,在服务器端需要有所有角色的访问控制列表ACL,即不同角色对于所有访问资源的权限控制表。如下表所示。

资源1 资源2 资源3
A角色
B角色

当用户访问某资源时,系统首先会判断该用户所属的角色,之后会根据ACL来判断该角色是否拥有所要访问的资源权限,如果没有,则拒绝访问。
Spring的Spring Security中的权限管理,就是RBAC模型的一个实现。
Spring Security提供两种权限管理方式,一种是“基于URL的访问控制”,一种是“基于method的访问控制”。这两种访问控制都是RBAC模型的实现,换言之,在Spring Security中都是验证该用户所属的角色,以决定是否授权。

水平越权
在RBAC模型下,系统只会验证用户A是否属于角色X,而不会判断用户A是否能访问只属于用户B的数据资源,因此发生了越权访问,这种越权就叫做水平越权。如下图所示。

相对于垂直权限管理来说,水平权限问题处在同一个角色上。系统只验证了能访问数据的角色,既没有对角色内的用户做细分,也没有对数据的子集做细分,因此缺乏一个用户到数据之间的对应关系。
水平权限的漏洞一般出现在一个用户对象关联多个其他对象(如订单、地址、保险单等)、并且要实现对关联对象的增删改查操作时,开发者一般的操作是把关联的对象的id等信息传到后台,在后台对对应的对象进行操作。这样,如果A用户(攻击者)知道B用户的关联的对象id(如订单id),则在请求操作订单信息时把自己的订单id改为B用户的订单id,就可以操作B用户的订单信息。

对应的防御措施有以下几种:
1)在逻辑层做鉴权,检查请求的操作者(从session中获取)和操作的对象(请求参数中获取)是否具有关联关系(查询数据库),如果无关联关系,则停止操作。这种防御的缺点使增加了一次数据库查询操作。
2)把权限的控制转移到数据接口层中,即在进行sql查询更新操作时,在sql语句后加入userId的条件,而userId的值是从session中获取。
3)再请求的参数中增加一个token值,如MD5(url+key),用做完整性校验,当攻击者修改参数时,拦截器将会拦截请求,从而完成防御。

LEAVE A COMMENT

Captcha Code