OPTIONS 漏洞修复
创始人
2024-04-28 23:09:53
0

文章目录

  • 前言:OPTIONS 漏洞说明
  • Nginx 修复方法
    • 环境说明
    • 修复测试
  • Tomcat 修复方法
    • 环境说明
    • 修复测试
    • Tomcat 版本:8.5.3 测试
  • SpringBoot 项目修复方法
    • 环境说明
    • 修复测试
  • 总结


前言:OPTIONS 漏洞说明

漏洞名称 : OPTIONS method is enabled

风险级别: 低

漏洞原因 : 可以通过 OPTIONS 方法访问 HTTP 服务

漏洞说明: OPTIONS 方法是用于请求获得由 Request-URI 标识的资源在请求/响应的通信过程中可以使用的功能选项。通过这个方法,客户端可以在采取具体资源请求之前,决定对该资源采取何种必要措施,或者了解服务器的性能。OPTIONS方法可能会暴露一些敏感信息,这些信息将帮助攻击者准备更进一步的攻击。

不同的项目,可以通过不同的方法进行修复,在此记录一下几种情况:

  1. 更改 Nginx 的配置;
  2. 更改 Tomcat 参数;
  3. SpringBoot 项目增加过滤器。

Nginx 修复方法

说明:项目前置 Nginx,通过 Nginx 配置阻止 OPTIONS 方法的访问。

环境说明

Nginx 环境

操作系统:CentOS Linux release 7.4.1708 (Core)

Nginx 版本:1.22.0


测试环境

测试操作系统: Windows 11

测试工具 : Postman v9.19.0

修复测试

直接启动 Nginx ,使用 Postman 访问默认的 80 端口, Postman 截图如下:

在这里插入图片描述

说明:

  • 默认没有开启 options 方法。
  • 如果做转发测试,还要再搭建其他服务,只想测试一下而已。动一下手脚,改一下吧!

更改 /etc/nginx/conf.d/default.conf 配置文件:

server {listen       80;server_name  localhost;#access_log  /var/log/nginx/host.access.log  main;location / {##### 只增加这里的配置,其他配置为默认 ########## 增加支持 OPTIONS 方法 #####add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';##### 增加 OPTIONS 方法的返回结果 #####if ($request_method = 'OPTIONS') {return 204;}root   /usr/share/nginx/html;index  index.html index.htm;}#error_page  404              /404.html;# redirect server error pages to the static page /50x.html#error_page   500 502 503 504  /50x.html;location = /50x.html {root   /usr/share/nginx/html;}# proxy the PHP scripts to Apache listening on 127.0.0.1:80##location ~ \.php$ {#    proxy_pass   http://127.0.0.1;#}# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000##location ~ \.php$ {#    root           html;#    fastcgi_pass   127.0.0.1:9000;#    fastcgi_index  index.php;#    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;#    include        fastcgi_params;#}# deny access to .htaccess files, if Apache's document root# concurs with nginx's one##location ~ /\.ht {#    deny  all;#}
}

返回结果变为 204

在这里插入图片描述

如需要禁止 OPTIONS 方法,则配置文件中的返回结果更改为 403 即可:

if ($request_method ~* OPTIONS) {return 403;
}

修复后,使用 Postman 访问,方法及结果如下:

在这里插入图片描述

说明:这个比较容易理解,Nginx 拦截 request_method 是 OPTIONS 的请求,并返回 403。

Tomcat 修复方法

说明:新版 Tomcat 已经修复了。
修复方法:通过 war 包部署的项目,可以通过更改 Tomcat 的配置阻止 OPTIONS 方法的访问。

环境说明

操作系统:Windows 11

Tomcat 版本:apache-tomcat-6.0.35-windows-x86

测试工具 : Postman v9.31.0
(PS:文章整理的时间间隔太长了,postman 都升级啦 ~)

修复测试

修复前,使用 Postman 访问,方法及结果如下:(虽然 response body 是空的,但是状态码是 200)
在这里插入图片描述

尝试修复,修改 tomcat 的 conf/web.xml 文件,在标记 前增加以下配置

http method security/*PUTDELETEHEADOPTIONSTRACE

修复后,使用 Postman 访问,方法及结果如下:(返回 403 Forbidden)
在这里插入图片描述

原理(参考博客):(以下内容是老版本的 Tomcat,新版本有待验证)

security-constriant 配置安全相关属性,包含4个可能的子元素,分别是:web-resource-collection、auth-constraint、user-data-constraint和display-name。

  1. web-resource-collection 此元素确定要保护的资源,所有 security-constraint 元素都必须包含至少一个此项。此元素下面有一个给出任意标识名称的 、一个确定要保护的 URL 的 url-pattern 元素、一个指出此保护所适用的 HTTP 命令(缺省为所有方法)的 http-method 元素和一个提供资料的可选 description 元素组成。如上例中,当以 OPTIONGS 方法访问时将被限制,如果把 OPTIONS 这行注释掉就不会报错了
  2. auth-constraint 元素指出哪些用户应该具有受保护资源的访问权。此元素应该包含一个或多个标识具有访问权限的用户 role-name 元素,以及可选的 description 元素。如果 security-constraint 中没有 auth-constraint 子元素,任何身份的用户都可以访问相应的资源,也就是说 security-constraint 这时实际上不起作用。此元素需要和 配合使用, 要紧跟 security-constraint 后面
  3. user-data-constraint 此可选元素指出在访问相关资源时使用的传输层保护

说明:

  • security-constraint只对外部访问有作用,对内部跳转是不起作用的。
  • web.xml 中 的子元素 是可选的,如果没有 元素,这表示将禁止所有 HTTP 方法访问相应的资源。子元素 需要和 相配合使用,但可以被单独使用。如果没有 子元素,这表明任何身份的用户都可以访问相应的资源。也就是说,如果 中没有 子元素的话,配置实际上是不起中用的。如果加入了 子元素,但是其内容为空,这表示所有身份的用户都被禁止访问相应的资源。

Tomcat 版本:8.5.3 测试

新版 Tomcat 访问会返回 405 Method Not Allowed
访问结果如下
在这里插入图片描述

SpringBoot 项目修复方法

环境说明

操作系统: Windows 10

JDK 版本:1.8.0_321

SpringBoot 版本: 2.3.7.RELEASE

测试工具 : Postman v9.31.0

初始化 SpringBoot 项目,pom.xml 文件如下


4.0.0com.exampledemo0.0.1-SNAPSHOTdemoDemo project for Spring Boot1.8UTF-8UTF-82.3.7.RELEASEorg.springframework.bootspring-boot-starter-weborg.springframework.bootspring-boot-devtoolsruntimetrueorg.springframework.bootspring-boot-starter-testtestorg.junit.vintagejunit-vintage-engineorg.springframework.bootspring-boot-dependencies${spring-boot.version}pomimportorg.apache.maven.pluginsmaven-compiler-plugin3.8.11.81.8UTF-8org.springframework.bootspring-boot-maven-plugin2.3.7.RELEASEcom.example.demo.DemoApplicationrepackagerepackage

AppController 定义如下

package com.example.demo.controller;import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
@RequestMapping("/api/")
public class AppController {private static final Logger logger = LoggerFactory.getLogger(AppController.class);@RequestMapping("test")
//    @PostMapping("test")
//    @GetMapping("test")public String test() {return "test";}}

说明:这里有做测试 @RequestMapping @PostMapping @GetMapping 都不会禁用 OPTIONS 请求。

使用 Postman 访问结果如下(说明: OPTIONS 请求允许访问,并在 Headers 中返回了 Allow)
在这里插入图片描述

修复测试

增加过滤器 MyFilter

package com.example.demo.filter;import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.http.HttpMethod;public class MyFilter implements Filter {@Overridepublic void init(FilterConfig filterConfig) throws ServletException {}@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain)throws IOException, ServletException {System.out.println("filter1");HttpServletRequest request = (HttpServletRequest) servletRequest;HttpServletResponse response = (HttpServletResponse) servletResponse;// testif (request.getMethod().equals(HttpMethod.OPTIONS.toString())) {response.setStatus(405);return;}String ip = request.getRemoteAddr();String url = request.getRequestURL().toString();SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");Date d = new Date();String date = sdf.format(d);System.out.printf("%s %s 访问了 %s%n", date, ip, url);filterChain.doFilter(request, response);}@Overridepublic void destroy() {}}

注册过滤器

package com.example.demo.config;import com.example.demo.filter.MyFilter;
import org.springframework.boot.SpringBootConfiguration;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;@SpringBootConfiguration
public class CorsConfiguration implements WebMvcConfigurer {@Beanpublic FilterRegistrationBean registrationBean() {FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean(new MyFilter());filterRegistrationBean.addUrlPatterns("/*");return filterRegistrationBean;}}

重启服务,使用 Postman 访问结果如下(说明: OPTIONS 请求已被禁用,返回结果 405)
在这里插入图片描述


总结

修复方法有很多啦~ 只整理了这3种情况。

说明:有的时候,前后端分离的项目。还不能阻止 OPTIONS 方法的请求,可能会出问题,参考 。有点尴尬,要不这个漏洞不管啦 ??~~!!

相关内容

热门资讯

【NI Multisim 14...   目录 序言 一、工具栏 🍊1.“标准”工具栏 🍊 2.视图工具...
银河麒麟V10SP1高级服务器... 银河麒麟高级服务器操作系统简介: 银河麒麟高级服务器操作系统V10是针对企业级关键业务...
不能访问光猫的的管理页面 光猫是现代家庭宽带网络的重要组成部分,它可以提供高速稳定的网络连接。但是,有时候我们会遇到不能访问光...
AWSECS:访问外部网络时出... 如果您在AWS ECS中部署了应用程序,并且该应用程序需要访问外部网络,但是无法正常访问,可能是因为...
Android|无法访问或保存... 这个问题可能是由于权限设置不正确导致的。您需要在应用程序清单文件中添加以下代码来请求适当的权限:此外...
AWSElasticBeans... 在Dockerfile中手动配置nginx反向代理。例如,在Dockerfile中添加以下代码:FR...
北信源内网安全管理卸载 北信源内网安全管理是一款网络安全管理软件,主要用于保护内网安全。在日常使用过程中,卸载该软件是一种常...
AsusVivobook无法开... 首先,我们可以尝试重置BIOS(Basic Input/Output System)来解决这个问题。...
月入8000+的steam搬砖... 大家好,我是阿阳 今天要给大家介绍的是 steam 游戏搬砖项目,目前...
​ToDesk 远程工具安装及... 目录 前言 ToDesk 优势 ToDesk 下载安装 ToDesk 功能展示 文件传输 设备链接 ...