修正一些AppScan低等级风险漏洞

AppScan中的一些低等级风险的问题修正建议

另外,关于安全实用性开发人员安全须知

未停用密码栏位的自动完成HTML属性

将HTML中的input元素的password栏位补上autocomplete属性。默认为on,变更为off。PS:该栏位为HTML5新增HTML属性 <!DOCTYPE html>

遗漏”Content-Security-Policy”标头

配置CSP(Content-Security-Policy),在HTTP标头中配置/<meta charset="utf-8">中配置。可简单使用,设置值为default-src 'self'
CSP 的实质就是白名单制度,开发者明确告诉客户端,哪些外部资源可以加载和执行,等同于提供白名单。它的实现和执行全部由浏览器完成,开发者只需提供配置。
关于CSP入门原文-阮一峰

遗漏”X-Content-Type-Options”标头

配置X-Content-Type-Options,在HTTP标头中配置/<meta charset="utf-8">中配置。使用时,值设置为nosniff

值得注意的是,当使用该HTTP标头时,浏览器会检查HTTP响应标头的Content-Type中的MIME类型。当类型不符时,将被拦截。例如.png如HTTP响应标头中的Content-Type不为image/png时,将显示失败。

文件类型的分类

类型描述典型示例
text表明文件是普通文本,理论上是可读的语言text/plain, text/html, text/css, text/javascript
image表明是某种图像。不包括视频,但是动态图(比如动态gif)也使用image类型image/gif, image/png, image/jpeg, image/bmp, image/webp,image/svg+xml(SVG矢量图)
audio表明是某种音频文件audio/midi, audio/mpeg, audio/webm, audio/ogg, audio/wav
video表明是某种视频文件video/webm, video/ogg
application表明是某种二进制数据application/octet-stream, application/pkcs12, application/vnd.mspowerpoint, application/xhtml+xml, application/xml, application/pdf

在web环境最常用的视频文件的格式

MIME 类型音频或视频类型
audio/wave audio/wav audio/x-wav audio/x-pn-wav音频流媒体文件。一般支持PCM音频编码,其他解码器有限支持(如果有的话)。
audio/webmWebM 音频文件格式。Vorbis 和 Opus 是其最常用的解码器。
video/webm采用WebM视频文件格式的音视频文件。VP8 和 VP9是其最常用的视频解码器。Vorbis 和 Opus 是其最常用的音频解码器。
audio/ogg采用OGG多媒体文件格式的音频文件。 Vorbis 是这个多媒体文件格式最常用的音频解码器。
video/ogg采用OGG多媒体文件格式的音视频文件。常用的视频解码器是 Theora;音频解码器为Vorbis 。
application/ogg采用OGG多媒体文件格式的音视频文件。常用的视频解码器是 Theora;音频解码器为Vorbis 。

JavaScript的MIME类型

  • application/ecmascript
  • application/javascript
  • application/x-ecmascript
  • application/x-javascript
  • text/ecmascript
  • text/javascript
  • text/javascript1.0
  • text/javascript1.1
  • text/javascript1.2
  • text/javascript1.3
  • text/javascript1.4
  • text/javascript1.5
  • text/jscript
  • text/livescript
  • text/x-ecmascript
  • text/x-javascript

以下类型的MIME类型(带参或不带参数)禁止解释为脚本语言

  • text/plain
  • text/xml
  • application/octet-stream
  • application/xml

更详细的MIME类型表

遗漏”X-XSS-Protection”标头

配置X-XSS-Protection,在HTTP标头中配置/<meta charset="utf-8">中配置。使用时,值设置为1

  • X-XSS-Protection: 0 (禁用XSS过滤)
  • X-XSS-Protection: 1 (启用XSS过滤(一般默认在浏览器中)。如果检测到跨站脚本攻击,浏览器将消毒页面(删除不安全的部分)。)
  • X-XSS-Protection: 1; mode=block (启用XSS过滤。而非消毒的页面,如果在检测到攻击的浏览器将防止页面的呈现。)
  • X-XSS-Protection: 1; report=(Chromium only) (启用XSS过滤。如果检测到跨站脚本攻击,浏览器将消毒页面并报告违规。本品采用CSP的功能report-uri指令发送报告。)

遗漏HTTP Strict-Transport-Security标头

HTTP严格传输安全(英语:HTTP Strict Transport Security,缩写:HSTS)是一套由互联网工程任务组发布的互联网安全策略机制。网站可以选择使用HSTS策略,来让浏览器强制使用HTTPS与网站进行通信,以减少会话劫持风险。

配置HTTP Strict-Transport-Security,在HTTP标头中配置/<meta charset="utf-8">中配置。使用时,一般值设置为max-age=31536000 (一年内有效)。

HSTS的作用是强制客户端(如浏览器)使用HTTPS与服务器创建连接。服务器开启HSTS的方法是,当客户端通过HTTPS发出请求时,在服务器返回的超文本传输协议响应头中包含Strict-Transport-Security字段。非加密传输时设置的HSTS字段无效。[3]
比如,https://example.com/ 的响应头含有Strict-Transport-Security: max-age=31536000; includeSubDomains。这意味着两点:

  • 在接下来的一年(即31536000秒)中,浏览器只要向example.com或其子域名发送HTTP请求时,必须采用HTTPS来发起连接。比如,用户点击超链接或在地址栏输入 http://www.example.com/ ,浏览器应当自动将 http 转写成 https,然后直接向 https://www.example.com/ 发送请求。
  • 在接下来的一年中,如果 example.com 服务器发送的TLS证书无效,用户不能忽略浏览器警告继续访问网站。

HSTS 简单来说就是强制 HTTPS。这需要分两步,第一步是你的服务器声明愿意放弃HTTP强制所有访问为安全的HTTPS。第二步是向几大浏览器 提起申请。在没有正式接受之前只要用户第一次访问之后,浏览器还是会记住你的HSTS爱好并且之后都会强制 HTTPS 而不是由服务端通过301转向。第二步需要慎用,因为据说难以反悔。一般来说只进行第一步就可以了。

max-age: 记住的时长, 单位是秒 (31536000 = 1 年)

includeSubdomains: 所有子域名都强制使用 https 访问, 这个如果不确定千万别开。

preload: 告诉浏览器可以预加载你的域名的 HSTS。

作用

HSTS可以用来抵御SSL剥离攻击。SSL剥离攻击是中间人攻击的一种,由Moxie Marlinspike于2009年发明。他在当年的黑帽大会上发表的题为“New Tricks For Defeating SSL In Practice”的演讲中将这种攻击方式公开。SSL剥离的实施方法是阻止浏览器与服务器创建HTTPS连接。它的前提是用户很少直接在地址栏输入https://,用户总是通过点击链接或3xx重定向,从HTTP页面进入HTTPS页面。所以攻击者可以在用户访问HTTP页面时替换所有https://开头的链接为http://,达到阻止HTTPS的目的。
HSTS可以很大程度上解决SSL剥离攻击,因为只要浏览器曾经与服务器创建过一次安全连接,之后浏览器会强制使用HTTPS,即使链接被换成了HTTP。
另外,如果中间人使用自己的自签名证书来进行攻击,浏览器会给出警告,但是许多用户会忽略警告。HSTS解决了这一问题,一旦服务器发送了HSTS字段,用户将不再允许忽略警告。

不足

用户首次访问某网站是不受HSTS保护的。这是因为首次访问时,浏览器还未收到HSTS,所以仍有可能通过明文HTTP来访问。解决这个不足目前有两种方案,一是浏览器预置HSTS域名列表,Google Chrome、Firefox、Internet Explorer和Microsoft Edge实现了这一方案。二是将HSTS信息加入到域名系统记录中。但这需要保证DNS的安全性,也就是需要部署域名系统安全扩展。截至2016年这一方案没有大规模部署。
由于HSTS会在一定时间后失效(有效期由max-age指定),所以浏览器是否强制HSTS策略取决于当前系统时间。部分操作系统经常通过网络时间协议更新系统时间,如Ubuntu每次连接网络时,OS X Lion每隔9分钟会自动连接时间服务器。攻击者可以通过伪造NTP信息,设置错误时间来绕过HSTS。解决方法是认证NTP信息,或者禁止NTP大幅度增减时间。比如Windows 8每7天更新一次时间,并且要求每次NTP设置的时间与当前时间不得超过15小时。

浏览器支持

  • Chromium和Google Chrome从4.0.211.0版本开始支持HSTS
  • Firefox 4及以上版本
  • Opera 12及以上版本
  • Safari从OS X Mavericks起
  • Internet Explorer和Microsoft Edge从Windows 10开始支持

检查到隐藏目录(403禁止改为404不存在)

可以的话,将回应状态码[403 - 禁止] 改为[404 - 不存在],这样会将网站目录模糊化,可以防止泄漏网站结构。

可以在filter过滤器中自写wrapper,重写sendError。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
package com.yz.test.util;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpServletResponseWrapper;

public class YZHttpServletResponseWrapper extends HttpServletResponseWrapper{
HttpServletResponse _response;
HttpServletRequest _request;

public YZHttpServletResponseWrapper(HttpServletRequest request,HttpServletResponse response){
super(response);
_response = response;
_request = request;
}

@Override
public void sendError(int sc,String msg) throws IOException{
String path = _request.getServletPath() + _request.getPathInfo();
if(sc == 403 && path != null){
_response.sendError(404,msg);
}else{
_response.sendError(sc,msg);
}
}

@Override
public void sendError(int sc) throws IOException{
String path = _request.getServletPath() + _request.getPathInfo();
if(sc == 403 && path != null){
_response.sendError(404);
}else{
_response.sendError(sc,ms);
}
}
}

谢谢大爷打赏,常来玩啊