我的编程空间,编程开发者的网络收藏夹
学习永远不晚

swagger关闭/v2/api-docs仍然可以访问漏洞

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

swagger关闭/v2/api-docs仍然可以访问漏洞

今天接到安全团队的说swagger有未授权访问漏洞,即使在swagger关闭的情况下http://127.0.0.1:8086/agcloud/v2/api-docs?group=用户关联信息模块仍然还能访问。

看了下原来是有写一个拦截器

        registry.addInterceptor(loginInterceptor).addPathPatterns("/v2/api-docs");        registry.addInterceptor(loginInterceptor).addPathPatterns("/swagger-ui.html");

断点之后发现是有生效的,/swagger-ui.html不能再访问,但是/v2/api-docs路径还是可以访问,确定拦截器有生效,不是拦截器的问题。

查看基于springMVC请求入口找到DispatcherServlet类,找到doDispatch方法

protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception {    ......    try {        // HandlerMapping根据请求路径选择对应的handler(controller下的某个方法)来处理当前请求        // 补充下HandlerMapping:        // 1. 根据当前请求的找到对应的 Handler,        // 2. 将 Handler(执行程序)与一堆 HandlerInterceptor(拦截器)封装到 HandlerExecutionChain 对象中        // 3. DispatcherServlet会从容器中取出所有HandlerMapping实例并遍历,让HandlerMapping实例根据自己实现类的方式去尝试查找Handler        mappedHandler = getHandler(processedRequest);        ......        // 根据handler来找到支持它的HandlerAdapter,通过HandlerAdapter执行这个最后的代码处理逻辑得到具体的返回结果        HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());        ......        // 拦截器preHandle处理,按顺序执行        if (!mappedHandler.applyPreHandle(processedRequest, response)) {            return;        }        // handlerAdapter实际的执行逻辑        mv = ha.handle(processedRequest, response, mappedHandler.getHandler());        ......        // 拦截器postHandle处理        mappedHandler.applyPostHandle(processedRequest, response, mv);    } catch (Throwable err) {            ......    } finally {            ......    }}

在doDispatch方法中,拦截器的preHandle执行逻辑在mappedHandler.applyPreHandle中,接下来我看下这个方法:

boolean applyPreHandle(HttpServletRequest request, HttpServletResponse response) throws Exception {         // 遍历handler绑定的所有interceptors,按顺序执行preHanlde方法for (int i = 0; i < this.interceptorList.size(); i++) {HandlerInterceptor interceptor = this.interceptorList.get(i);            // 如果preHandle返回false,则触发afterCompletion方法的执行if (!interceptor.preHandle(request, response, this.handler)) {triggerAfterCompletion(request, response, null);return false;}this.interceptorIndex = i;}return true;}

debug跟踪到这个方法,发现applyPreHandle方法中this.interceptorList的长度为0,即处理该请求的handler没有绑定任何interceptor。这个时候很容易想到问题可能出现在handlerMapping上,因为handlerMapping负责将handler与一堆 handlerInterceptor(拦截器)封装到 HandlerExecutionChain 对象中

doDispatch中的getHandler方法断点

解决方案:

package com.augurit.swj.config.filter;import org.springframework.beans.factory.annotation.Value;import org.springframework.core.MethodParameter;import org.springframework.http.HttpStatus;import org.springframework.http.MediaType;import org.springframework.http.server.ServerHttpRequest;import org.springframework.http.server.ServerHttpResponse;import org.springframework.web.bind.annotation.RestControllerAdvice;import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice;import java.util.Arrays;import java.util.List;@RestControllerAdvicepublic class SwaggerAdvice implements ResponseBodyAdvice {    @Value("${agcloud.framework.swagger.enable}")    private boolean swaggerEnable;    private static final List EXCLUDE_URL = Arrays.asList("/v2/api-docs");    @Override    public Object beforeBodyWrite(Object o, MethodParameter methodParameter, MediaType mediaType, Class aClass, ServerHttpRequest serverHttpRequest, ServerHttpResponse serverHttpResponse) {        String url = serverHttpRequest.getURI().getHost() + serverHttpRequest.getURI().getPath();        //增加判断,只有配置文件打开了swagger才能访问        if(swaggerEnable == true){            return o;        }        if (EXCLUDE_URL.stream().anyMatch(item -> url.contains(item))) {            serverHttpResponse.setStatusCode(HttpStatus.FORBIDDEN);            return "没有权限";        }        return o;    }    @Override    public boolean supports(MethodParameter methodParameter, Class aClass) {        return true;    }}

参考:记一次自定义拦截器失效的问题排查 - 简书

 

来源地址:https://blog.csdn.net/zy_crazy_code/article/details/129360823

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

swagger关闭/v2/api-docs仍然可以访问漏洞

下载Word文档到电脑,方便收藏和打印~

下载Word文档

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录