java越权问题

article/2025/11/11 11:02:52

关于java项目越权问题

  • 问题描述
  • 实现思路
  • 具体代码

项目上线前做了安全扫描,安全部门扫描出一个关于越权的问题。这个问题是在刚开始开发接口的时候没有考虑到的一个事情。(此项目是有关于用户所拥有的项目和活动权限的问题。)

问题描述

首先一个用户进到列表页面,点击编辑一个项目,然后通过抓包,得到调取后台接口的参数列表信息,然后知道参数列表里有id信息,这样用户如果知道其他项目id,或者这有查看权限,没有编辑项目的项目id,通过修改id,就可以越权,对没有权限的项目进行修改。

实现思路

在这里插入图片描述

  1. 首先用户登录时,通过Shiro框架,将用户信息放入Subject中,并将该用户对用的项目id和权限id放入redis中。
  2. 再分析并整理对应相关越权的接口,将这些接口整理,并且添加拦截器,将这些接口进行拦截。
  3. 拦截之后,从Shiro框架的Subject获取用户信息,根据用户信息查询该用户对应的项目id或活动id。
  4. 因为有些接口对项目操作,有的接口只对活动操作,有的接口对这两个都操作,所以我选择先判读项目id是否为空,然后再判读项目id存不存在在redis中,不存在直接返回false,若存在,再判断活动id的情况。
    拦截器中流程

具体代码

1.拦截器配置类 CrossPowerConfig.java

import com.exp.core.interceptor.CrossPowerInterceptor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.format.FormatterRegistry;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.validation.MessageCodesResolver;
import org.springframework.validation.Validator;
import org.springframework.web.method.support.HandlerMethodArgumentResolver;
import org.springframework.web.method.support.HandlerMethodReturnValueHandler;
import org.springframework.web.servlet.HandlerExceptionResolver;
import org.springframework.web.servlet.config.annotation.*;import java.util.List;@Configuration
public class CrossPowerConfig implements WebMvcConfigurer {@Autowiredprivate CrossPowerInterceptor crossPowerInterceptor;@Overridepublic void configurePathMatch(PathMatchConfigurer pathMatchConfigurer) {}@Overridepublic void configureContentNegotiation(ContentNegotiationConfigurer contentNegotiationConfigurer) {}@Overridepublic void configureAsyncSupport(AsyncSupportConfigurer asyncSupportConfigurer) {}@Overridepublic void configureDefaultServletHandling(DefaultServletHandlerConfigurer defaultServletHandlerConfigurer) {}@Overridepublic void addFormatters(FormatterRegistry formatterRegistry) {}@Overridepublic void addInterceptors(InterceptorRegistry registry) {// addPathPatterns("/**") 表示拦截所有的请求,registry.addInterceptor(crossPowerInterceptor).addPathPatterns(//要拦截的接口地址"/aaa/bbb","/aaa/ccc"...);}@Overridepublic void addResourceHandlers(ResourceHandlerRegistry resourceHandlerRegistry) {}@Overridepublic void addCorsMappings(CorsRegistry corsRegistry) {}@Overridepublic void addViewControllers(ViewControllerRegistry viewControllerRegistry) {}@Overridepublic void configureViewResolvers(ViewResolverRegistry viewResolverRegistry) {}@Overridepublic void addArgumentResolvers(List<HandlerMethodArgumentResolver> list) {}@Overridepublic void addReturnValueHandlers(List<HandlerMethodReturnValueHandler> list) {}@Overridepublic void configureMessageConverters(List<HttpMessageConverter<?>> list) {}@Overridepublic void extendMessageConverters(List<HttpMessageConverter<?>> list) {}@Overridepublic void configureHandlerExceptionResolvers(List<HandlerExceptionResolver> list) {}@Overridepublic void extendHandlerExceptionResolvers(List<HandlerExceptionResolver> list) {}@Overridepublic Validator getValidator() {return null;}@Overridepublic MessageCodesResolver getMessageCodesResolver() {return null;}
}

2.拦截器执行操作类 CrossPowerInterceptor.java

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;@Component
public class CrossPowerInterceptor implements HandlerInterceptor {private static Logger log = LoggerFactory.getLogger(CrossPowerInterceptor.class);@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object o) throws Exception {log.info("--------------------->进入越权相关拦截器---------------------");dosomething...//判断符合条件boolean flag=true;if(flag){return true;}else {return false;}}@Overridepublic void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {}@Overridepublic void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {}
}

当到这以为大功告成的时候,发现有一个接口,传数据的形式是JSON,当在拦截器里request.getinputstream()的时候,通过了拦截器,返回了true,进入接口的时候request.getinputstream()就获取为空,然后想到request.getinputstream()只能获取一次的问题,所以又考虑添加过滤器,在过滤器里将获取请求中的流,将取出来的字符串,再次转换成流,然后把它放入到新request对象中。
这时候整体的流程就变成了
在这里插入图片描述
添加的具体代码如下:
1.HttpServletRequestReplacedFilter.java

import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;public class HttpServletRequestReplacedFilter implements Filter {@Overridepublic void destroy() {}@Overridepublic void doFilter(ServletRequest request, ServletResponse response,FilterChain chain) throws IOException, ServletException {ServletRequest requestWrapper = null;if(request instanceof HttpServletRequest) {requestWrapper = new RequestReaderHttpServletRequestWrapper((HttpServletRequest) request);}//获取请求中的流如何,将取出来的字符串,再次转换成流,然后把它放入到新request对象中。// 在chain.doFiler方法中传递新的request对象if(requestWrapper == null) {chain.doFilter(request, response);} else {chain.doFilter(requestWrapper, response);}}@Overridepublic void init(FilterConfig arg0) throws ServletException {}
}

2.RequestReaderHttpServletRequestWrapper.java

import com.exp.util.HttpHelper;import javax.servlet.ReadListener;
import javax.servlet.ServletInputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.nio.charset.Charset;public class RequestReaderHttpServletRequestWrapper extends HttpServletRequestWrapper{private final byte[] body;public RequestReaderHttpServletRequestWrapper(HttpServletRequest request) throws IOException {super(request);body = HttpHelper.getBodyString(request).getBytes(Charset.forName("UTF-8"));}@Overridepublic BufferedReader getReader() throws IOException {return new BufferedReader(new InputStreamReader(getInputStream()));}@Overridepublic ServletInputStream getInputStream() throws IOException {final ByteArrayInputStream bais = new ByteArrayInputStream(body);return new ServletInputStream() {@Overridepublic int read() throws IOException {return bais.read();}@Overridepublic boolean isFinished() {return false;}@Overridepublic boolean isReady() {return false;}@Overridepublic void setReadListener(ReadListener readListener) {}};}
}

3.HttpHelper.java

import javax.servlet.http.HttpServletRequest;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.nio.charset.Charset;public class HttpHelper {public static String getBodyString(HttpServletRequest request) throws IOException {StringBuilder sb = new StringBuilder();InputStream inputStream = null;BufferedReader reader = null;try {inputStream = request.getInputStream();reader = new BufferedReader(new InputStreamReader(inputStream, Charset.forName("UTF-8")));String line = "";while ((line = reader.readLine()) != null) {sb.append(line);}} catch (IOException e) {e.printStackTrace();} finally {if (inputStream != null) {try {inputStream.close();} catch (IOException e) {e.printStackTrace();}}if (reader != null) {try {reader.close();} catch (IOException e) {e.printStackTrace();}}}return sb.toString();}
}

4.启动类 App.java

import com.exp.core.filter.HttpServletRequestReplacedFilter;
import com.exp.core.listener.MyApplicationContextListener;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.transaction.annotation.EnableTransactionManagement;/*** 程序启动入口*/
@SpringBootApplication
@EnableTransactionManagement
public class App {public static void main(String[] args) {SpringApplication app = new SpringApplication(App.class);//注册监听器app.addListeners(new MyApplicationContextListener());app.run(args);}/*** 功能描述:* 设置过滤,getinputstream取request数据时,再放回request中。* @Param: []* @Return: org.springframework.boot.web.servlet.FilterRegistrationBean* @Author: * @Date: 2020/9/14 14:58*/@Beanpublic FilterRegistrationBean httpServletRequestReplacedRegistration() {FilterRegistrationBean registration = new FilterRegistrationBean();registration.setFilter(new HttpServletRequestReplacedFilter());registration.addUrlPatterns(//要拦截的接口地址"/aaa/bbb","/aaa/ccc"...);registration.addInitParameter("paramName", "paramValue");registration.setName("httpServletRequestReplacedFilter");registration.setOrder(1);return registration;}}

http://chatgpt.dhexx.cn/article/PG1q6eJd.shtml

相关文章

越权 漏洞

一、越权漏洞描述 越权访问&#xff08;Broken Access Control&#xff0c;简称 BAC&#xff09;是 Web 应用程序中一种常见的漏洞&#xff0c;由于其存在范围广、危害大&#xff0c;被 OWASP 列为 Web 应用十大安全隐患的第二名。 该漏洞是指应用在检查授权时存在纰漏&#x…

详解越权漏洞

文章目录 1.1. 漏洞原理1.2. 漏洞分类1.2.1. 水平越权1.2.2. 垂直越权 1.3. 漏洞举例1.3.1. 水平越权1.3.2. 垂直越权 1.4. 漏洞危害1.5. 修复建议 1.1. 漏洞原理 越权漏洞是指应用程序未对当前用户操作的身份权限进行严格校验&#xff0c;导致用户可以操作超出自己管理权限范…

网络安全笔记 -- 逻辑越权(水平垂直越权)

1. 逻辑越权 越权&#xff1a; 水平越权、垂直越权登录 暴力破解本地加密传输Cookie脆弱Session劫持密文对比认证 业务&#xff1a; 订单ID、手机号码、用户ID、商品ID等数据&#xff1a; 支付篡改、数量篡改、请求重放等找回&#xff1a; 客户端回显、Response状态值、Sessio…

渗透测试-越权漏洞之垂直越权和水平越权

越权漏洞之垂直越权和水平越权 文章目录 越权漏洞之垂直越权和水平越权前言一、什么是越权漏洞以及漏洞产生的原因1. 什么是越权漏洞2. 漏洞产生的原因 二、水平越权和垂直越权以及防御方法1.水平越权和垂直越权2.越权漏洞的防御方法 总结 前言 一、什么是越权漏洞以及漏洞产生…

【web安全】——逻辑漏洞之越权漏洞

作者名&#xff1a;Demo不是emo 主页面链接&#xff1a;主页传送门创作初心&#xff1a;一切为了她座右铭&#xff1a;不要让时代的悲哀成为你的悲哀专研方向&#xff1a;网络安全&#xff0c;数据结构 每日emo&#xff1a;希望我失望的日子过的快些 目录 一.越权漏洞简介 二…

怎样进行越权测试?

要了解越权测试&#xff0c;首先要先了解什么是越权攻击。越权攻击顾名思义就是超越了自己的权限范围&#xff0c;是指用户通过某种方式获取到了不属于自己的权限。越权攻击分为水平越权和垂直越权。下面我们先来说一下水平越权水平越权&#xff1a;攻击者尝试访问与他权限相同…

越权漏洞

什么是越权漏洞&#xff1f; 越权漏洞指的是应用在检查授权时存在纰漏&#xff0c;可以让攻击者获得低权限用户账户后&#xff0c;利用一些方式绕过权限检查&#xff0c;可以访问或者操作其他用户或者更高权限&#xff0c;而越权漏洞是属于业务性漏洞&#xff0c;困难在于这类…

水平越权与垂直越权

文章目录 越权漏洞简介水平越权概念常见场景实例 垂直越权概念常见场景实例 越权漏洞简介 越权&#xff0c;顾名思义&#xff0c;就是超出了权限或权力范围。多数WEB应用都具备权限划分和控制&#xff0c;但是如果权限控制功能设计存在缺陷&#xff0c;那么攻击者就可以通过这…

水平越权垂直越权

#知识点&#xff1a; 1、水平越权-同级用户权限共享 2、垂直越权-低高用户权限共享 3、访问控制-验证丢失&取消验证&脆弱验证 4、脆弱验证-Cookie&Token&Jwt等 解释 水平越权 就是同级用户之间的越权&#xff0c;打个比方现在有ABC三个用户&#xff0c;A…

越权漏洞详解

文章目录 Over Permission越权风险问题概述漏洞产生条件常见越权漏洞水平越权&#xff08;平行越权&#xff09;概述pikachu靶场练习1 垂直越权概述pikachu靶场练习 修复建议练习 Over Permission 越权风险问题 越权访问&#xff08;Broken Access Control&#xff0c;简称BA…

逻辑越权总结(超详细总结涉及各类越权)

逻辑越权总结&#xff08;超详细总结涉及各类越权&#xff09; 1.逻辑越权1.1.漏洞原理1.2.漏洞原因1.3.水平越权1.3.1.原理1.3.2.漏洞出现位置1.3.3.危害1.3.4.案例1.3.4.1.登录账号1.3.4.2.获取信息1.3.4.3.修改信息 1.4.垂直越权1.4.1.原理1.4.2.漏洞出现位置1.4.3.条件1.4.…

浅谈越权

浅谈越权 越权&#xff08;或者说权限提升&#xff0c;Privilege Escalation&#xff09;是指攻击者能够执行其本身没有资格执行的一些操作&#xff0c;属于“访问控制”的问题。用大白话讲&#xff0c;越权就是“超越了本身拥有的权限&#xff0c;干了本来不可能干的事儿” 漏…

越权

越权介绍水平越权垂直越权寻找越权漏洞 一、越权介绍 越权&#xff0c;从字面意思理解就是用户可以操作超过自己管理权限范围的功能。 大多数web应用系统都具备权限划分和控制&#xff0c;但是如果权限校验存在问题&#xff0c;攻击者就可以通过这些问题来访问未经授权的功能或…

浅谈一下什么是越权问题?

1、什么是越权&#xff1f; 越权&#xff08;或者说权限提升&#xff0c;Privilege Escalation&#xff09;是指攻击者能够执行他本身没有资格执行的一些操作&#xff0c;属于“访问控制”的问题。用大白话讲&#xff0c;越权就是“超越了你你拥有的权限&#xff0c;干了你本来…

快充协议(QC/PD/PE)及标准

快充协议&#xff08;QC/PD/PE&#xff09;及标准 充电按用途可分为&#xff1a;车充&#xff0c;墙冲&#xff0c;无线充和充电宝&#xff08;移动电源&#xff09;&#xff1b;按接口可分为Micro-USB, USB-A or B, Type-C和Lightning&#xff08;Apple&#xff09;; 按充电快…

通过QI协议发射和接收的无线充需要做CE认证吗?RED指令

QI协议其实是一个技术协议&#xff0c;和CE认证没有多大的关系。做了QI认证&#xff0c;还是要做CE认证的。具体的指标是RED指令。 关于如何办理QI认证和CE认证&#xff0c;欢迎关注Liwei_Chan&#xff01;&#xff01;每天学习一分钟&#xff0c;让你紧跟时代&#xff0c;扩充…

MQTT 协议

MQTT 简介 MQTT是一种基于客户端服务端架构的发布/订阅模式的消息传输协议。它的设计思想是轻巧、开放、简单、规范&#xff0c;易于实现。这些特点得它对很多场景来说都是很有的选择&#xff0c;特别是对于受限的环境如机器与机器的通信&#xff08;M2M&#xff09;以及物联网…

通过QI协议发射和接收的无线充需要做CE认证吗?RED指令?

QI协议其实是一个技术协议&#xff0c;和CE认证没有多大的关系。做了QI认证&#xff0c;还是要做CE认证的。具体的指标是RED指令。 关于如何办理QI认证和CE认证&#xff0c;想更多了解vvv&#xff01; WPC官网认证产品页面上有更新一款mophie新的发射器&#xff0c;此发射器为定…

通用协议(一)

协议 协议&#xff1a; 协议的本质就是执行一个任务&#xff0c;在密码这个领域有时也称一个协议就是为了计算一个函数&#xff0c;即为求一个函数值&#xff0c;但是这任务或者说求函数值&#xff0c;往往不是有一方来单独计算的&#xff0c;而是由多个参与方合作完成的任务&…

MQTT协议

目录 MQTT协议的通信模型 MQTT消息格式* 1 固定报头 2 可变报头 3 负载 MQTT控制报文 1 CONNECT-连接服务器* 2 CONNACK-确认连接请求 3 PUBLISH-发布消息* 4 PUBACK-发布确认 5 PUBREC-发布收到 6 PUBREL-发布释放 7 PUBCOMP-发布完成 8 SUBSCRIBE-订阅主题* …