前言
我们在开发应用系统的时候,总会遇到各种各样的漏洞,即便是项目上线后,甲方霸霸也会找专门搞安全的公司来对我们的应用系统进行扫描,扫描完后或多或少也会出现一些漏洞,我们就得加班对这些漏洞进行修复…
大聪明开发的应用系统已经上线三年了,然而就在昨天依然被扫描出了一个漏洞 —— 远程 Web 系统应用程序不采取措施来减轻一类 Web 应用程序漏洞,说白了就是远程网络应用程序不设置 X-Content-Type 响应头。刚看到扫描报告的时候还真有点麻爪,不知道如何下手,最后经过一番努力还是成功的修复了这个漏洞✌,那么借此机会,大聪明就和大家分享一下如何修复此类漏洞😊。
漏洞修复
漏洞简介
首先我们先简单说说 Content-Type 响应头有什么用👇
互联网上的资源类型有很多种,通常浏览器会根据响应头的 Content-Type 字段来分辨这些资源的类型。比如 “text/html” 代表的是 html 类型的文件, “image/png” 则代表的是 png 图片,“text/css” 则是 css 样式文件。然而有些资源的 Content-Type 字段是错的或者未定义。此时某些浏览器就会启用 MIME-sniffing 来猜测该资源的类型(但是猜测的并不一定准确),猜测后再解析该文件的内容并开始执行。如果此时我们给一个 html 文件指定 Content-Type 为 “text/plain” ,那么在某些浏览器中这个文档依然会被当做 html 文件来解析。因为某些浏览器存在这个特性,攻击者就利用这一特行让原本应该解析为图片的请求被解析为 JavaScript 代码,从而实现一些不可告人的目的🈲。为了防止应用系统被攻击,我们就需要将应用系统的页面都设置上响应头 —— X-Content-Type-Options:nosniff。
说完 Content-Type 响应头,可能有一些小伙伴会想到另外两个响应头—— X-Frame-Options 和 X-XSS-Protection,那么我们这里也简单的说几句👇
- X-Frame-Options 响应头:为了减少点击劫持(Clickjacking)而引入的 X-Frame-Options 响应头,这个响应头支持三种配置:① DENY(不允许被任何页面嵌入);② SAMEORIGIN(不允许被本域以外的页面嵌入);③ ALLOW-FROM URL(不允许被指定的域名以外的页面嵌入)。
- X-XSS-Protection响应头:该响应头的作用是防范 XSS 攻击,现在主流浏览器都支持该响应头,并且都默认开启了 XSS 保护,该响应头也是有三种配置:① 0(禁用XSS保护);② 1(启用XSS保护);③ 1;mode=block(启用XSS保护,并在检查到XSS攻击时,停止渲染页面)。不过有一点是需要注意的,虽然浏览器提供的防止 XSS 攻击保护机制并不完美,但是开启后仍然可以给予一定的防护能力,所以没有特殊的情况,我们一定不要关闭该响应头。
漏洞修复方法
修复此类漏洞的方式也很简单,下面就针对两种常见情况和大家分享一下修复此类漏洞的方法~
情况一:应用系统部署在 Tomcat 下
如果我们的应用系统部署在了 Tomcat 下,那么我们只需要在 Tomcat 下的 web.xml 配置文件中增加几行配置即可(文件路径:Tomcat 根目录/conf/web.xml)👇
<filter>
<filter-name>httpHeaderSecurity</filter-name>
<filter-class>org.apache.catalina.filters.HttpHeaderSecurityFilter</filter-class>
<init-param>
<param-name>antiClickJackingOption</param-name>
<param-value>SAMEORIGIN</param-value>
</init-param>
<async-supported>true</async-supported>
</filter>
<filter-mapping>
<filter-name>httpHeaderSecurity</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
如果我们使用的是低版本的 Tomcat ,有可能会找不到 org.apache.catalina.filters.HttpHeaderSecurityFilter 相关的 jar 包,此时我们可以去高版本的 Tomcat 中将对应的 HttpHeaderSecurityFilter 文件复制到低版本的 Tomcat 中。配置成功后我们需要重启 Tomcat 服务,增加的配置才会生效。如下图所示👇
情况二:Spring Boot 项目生成的 Jar 包(Tomcat 集成在 Jar 包中)
如果我们使用 Spring Boot 开发应用系统,很多小伙伴都会选择将项目打成 Jar 包来进行部署,此时我们就没办法通过修改 Tomcat 下的 web.xml 配置文件来修复此类漏洞了(毕竟 Spring Boot 帮我们把 Tomcat 集成在项目中了,想找 web.xml 配置文件都找不到😂)。针对此类情况,我们就可以使用过滤器来解决问题👇
import java.io.IOException;
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.stereotype.Component;
import org.springframework.web.filter.OncePerRequestFilter;
/**
* 使用过滤器增加响应头(以 X-Content-Type-Options:nosniff 为例)
* @description: AddResponseHeaderFilter
* @author: 庄霸.liziye
* @create: 2022-03-03 15:21
**/
@Component
public class AddResponseHeaderFilter extends OncePerRequestFilter {
protected void doFilterInternal(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse,
FilterChain filterChain) throws ServletException, IOException {
httpServletResponse.addHeader("X-Content-Type-Options", "nosniff");
filterChain.doFilter(httpServletRequest, httpServletResponse);
}
}
过滤器增加后,我们重启一下项目看看效果👇
解决此类漏洞方式是不是跟简单 (●’◡’●) ,通过这么几行代码就能让我们的应用系统的安全性提升一大截✌~