系统垂直越权与水平越权漏洞修复记录
最近系统的安全渗透测试中,检测出存在垂直越权和水平越权的漏洞。确实项目的权限管理,只是限制到菜单和按钮粒度,没有细到业务代码的每个接口上。在此记录一下自己的修复思路。
一、什么是垂直/水平越权?
水平越权
何为水平越权呢?就是相同权限用户之间在未经授权的情况下,可以访问到一方的资源。比如说同是一个网站的普通用户A和B,A通过越权操作访问了B的信息。
例如用户A与用户B属于同一角色,拥有同样菜单权限,但他们拥有私人的客户数据(A私有数据,B私有数据),假如B用户获取到了某条A私人数据信息(例如数据id),通过调用同样的查询接口,成功查询了到该私人数据的详细信息,那么这种行为就叫做水平越权访问。
垂直越权
垂直越权呢,就是低权限用户实现了高权限用户的功能。比如普通用户通过越权登录到了管理员页面,实现管理员才能的操作。
例如管理员A可查看编辑系统所有人员信息,普通用户B只能查看编辑自己部门的人。但是用户B通过抓包获取了其他部门用户C的id,调用修改接口,成功把18岁的C改成了38岁。那么这种行为就叫做垂直越权访问。
二、如何防范?
由于,我接手这个漏洞时,修复时间很紧迫,所以就用了最简单粗暴的方式。
思路:
利用每个模块的查询功能,默认所见即为你可以操作。在每个接口执行前,默认查询该登陆用户的查询所有结果,再将执行的业务数据id对比查询结果,如果在其中则正常操作,如果不在其中则抛出越权结果。
实现:
1、自定义注解,将注解放在需要鉴权的接口上,并写上接口所属模块,方法
2、利用springboot的AOP面向切面编程,按注解切,在每个接口执行前做查询结果校验处理
优化:
1、利用注解上的模块名与方法名,用策略模式,统一编写不用模块,方法的参数处理。
2、查询性能上的优化
附上自己的统一参数处理代码编写:
/*** @Author: dyf* @Date: 2020/5/8 21:09* @Description:*/
public enum ModuleParam {SYS_ORG("sysOrg"),RIVER_USER("riverUsers"),RIVER("riverInfo"),RIVER_STAGE("riverStageInfo"),LAKE("lakeInfo"),LAKE_SLICES("lakeSlicesInfo"),RESERVIOR("reservoirInfo"),RESERVIOR_SLICES("reservoirSlicesInfo"),BOARD("board"),POLICY("policy"),ARCHIVES("archives"),CAMERA("camera"),NOTICE("notice"),COMPANY("company");String name;IGetParam getParam;ModuleParam(String name) {this.name = name;}public ModuleParam initMethod(String methodType){switch(methodType){case "update":getParam = new GetUpdateId();break;case "query":getParam = new GetQueryId();break;case "del":getParam = new GetDelId();break;//按需自定义,初始化...}return this;}public String getId(Object object){return (String) getParam.getId(name, object);}public List<String> getIds(Object object){return (List<String>)getParam.getId(name, object);}}
public interface IGetParam {Object getId(String methodType, Object object);
}public class GetDelId implements IGetParam {@Overridepublic Object getId(String moduleName, Object object) {switch (moduleName){case "sysOrg":case "riverUsers": return ((BaseEntity)object).getId();case "riverInfo":case "reservoirInfo":case "lakeInfo": ((DeleteParamDTO)object).getId();case "riverStageInfo":case "reservoirSlicesInfo":case "lakeSlicesInfo": return ((ArrayList<String>)object);case "board":case "policy":case "archives":case "camera":case "notice": return ((List<String>)object);case "company": return (String)object;}return null;}
}public class GetQueryId implements IGetParam {@Overridepublic String getId(String moduleName, Object object) {switch (moduleName) {case "sysOrg":case "riverUsers":case "riverInfo":case "riverStageInfo":case "reservoirInfo":case "reservoirSlicesInfo":case "lakeInfo":case "lakeSlicesInfo":case "board":case "policy":case "archives":case "company":case "camera":case "notice":return (String)object;}return "";}
}public class GetUpdateId implements IGetParam {@Overridepublic String getId(String moduleName, Object object) {switch (moduleName) {case "sysOrg":return ((SysOrg) object).getId();case "riverUsers":return ((RegisterUser) object).getId();case "riverInfo":return ((River) object).getId();case "riverStageInfo":return ((RiverStageAddDTO) object).getId();case "reservoirInfo":return ((Reservoir) object).getId();case "reservoirSlicesInfo":return ((ReservoirSlicesAddDTO) object).getId();case "lakeInfo":return ((Lake) object).getId();case "lakeSlicesInfo":return ((LakeSlicesAddDTO) object).getId();case "board":return ((BulletinBoardAddDTO) object).getId();case "policy":return ((PolicyInfoResultDTO) object).getId();case "archives":return ((ArchivesInfoResultDTO) object).getId();case "company":return ((RCompanyInfo) object).getId();case "camera":return ((RCamera) object).getId();case "notice":return ((Notice) object).getId();}return "";}
}
总结:
我的解决方法,比较粗暴,虽然是暂时解决了问题,但是每一个操作都需要查询所有,带来的性能问题是一个隐患,但考虑到系统本身也只是一个业务系统,没有多少并发,所以可以用此方式苟延残喘下去。
附上网上查询的一些防范越权漏洞的方法:
1、调用功能前验证用户是否有权限调用相关功能(也就是我这种方式)
2、执行关键操作前必须验证用户身份,验证用户是否具备操作数据的权限
3、控制参数,加密资源ID,防止攻击者枚举ID,敏感数据特殊化处理。但参数加密仅仅只能防止的是遍历,并不能真正解决越权,还只是缓解的方式;
4、永远不要相信来自用户的输入,对于可控参数进行严格的检查与过滤
系统垂直越权与水平越权漏洞修复记录相关推荐
- 渗透测试-越权漏洞之垂直越权和水平越权
越权漏洞之垂直越权和水平越权 文章目录 越权漏洞之垂直越权和水平越权 前言 一.什么是越权漏洞以及漏洞产生的原因 1. 什么是越权漏洞 2. 漏洞产生的原因 二.水平越权和垂直越权以及防御方法 1.水 ...
- 越权分为水平越权和垂直越权
越权分为水平越权和垂直越权 水平越权:"基于数据的访问控制"设计缺陷引起的--权限相等者互相查看:用户A可以访问用户B的信息 实现思路:用户登录界面抓包,看http头部数据,从登录 ...
- 心脏出血漏洞修复记录
步骤一: 将openssl升级至无漏洞版本http://blog.csdn.net/xiaowenk/article/details/77525046 但是检测后网站依然存在心脏出血漏洞问题未得到解决 ...
- httpd服务器常见漏洞修复,Apache漏洞修复记录
一.慢http攻击漏洞 1.在Apache中配置reqtimeout_module设置header和body的最大响应时间. Apache配置 保存后重启Apache. 再进行测试可以看到,受到攻击后 ...
- Weblogic漏洞修复记录
1.CVE-2018-2628.CVE-2018-2893 以上两个漏洞均是针对weblogic的t3服务进行攻击,如果有条件的,可以从oracle官网下载最新的补丁安装http://www.orac ...
- 业务逻辑漏洞之水平越权和垂直越权
越权漏洞原理 浏览器对用户提交的数据请求没有经过严格的权限设置,导致用户可以拥有观察或更改其他用户信息的功能. 越权漏洞被分为两类 一类是水平越权,一类是垂直越权. 水平越权 :用户在权限相同级别下的 ...
- WEB漏洞-逻辑越权之水平垂直越权
水平垂直越权 水平,垂直越权,未授权访问 解释 原理 利用 修复防御方案 案例 pikachu-本地水平垂直越权演示 水平越权 垂直越权 墨者水平-身份验证失效漏洞实战 越权检测-Burpsuite插 ...
- 网络安全笔记 -- 逻辑越权(水平垂直越权)
1. 逻辑越权 越权: 水平越权.垂直越权 登录 暴力破解 本地加密传输 Cookie脆弱 Session劫持 密文对比认证 业务: 订单ID.手机号码.用户ID.商品ID等 数据: 支付篡改.数量篡 ...
- php 水平越权,水平越权与垂直越权
越权漏洞 越权访问(Broken Access Control,简称BAC)是Web应用程序中一种常见的漏洞,由于其存在范围广.危害大,被OWASP列为Web应用十大安全隐患的第二名. 该漏洞是指应用 ...
- 如何解决水平越权(横向越权)和纵向越权
目录 水平越权(横向越权) 采用token+手机号解决水平越权 纵向越权 纵向越权解决方法 水平越权(横向越权) 水平越权指的是获取了同级别用户的权限:例如A登陆自己的商城,却能够看到B的订单. 采用 ...
最新文章
- PAT题解-1118. Birds in Forest (25)-(并查集模板题)
- 软件测试随手记(转)
- Servlet的体系结构	|| Servlet相关配置
- gdb调试fork多进程
- matplotlib color可选
- LeetCode 135 分发糖果
- 腾讯云直播sdk_官方推荐 | 2分钟带你认识腾讯云直播 CSS
- PostgreSQL的安装和启动方法大全
- Spring Boot基础学习笔记22:自定义用户控制、登录与退出
- 安装CentOS步骤
- 数学原理(The Principles of Mathmatics)
- cannot open shared object file
- 自适应数字加密/收藏品NFT市场网站HTML5模版
- 机械原理习题-(附答案)
- 两片8-3优先编码器转化为16-4线优先编码器真值表--python实现
- Exchange 2013/2016/2019修改附件大小限制
- 一键装机linux_linux系统学习第十八天《搭建一键装机平台》终结篇
- 【定时任务】Springboot定时任务
- js处理时间戳转成日期格式
- 云服务器Windows 2012 IIS添加站点绑定域名的方法?