WEB项目的HTTP HEADER常见的安全漏洞

WEB项目中有些常见的漏洞,是大家都没注意到或者不了解的。

这里梳理一些常见的漏洞,给大家做说明与提供一套解决方案。

- 检测到目标X-Content-Type-Option响应头缺失

- 检测到目标X-XSS-Protection响应头缺失

- 检测到目标Content-Security-Policy响应头

- 检测到目标URL存在HTTP host头攻击漏洞

- 检测到目标URL启用了不安全的HTTP方法

- 检测到目标主机可能存在缓慢的HTTP拒绝服务攻击

---

## 1. 检测到目标X-Content-Type-Options响应头缺失

> X-Content-Type-Options HTTP消息头相当于一个提示标志,被服务器用来提示客户端一定要遵循在Content-Type首部中对[MIME](https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Basics_of_HTTP/MIME_types)类型的设定,而不能对其进行修改。这就禁用了客户端的MIME类型嗅探行为,换句话说,也就是意味着网站管理员确定自己的设置没有问题。

### 解决方案

此类问题事实上是要阻止浏览器对MIME的嗅探行为。当MIME的类型缺失浏览器会通过查看资源对MIME进行嗅探,而这个操作可能涉及安全问题。所以我们应该尽量的设置MIME类型,然后禁用MIME嗅探的行为。

1. 设置response响应报文头

2. 添加X-Content-Type-Options字段,并设值为“nosniff"

```java

@Override 

public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { 

    HttpServletRequest request = (HttpServletRequest) servletRequest; 

HttpServletResponse response = (HttpServletResponse) servletResponse; 

response.addHeader("X-Content-Type-Options","nosniff"); 

filterChain.doFilter(request,response); 

}

```

---

## 2. 检测到目标X-XSS-Protection响应头缺失

> HTTP [X-XSS-Protection](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-XSS-Protection)响应头是Internet Explorer,Chrome和Safari的一个特性,当检测到跨站脚本攻击(XSS)时,浏览器将停止加载页面。

### 解决方案

XSS的攻击防御其实涉及很多方面的修改,这里我们不详述。我们可以先通过启用XSS过滤来做基本的防御。

配置说明

- 0:禁用XSS

- 1:启动XSS;mode= block:检测到攻击,浏览器将阻止页面的呈现,而不是过滤页面中的XSS内容;report=\<reporting-url\>,仅限chrome,检测到攻击后,将报告行为至指定的服务。

1. 设置ersponse响应报文头

2. 添加X-XSS-Protection字段,并设为"1;mode=block"

```java

@Override 

public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { 

    HttpServletRequest request = (HttpServletRequest) servletRequest; 

HttpServletResponse response = (HttpServletResponse) servletResponse;   

response.addHeader("X-XSS-Protection","1;mode=block");

filterChain.doFilter(request,response); 

}

```

---

## 3. 检测到目标Content-Security-Policy响应头

>HTTP响应头Content-Security-Policy允许站点管理者控制用户代理能够为指定的页面加载哪些资源.除少数例外情况,设置的政策主要涉及指定服务器的源和脚本结束点.

### 解决方案

```java

@Override 

public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { 

    HttpServletRequest request = (HttpServletRequest) servletRequest; 

HttpServletResponse response = (HttpServletResponse) servletResponse; 

response.addHeader("Content-Security-Policy","default-src 'self");

filterChain.doFilter(request,response); 

}

```

---

## 4. 检测到目标URL存在HTTP host头攻击漏洞

> 为了方便的获得网站域名,开发人员一般依赖于HTTP Host header。但是这个header时不可信赖的,如果应用程序没有对host header值进行处理,就有可能造成而已代码的传入。

### 解决方案

对此为WEB项目的host进行管理,通过设置白名单的方式规定可访问的域名。

1. 设置拦截器,获取报文头的host字段。

2. 配置拦截器的白名单。

```java

private static final String[] HOST_LIST = {"127.0.0.1","localhost","0.0.0.0"}; 


@Override 

public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { 

    HttpServletRequest request = (HttpServletRequest) servletRequest; 

HttpServletResponse response = (HttpServletResponse) servletResponse; 

String host = response.getHeader("host"); 

if(!checkBlankList(host)){ 

        response.setStatus(HttpStatus.FORBIDDEN.value()); 

return;

}

filterChain.doFilter(request,response);


private boolean checkBlankList(String host){ 

    boolean isAllow = false; 

if(host == null){ 

    isAllow = true; 

}

for (String blankHost : HOST_LIST){ 

    if(blankHost.contains(host)){ 

        isAllow = true; 

    } 

    return isAllow; 

}

```

---

## 5. 检测到目标URL启用了不安全的HTTP方法

> 检测到目标WEB服务器配置成允许下列其中一个(或多个)HTTP方法:DELETE,SEARCH,COPY,MOVE,PROPFIND,PROPPATCH,MKCOL,LOCK,UNLOCK。

> 这些方法表示可能在服务器上使用了WebDAV。由于dav方法允许客户端操纵服务器上的文件,如果没有合理配置dav,有可能允许未授权的用户对其进行利用,修改服务器上的文件。

### 解决方案

配置所能接收的请求方法,一般配置为POST、GET两个方法就够了,有其他需求的就加上

```java

@Override 

public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { 

HttpServletRequest request = (HttpServletRequest) servletRequest; 

HttpServletResponse response = (HttpServletResponse) servletResponse; 

if(!isAllowMethod(request)){ 

response.setStatus(HttpStatus.NOT\_FOUND.value()); 

return;

filterChain.doFilter(request,response); 

}

private boolean isAllowMethod(HttpServletRequest request){ 

boolean isAllow = false; 

String method = request.getMethod(); 

if(HttpMethod.GET.toString().equals(method)|| HttpMethod.POST.toString().equals(method)){ 

isAllow = true; 

return isAllow; 

}

```

---

## 6. 检测到目标主机可能存在缓慢的HTTP拒绝服务攻击

> 缓慢的HTTP拒绝服务攻击时一种专门针对Web的应用层拒绝服务攻击,攻击者操纵网络上的肉鸡,对目标Web服务器进行海量HTTP请求攻击,直到服务器带宽被打满,造成了拒绝服务。

### 解决方案

此类问题一般从两个方向解决:1,规定请求的连接并发数;2,设置请求超时时间。

```properties

server.connection-timeout= 5000

server.tomcat.max-connections = 10000

```

---

## 7. 点击劫持:X-Frame-Options未配置

>点击劫持是一种视觉上的欺骗手段。攻击者使用一个透明的、不可见的iframe,覆盖在一个网页上,然后诱使用户在该网页上进行操作,此时用户将在不知情的情况下点击透明的iframe页面。通过调整iframe页面的位置,可以诱使用户恰好点击在iframe页面的一些功能性按钮上。

### 解决方案

1. 添加X-Frame-Options响应头

- DENY:不能被嵌入。

- SAMEORIGIN:只能嵌入本站。

- ALLOW-FROM:指定能嵌入的站点

2. 设置response的响应头

```java

public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { 

    HttpServletRequest request = (HttpServletRequest) servletRequest; 

HttpServletResponse response = (HttpServletResponse) servletResponse; 

//response.addHeader("X-frame-options","DENY"); 

//response.addHeader("X-frame-options","SAMEORIGIN"); 

response.addHeader("X-frame-options","ALLOW-FROM 'http://localhost:9080'"); 

filterChain.doFilter(request,response); 

}

```

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,684评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,143评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,214评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,788评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,796评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,665评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,027评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,679评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,346评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,664评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,766评论 1 331
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,412评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,015评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,974评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,073评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,501评论 2 343

推荐阅读更多精彩内容

  • 防止用户直接访问url的权限控制通过判断父类URL是否存在,判断是通过系统跳转的链接还是通过浏览器直接输入的跳转链...
    叨唧唧的阅读 475评论 0 2
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,596评论 18 139
  • Struts2远程命令执行漏洞 关于Struts Struts是Apache基金会的一个开源项目,Struts通过...
    菜神一把梭阅读 1,333评论 0 0
  • 目录 1 Socket 2 软件结构 3 Servlet 4 HTTP5 单点登录SSO 6 常见问题...
    小小千千阅读 521评论 0 0
  • 一、HTTP协议概念 1.1 什么是HTTP协议 HTTP协议:浏览器客户端跟服务器端的数据传输格式的规范 2.1...
    烦远远阅读 527评论 0 0