关键词:
文章目录
前言:OPTIONS 漏洞说明
漏洞名称 : OPTIONS method is enabled
风险级别: 低
漏洞原因 : 可以通过 OPTIONS 方法访问 HTTP 服务
漏洞说明: OPTIONS 方法是用于请求获得由 Request-URI 标识的资源在请求/响应的通信过程中可以使用的功能选项。通过这个方法,客户端可以在采取具体资源请求之前,决定对该资源采取何种必要措施,或者了解服务器的性能。OPTIONS方法可能会暴露一些敏感信息,这些信息将帮助攻击者准备更进一步的攻击。
不同的项目,可以通过不同的方法进行修复,在此记录一下几种情况:
- 更改 Nginx 的配置;
- 更改 Tomcat 参数;
- 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 文件,在标记 前增加以下配置
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
version="3.1">
<!-- add -->
<security-constraint>
<web-resource-collection>
<web-resource-name>http method security</web-resource-name>
<url-pattern>/*</url-pattern>
<http-method>PUT</http-method>
<http-method>DELETE</http-method>
<http-method>HEAD</http-method>
<!-- 只禁用 OPTIONS 方法,只增加这个就好啦 -->
<http-method>OPTIONS</http-method>
<http-method>TRACE</http-method>
</web-resource-collection>
<auth-constraint/>
</security-constraint>
<!-- 这里之前增加配置 -->
</webapp>
修复后,使用 Postman 访问,方法及结果如下:(返回 403 Forbidden)
原理(参考博客):(以下内容是老版本的 Tomcat,新版本有待验证)
security-constriant 配置安全相关属性,包含4个可能的子元素,分别是:web-resource-collection、auth-constraint、user-data-constraint和display-name。
- web-resource-collection 此元素确定要保护的资源,所有 security-constraint 元素都必须包含至少一个此项。此元素下面有一个给出任意标识名称的 <web-resource-name> 、一个确定要保护的 URL 的 url-pattern 元素、一个指出此保护所适用的 HTTP 命令(缺省为所有方法)的 http-method 元素和一个提供资料的可选 description 元素组成。如上例中,当以 OPTIONGS 方法访问时将被限制,如果把 <http-method>OPTIONS</http-method> 这行注释掉就不会报错了
- auth-constraint 元素指出哪些用户应该具有受保护资源的访问权。此元素应该包含一个或多个标识具有访问权限的用户 role-name 元素,以及可选的 description 元素。如果 security-constraint 中没有 auth-constraint 子元素,任何身份的用户都可以访问相应的资源,也就是说 security-constraint 这时实际上不起作用。此元素需要和 <login-config> 配合使用,<login-config> 要紧跟 security-constraint 后面
- user-data-constraint 此可选元素指出在访问相关资源时使用的传输层保护
说明:
- security-constraint只对外部访问有作用,对内部跳转是不起作用的。
- web.xml 中 <security-constraint> 的子元素 <http-method> 是可选的,如果没有 <http-method> 元素,这表示将禁止所有 HTTP 方法访问相应的资源。子元素 <auth-constraint> 需要和 <login-config> 相配合使用,但可以被单独使用。如果没有 <auth-constraint> 子元素,这表明任何身份的用户都可以访问相应的资源。也就是说,如果 <security-constraint> 中没有 <auth-constraint> 子元素的话,配置实际上是不起中用的。如果加入了 <auth-constraint> 子元素,但是其内容为空,这表示所有身份的用户都被禁止访问相应的资源。
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 文件如下
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.example</groupId>
<artifactId>demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>demo</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<spring-boot.version>2.3.7.RELEASE</spring-boot.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>$spring-boot.version</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>2.3.7.RELEASE</version>
<configuration>
<mainClass>com.example.demo.DemoApplication</mainClass>
</configuration>
<executions>
<execution>
<id>repackage</id>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
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
@Override
public void init(FilterConfig filterConfig) throws ServletException
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain)
throws IOException, ServletException
System.out.println("filter1");
HttpServletRequest request = (HttpServletRequest) servletRequest;
HttpServletResponse response = (HttpServletResponse) servletResponse;
// test
if (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);
@Override
public 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
@Bean
public FilterRegistrationBean registrationBean()
FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean(new MyFilter());
filterRegistrationBean.addUrlPatterns("/*");
return filterRegistrationBean;
重启服务,使用 Postman 访问结果如下(说明: OPTIONS 请求已被禁用,返回结果 405)
总结
修复方法有很多啦~ 只整理了这3种情况。
说明:有的时候,前后端分离的项目。还不能阻止 OPTIONS 方法的请求,可能会出问题,参考 。有点尴尬,要不这个漏洞不管啦 ??~~!!
nginx修复漏洞(代码片段)
一、X-Frame-Options头配置错误修复建议:1.配置X-Frame-Options2.对于配置了已废弃的ALLOW-FROM,原则上不推荐使用3.删除重复配置的X-Frame-Options修复方法:1.nginx服务器:配置nginx发送X-Frame-Options响应头,把下面这行添... 查看详情
nginx漏洞扫描及修复方案(代码片段)
目录漏洞扫描结果漏洞扫描缓慢的HTTP拒绝服务攻击漏洞等级:中修改建议Nginx修复建议具体nginx配置文件WebSphere修复建议Weblogic修复建议Apache修复建议IHS服务器F5负载均衡修复建议IIS服务器漏洞扫描结果漏洞扫描OSS2.0物联网创... 查看详情
中间件漏洞汇总(代码片段)
目录一些地址什么是中间件iis6x篇PUT漏洞漏洞描述漏洞复现防御方式解析漏洞-基于文件名原理复现防御解析漏洞-基于文件夹原理复现防御IIS短文件漏洞介绍原理复现防御RCE-CVE-2017-7269介绍影响范围复现防御iis7x篇文件解析漏洞原... 查看详情
cve-2019-14287漏洞与修复过程(代码片段)
CVE-2019-14287漏洞与修复过程CVE-2019-14287漏洞展示修复漏洞CVE-2019-14287漏洞CVE-2019-14287本地提权漏洞,漏洞因为是Sudo<1.8.28,只需要升级sudo>1.8.28的就可以修复完成展示使用root用户修改权限文件:vim/etc/sudoers,添加... 查看详情
text漏洞修复:android.view.windowmanager$badtokenexception(代码片段)
一次渗透测试漏洞和web漏洞修复(代码片段)
ApacheTomcatAJP连接器请求注入解:将tomcat中conf/server.xml配置文件中<Connectorport=“8009”protocol="AJP/1.3"redirectPort=“8443”/>注释掉DS_Store文件信息泄露.DS_Store是Mac下Finder用来保存如何展示文件//文件夹的数据 查看详情
如何修复appscan漏洞
...能根本解决。不引入新的不稳定因素 2.使用URLSCAN禁用OPTIONS,实际没有真正禁用,但缩小了影响范围。URLSCAN可能有副作用。 3.使用URLSCAN禁用OPTIONS和其他HTTP方法,或者只允许GET/POST/HEAD方法(自动禁用其他方法) [AppSca... 查看详情
centos7修复几个icmp漏洞(代码片段)
...的是firewall防火墙,只能使用firewall-cmd命令禁用掉部分icmp漏洞参考https://www.cnblogs.com/lsdb/p/8204578.html二、漏洞修复1.ICMPtimestamp请求响应漏洞描述:远程主机会回复ICMP_TIMESTAMP查询并返回它们系统的当前时间。这可能允许者一些基于... 查看详情
tomcatexample应用信息泄漏漏洞及修复(代码片段)
文章目录Tomcat介绍漏洞描述受影响范围漏洞复现修复方案免责声明Tomcat介绍Tomcat是一款开源的Web应用服务器软件。Tomcat属于轻量级应用服务器,在中小型系统和并发访问用户不多的场合下被普遍使用,是开发和调试JSP程... 查看详情
tomcatexample应用信息泄漏漏洞及修复(代码片段)
文章目录Tomcat介绍漏洞描述受影响范围漏洞复现修复方案免责声明Tomcat介绍Tomcat是一款开源的Web应用服务器软件。Tomcat属于轻量级应用服务器,在中小型系统和并发访问用户不多的场合下被普遍使用,是开发和调试JSP程... 查看详情
漏洞防御与修复工作(代码片段)
漏洞管理工作是企业安全建设必不可少的一环,在风险管理工作中,漏洞管理能够防患于未然,企业对漏洞管理有着广泛的基础建设和实践经验。但随着攻防技术的发展,传统漏洞管理的安全技术和管理过程,开始面对越来越多... 查看详情
漏洞修复web服务器http设置漏洞(代码片段)
文章目录Web服务器HTTP设置漏洞Web服务器HTTP头信息公开默认的nginxHTTP服务器设置Web服务器错误页面信息泄露修复方案服务验证Web服务器HTTP设置漏洞Web服务器HTTP头信息公开远程Web服务器发送的HTTP标头公开了可以帮助攻击者的信息&... 查看详情
常见安全漏洞及修复方案(代码片段)
1.1跨站脚本(XSS)漏洞漏洞描述跨站脚本攻击(CrossSiteScripting,XSS)发生在客户端,可被用于进行窃取隐私、钓鱼欺骗、偷取密码、传播恶意代码等攻击行为。恶意的攻击者将对客户端有危害的代码放到服务器上作为一个... 查看详情
jquerycve-2019-11358原型污染漏洞分析和修复建议(代码片段)
一、安全通告jQuery官方于日前发布安全预警通告,通报了漏洞编号为CVE-2019-11358的原型污染漏洞。由攻击者控制的属性可被注入对象,之后或经由触发JavaScript异常引发拒绝服务,或篡改该应用程序源代码从而强制执行攻击者注入... 查看详情
上传文件的漏洞复现与修复(代码片段)
本文只说一些我遇到过的上传文件的漏洞。毕竟漏洞太多,我又不可能全部发现。(安全方面的小菜鸟)可能你们的系统比较完善,针对这些漏洞,已有相应的防御手段。我们针对的是那种比较简单的系统ÿ... 查看详情
linux12运维企业实战笔录--02dockerrunc漏洞修复(代码片段)
...回退方案七、yml语言一、背景192.168.11.20存在runc容器逃逸漏洞CVE-2022-365【POC检测原理】。该K8S节点为dcos-jt-01集群的K8S节点,需要对每台节点进行漏洞修复,采用方法为:使用新版本runc二进制文件进行替换,修复runc容器逃逸漏洞... 查看详情
linux12运维企业实战笔录--02dockerrunc漏洞修复(代码片段)
...回退方案七、yml语言一、背景192.168.11.20存在runc容器逃逸漏洞CVE-2022-365【POC检测原理】。该K8S节点为dcos-jt-01集群的K8S节点,需要对每台节点进行漏洞修复,采用方法为:使用新版本runc二进制文件进行替换,修复runc容器逃逸漏洞... 查看详情
http慢速攻击漏洞修复(代码片段)
原理漏洞原理HTTP慢速攻击也叫slowhttpattack,是一种DoS攻击的方式。由于HTTP请求底层使用TCP网络连接进行会话,因此如果中间件对会话超时时间设置不合理,并且HTTP在发送请求的时候采用慢速发HTTP请求,就会导致... 查看详情