基本概念
越权漏洞是Web应用程序中一种常见的安全漏洞,它的威胁在于一个账户即可控制全站用户数据。越权漏洞的成因主要是因为开发人员在对数据进行增、删、改、查询时对客户端请求的数据过分相信而遗漏了权限的判定。
水平越权( 横向越权)
水平越权指攻击者尝试访问与他拥有相同权限的用户资源。例如,用户A和用户B属于同一角色,拥有相同的权限等级,他们能获取自己的私有数据(数据A和数据B),但如果系统只验证了能访问数据的角色,而没有对数据做细分或者校验,导致用户A能访问到用户B的数据(数据B),那么用户A访问数据B的这种行为就叫做水平越权访问。
水平越权,多发生在一些能够对数据进行查询、增、删、改的地方。比如一些使用id来对对应数据进行操作的功能点,如果此时没有把数据的id和用户的uid进行绑定的话,就容易产生水平越权漏洞。
平时排查问题时,可以使用Firefox浏览器F12中的网络请求功能,对关键参数进行修改替换,重新发送请求,查看响应包的内容来确认是否存在水平越权,如要进行更多的测试,推荐使用burpsuite、fiddler等专业抓包工具。
垂直越权(纵向越权)
非法获取高权限级别用户权限。比如:只隐藏URL未判断访问权限。在用户认证后只显示给用户认证过的页面和菜单选项,而实际上这些仅仅是表示层的访问控制而不能真正生效,攻击者能够很容易的就伪造请求直接访问未被授权的页面(如管理员功能)。
越权检查列表
- 与前端交互的服务禁止直接使用前端传递的当前用户id(请求head或请求报文中的用户id等) ,必须使用当前用户登录会话凭证通过服务端交互获取用户ID。
- 前端传递私有数据id(如订单号|联系方式ID等) 禁止直接检索数据库ID并不与当前用户id校验,而是需配合当前登录会话中的用户ID&数据ID同时进行检索校验。
- 客服人员访问数据时,需通过权限系统校验当前登录的用户是否有访问该类数据的权限。
- 权限及身份校验必须在敏感数据处理接口中提前处理,而不能在前端拆分成几个过程。
- 系统外部交互过程中如果需要防篡改,可将数据使用公私钥+时间 进行签名校验。
- 控制服务访问级别,避免对内服务无意暴露在公网中。
研发保障制度
- 评审的技术方案需要有安全部分的设计,必须包括对外接口的权限控制设计。
- 评审的测试用例,必须包括安全测试用例和越权测试用例。
越权访问漏洞的修复方案
- [最优方案]验证每次请求(URL、数据等资源)的用户权限。建立基于角色的权限控制矩阵,实现“用户”、“角色”、“权限”对照表。系统功能区域分离(普通用户、管理员、公共访问区等)。
- [次优方案]增加随机化参数(避免可预测)。使用难以预测的参数(如一次性token预先下发到客户端,客户端浏览器请求数据时带上账户ID和一次性token),使攻击者无法预测执行操作。