前言
标头是HTTP规范的一部分,在HTTP请求和响应中定义消息的元数据。当用户通过客户端浏览器访问网站时,服务器使用HTTP响应头进行响应。虽然HTTP消息通常由用户读取,但元数据仅由Web浏览器处理,并且自1.0版以来已包含在HTTP协议中。
在请求消息中,元数据可以包含以下信息:
1.请求的语言;
2. Cookies;
3.网站证书;
4.缓存数据
而在响应消息中,元数据可以包含以下信息:
1.内容的大小和类型;
2.缓存存储首选项;
3.服务器数据;
4.时间和日期;
5.由客户端设置的凭据;
安全标头是HTTP响应标头,它定义了web浏览器上的一组安全预防措施是应该被激活还是应该被停用。HTTP安全标头是网站安全的基本组成部分。在超文本传输协议( Hypertext Transfer Protocol ,HTTP)的请求和响应消息中,协议头部分的那些组件。HTTP安全标头实施后,可防止XSS,代码注入,clickjacking等。
本文的内容由以下章节组成:
1.X-Frame-Options HTTP响应头
1.1如何防止点击劫持攻击;
1.2 X-Frame-Options HTTP响应头选项指令;
1.3关于X-Frame-Options HTTP响应头的要点;
1.4哪些浏览器支持X-Frame-Options HTTP响应头;
2.X-XSS-Protection HTTP响应标头
2.1恶意攻击者在利用反射型XSS漏洞时可以做些什么?
2.2不同的X-XSS-Protection HTTP响应头指令;
2.3绕过XSS阻断机制
3.X-Content-Type-Options HTTP标头
3.1文本文件上传示例;
4.X-Download-Options HTTP标头
4.1Cookie盗窃示例;
5.内容安全策略(CSP)HTTP标头
5.1内容安全策略指令;
5.1.1 default-src指令示例;
5.2使用内容安全策略时要记住的一件事;
6.HTTP严格传输安全性(HSTS)HTTP标头
6.1有没有办法进一步改善你网站上的HTTPS保护?
6.1.1严格的传输安全标头示例;
6.2第一次请求和预加载;
6.2.1HSTS预加载列表的附加要求
7.HTTP公钥固定
7.1证书颁发机构和冒牌颁发机构;
7.1.1如何防止伪造证书;
7.2 HPKP标头的设置;
7.3HPKP指令
7.4哪些浏览器支持PKP安全标头?
8.Expect-CT HTTP标头
8.1证书透明(Certificate Transparency,CT)日志
8.1.1CT日志的工作原理;
8.1.2CT日志所存在的风险?
8.2我们如何实现Expect-CT标头?
9.Referrer-Policy HTTP标头
9.1Referrer-Policy标头的工作原理;
9.2Referrer-Policy指令;
9.3哪些浏览器支持Referrer-Policy安全标头?
10积极主动的探索和预防是至关重要的!
X-Frame-Options HTTP标头
X-Frame-Options标头是Microsoft建议的一种安全标头,以避免自2009年开始的界面伪装(UI redressing) 点击劫持攻击,目前所有主流浏览器都支持它。
UI Redressing攻击基于在iframe中加载web页面并将其与其他UI元素叠加。目前已有各种类型的UI Redressing,例如劫持击键或提取内容,每一种攻击都有其优点。
点击劫持攻击方法的工作原理是将恶意网站加载到一个低不透明度的iframe中,并在其上叠加一个看上去无害的按钮、复选框或链接,从而诱使用户与下面的易受攻击的网站进行交互。这会强制用户单击明显安全的UI元素,从而在嵌入的易受攻击的网站上触发一系列操作。
在此示例中,亚马逊网站以一个低不透明度iframe加载,因此用户无法看到加载过程。他们看到的是Click Here按钮而不是下面的Buy按钮。但是,当用户单击Click Here按钮时,实际上单击的是亚马逊网站上的Buy按钮,这会触发一些列购买操作。
由于这些交互发生在受害者有意浏览网站的情况下,因此在亚马逊网站上触发的交互也将包括受害者的凭证(如cookie)。请注意,此场景完全是为了讲解本文而虚构的,并且设置在无法使用X-Frame-Options标头等安全机制的环境中。
如何防止点击劫持攻击
点击劫持是一种针对用户的攻击,是网络安全链中最薄弱的环节。目前已经出现了多种防护方法,例如Frame Busting,以保护用户免受此攻击。其中最可靠的方法是X-Frame-Options标头,它在2009年被添加到Microsoft的Internet Explorer浏览器中。
为了保护用户免受点击劫持之类的攻击,最好的策略是防止恶意网站利用iframe或frame构建我们的页面。为此,我们可以使用X-Frame-Options安全标头来执行此操作。
X-Frame Options指令
有三种X-Frame-Options指令可用:
X-Frame-Options: DENY | SAMEORIGIN | ALLOW-FROM URL
指令说明:
· DENY:页面不得嵌入到iframe或任何类似HTML元素中的其他页面中。
· SAMEORIGIN::网站只能嵌入到根据方案、主机名和端口配对的网站中,例如,https://www.example.com只能通过https://www.example.com加载,而https://www.attacker.com甚至http://example.com都不允许嵌入。
· ALLOW-FROM URL:加载的网站只能由此处指定的URL框架,使用X-Frame-Options有两点需要记住:
1.基于Chromium的浏览器仅部分支持X-Frame-Options(ALLOW-FROM指令不可用);
2.使用ALLOW-FROM URL指令,我们只能将一个域列入白名单,并允许该网站加载一个iframe;
关于X-Frame-Options HTTP标头的重要事项
1.X-Frame-Options标头必须出现在所有页面的HTTP响应中;
2.可以使用Content-Security-Policy frame-ancestors指令代替X-Frame-Options:
Content-Security-Policy: frame-ancestors 'none'; // No URL can load the page in an iframe. Content-Security-Policy: frame-ancestors 'self'; // Serves the same function as the SAMEORIGIN parameter.
虽然你可以将X-Frame-Options中的一个网址列入白名单,但使用CSP frame-ancestors,你可以添加多个将你的网站嵌入iframe的网址。
哪些浏览器支持X-Frame-Options HTTP标头?
与许多安全功能一样,X-Frame-Options标头在浏览器中起初并不总是能被用到,对这种标头的需求要等很长一段时间才能被用到。因此,并非所有浏览器都在其第一个版本中支持它。不过,几乎所有现代浏览器都支持X-Frame-Options,不管是全部支持,还是部分支持。如上所述,并非所有浏览器都支持ALLOW-FROM指令。
X-XSS-Protection HTTP标头
X-XSS-Protection允许开发人员更改Reflected XSS(跨网站脚本)安全过滤器的行为,这些过滤器旨在检测危险的HTML输入,并阻止网站加载或删除潜在的恶意脚本。
恶意攻击者在利用反射型XSS漏洞时可以做些什么?
反射型XSS是一种漏洞,它是由于在页面上下文中将用户输入作为脚本代码进行评估而产生的。XSS(Cross Site Scripting),又称跨站脚本,XSS的重点不在于跨网站,而是在于脚本的执行。XSS的目标是让其他网站的js文件运行在目标网站的上,这主要发生在页面渲染阶段。在该阶段发生了某些非预期的脚本行为,该脚本可能来自用户的输入,也可能来自域外的其他js文件,不一而足。XSS的发生起来源来自于用户输入,因此XSS根据用户输入数据以何种形式、何时触发XSS、是否有后端服务器的参与划分为三种类型,分别是反射型XSS、持久型XSS和DOM XSS。
反射型XSS漏洞发生时,会产生很多恶意行为,例如窃取用户的cookie、跟踪键盘敲击或鼠标移动,或伪装成用户发出请求,这些行为都可以在XSS的帮助下执行。以上就是反射型XSS漏洞的工作原理,你可以参考以下PHP代码。
<p>Welcome <?php echo $_GET["name"];?></p>
通过将以下HTML和JavaScript代码传递给name参数,应用程序可以不经过滤,就将其嵌入页面中,这将在易受攻击的网站上显示JavaScript警告窗口。
http://www.example.com?name=<script>alert(1);</script>
不同的X-XSS-Protection标头指令
可以使用各种指令在Web浏览器中更改XSS过滤器的行为。在这一节中,我们将解释不同的指令以及它们的目的。
X-XSS-Protection: 1
这是默认设置,它可以在Web浏览器上启用XSS过滤,并阻止在页面上执行潜在的XSS有效载荷。
X-XSS-Protection: 1; mode=block;
这样就可以在浏览器中进行XSS过滤,它通过阻止页面的呈现来避免潜在的XSS有效载荷执行。部署XSS有效载荷后,访问者在浏览器上获得一个空白页面。
在基于Chromium的浏览器中,它可以将XSS注入尝试报告给report指令中指定的URL。
X-XSS-Protection: 1; mode=block; report=https://domain.tld/folder/file.ext
XSS过滤器负责检测反射的脚本代码,如果在HTML页面上的请求和响应中都发现了潜在的恶意HTML代码,则会触发它。虽然某些指令会指示浏览器删除有问题的恶意脚本,但其他指令会完全阻止页面的呈现。
例如:
请求网址:
http://www.example.com/?param=<script>alert(1);</script>
回应对象:
… <div> <script>alert(1);</script> </div>
然而,XSS过滤器过去曾被滥用,以阻止HTML页面的部分呈现。攻击者可以利用XSS过滤器的默认行为,如果它出现在页面的URL中,XSS过滤器则会阻止任何可能存在危险的代码。
绕过XSS阻断机制
攻击者还使用XSS过滤器来禁用重要的HTML和JavaScript代码,例如,Frame Busting机制。近年来,一些新的攻击技术已经被开发出来,可以在这些过滤器的帮助下停用脚本或窃取用户数据。
现在,让我们看一个Frame Busting机制的示例。framebusting 代码都是基于 javascript 的,以此来检测框架和“破环”自身。如果 javascript在子框架内容中被禁用,framebusting 代码将不会运行。如果开发人员发现该网站是在一个框架内加载的,他们可以使用以下代码将顶部窗口重定向到他们的网站。
<script> if(top != self) { top.location = self.location; } </script>
攻击者可以使用默认情况下处于活动状态的X-XSS-Protection机制绕过此防御:
<iframe src="http://www.victim.com/?v=<script>if">
为了完成跨网站脚本攻击https://www.netsparker.com/blog/web-security/cross-site-scripting-xss/,有时X-XSS-Protection: 1;(Internet Explorer中的默认设置)也可以用于绕过XSS阻止机制。不过目前这些漏洞已被修复,不过该漏洞还是再提醒我们,添加到浏览器中每个功能都会威胁终端用户的安全,甚至是那些旨在增强其安全性的功能。
研究人员认为,现代浏览器中的内容安全策略(Content Security Policy,简称CSP)是一种以可信白名单作机制,来限制网站中是否可以包含某来源内容。默认配置下不允许执行内联代码 (<script>块内容,内联事件,内联样式),以及禁止执行 eval() , newFunction() , setTimeout([string], …) 和setInterval([string], …) 。这意味着Content-Security-Policy标头足以确保不再需要X-XSS-Protection等机制。然而,有些人则认为该功能不够安全,并没有增加太多安全功能。
X-Content-Type-Options HTTP标头
这个HTTP标头通常用于控制Web浏览器中的MIME类型嗅探功能,MIME类型嗅探是浏览器在未指定内容类型时使用的内容评估功能。基本上,如果内容类型的标头为空或干脆遗失 了,浏览器会“嗅探”内容并尝试以最合适的方式显示内容来源。
但是,如果与上传功能结合使用,由于此嗅探过程可能会带来一些风险,因此开发人员应非常小心如何使用此标头,下面是一个突出显示安全风险的示例。
文本文件上传示例
假设用户可以将文本文件上传到网站,如果上传的文件包含HTML、脚本标签或Javascript代码,并且我们在返回时未指定内容类型,则会发生以下情况:
浏览器将嗅探网站内容;
确定嗅探内容是文本文件还是html类型的文件;
直接在网站运行代码;
即使是上传到我们网站的图像文件,在返回给用户时也应该包含Content-Type标头文件。否则,脚本和其他恶意代码可能会被注入到图像文件的元数据(EXIF数据)中并被执行。
要防止浏览器嗅探页面内容并决定使用哪种MIME类型,请使用带有nosniff指令的X-Content-Type-Options标头:
X-Content-Type-Options: nosniff
X-Download-Options HTTP标头
可以使用X-Download-Options标头下载所请求的数据,这样就不用在浏览器中进行查看了。 X-Download Options标头可在Internet Explorer 8及更高版本的浏览器中使用。
因此,该标头就像一个深度防御机制,特别适合于允许用户上传内容的应用程序,以下是此标头帮助你避免攻击的示例。
避免Cookie被盗窃的示例
假设一个用户将名为stealcookie.html的文件上传到我们的测试网站,此时你不需要执行文件就可以使用以下标头强制下载文件。
Content-Disposition: attachment; filename=stealcookie.html
虽然我们进行了强制下载,但下载时网站仍会提示用户是否应该下载文件或打开文件。如果用户选择打开该文件,则恶意代码将开始执行。
如果用户单击“打开”该文件,该文件将被浏览器解析并显示在我们的网站上,从而使文件中的恶意代码能够访问同一域中的所有其他页面。
防止这种情况发生的唯一方法是通过向X-Download-Options HTTP头添加noopen指令来删除用户必须打开文件的选项:
X-Download-Options: noopen
使用此指令时,就防止恶意代码在我们的网站上运行,且此时用户仍然可以保存文件并将其打开。不过要注意的是,它将在用户的文件系统上运行。
内容安全策略(CSP)HTTP标头
内容安全策略于2012年11月被正式推出,针对XSS、Clickjacking、协议降级、帧注入等多个漏洞,为用户增加了一层安全防护。针对多个漏洞提供了额外的安全保护,例如XSS,点击劫持(ClickJacking),降级协议攻击(Protocol Downgrading)和框架注入(Frame Injection),其中,点击劫持(ClickJacking)是一种视觉上的欺骗手段。大概有两种方式,一是攻击者使用一个透明的iframe,覆盖在一个网页上,然后诱使用户在该页面上进行操作,此时用户将在不知情的情况下点击透明的iframe页面;二是攻击者使用一张图片覆盖在网页,遮挡网页原有位置的含义。在不久的将来,CSP或将成为客户端安全保障方面的最重要的工具,因为它会成为默认情况下那些未启用的安全标头(如X-Frame-Options和X-XSS-Protection)的替代方案。
以下是CSP标头示例:
Content-Security-Policy: <policy-directive>; <policy-directive>
在CSP中,我们使用白名单来定义规则。通过这种方法,我们可以过滤掉任何不符合安全规则的资来源,我们所要做的就是在Content-Security-Policy响应标头中声明资来源。
Content-Security-Policy: script-src 'self' https://apis.google.com
这个CSP指令仅允许通过我们的域和加载脚本,任何其他内联脚本都不会运行。
内容安全策略指令
除了CSP标头之外,我们还可以使用以下指令进一步限制和定义资来源的使用。以下是内容安全策略指令及其代表的具体含义:
· base-uri: 这个指令中的基本HTML元素包含绝对URL,参数 baseUri 是用来将相对 URL 转成绝对URL,并指定从哪个网站获取文档。该指令可以帮助我们限制基本HTML元素中允许使用的URL,从而防止Base Tag劫持攻击。
· child-src::这个指令允许我们定义哪些网站被允许加载到页面上的框架中。我们可以使用它作为额外的预防措施来保护我们的页面免受框架注入攻击。
· connect-src:指令定义了请求、XMLHttpRequest、WebSocket 和 EventSource 的连接来源,另外该指令限制了可以通过脚本接口(如XHR或WebSockets)加载的资来源。这可以防止攻击者窃取网站上的数据。
· font-src:该指令定义了通过 @font-face加载字体的有效来源,它主要用于防止攻击者使用@ font-face src指令将提取的数据发送回服务器。
· form-action:该指令指定了可用作表单提交目标的URL,它可以作为额外的预防措施来保护页面免受表单标记劫持(Form Tag Hijacking)和跨网站脚本攻击。
· frame-ancestors:此伪指令指定有权在框架,iframe,object,embed和applet标记中加载当前页面的网站。它是X-Frame-Options的替代品,因为它还可以帮助防止Clickjacking和UI Redressing攻击。
· IMG-SRC:该指令指定了图像和网站图标的有效加载来源。
· media-src:该指令定义或限制了可以加载视频和音频的来源。
· object-src:该指令定义或限制了来自<object>,<embed>和<applet>的来源,这有助于防止跨网站脚本攻击。
· plugin-types:该指令定义或限制了可以加载的插件类型。
· report-uri:该指令指定了在违反CSP指令时接收报告的URL。
· style-src:该指令定义或限制了CSS文件的来源,这样就可以避免通过CSS所进行的数据泄露。
· Upgrade-Insecure-Requests:该指令 是一个请求首部,用来向服务器端发送信号,表示客户端优先选择加密及带有身份验证的响应,并且它可以成功处理 upgrade-insecure-requests CSP指令。另外,该指令将HTTP请求转换为HTTPS。
default-src指令示例
default-src 指令定义了那些没有被更精确指令指定的(默认)安全策略。该指令包含了以下指令:
child-src connect-src font-src img-src media-src object-src script-src style-src
注意:默认情况下,这些指令是不受限制的,这意味着如果它们未在CSP标头中声明,则任何请求都将通过。因此,如果style-src没有给出任何值,则它会被自动解释为style-src: *,此时来自所有来源的样式都将允许通过。
不过,我们可以使用default-src指令来改变这一点。此时指定的值将覆盖以-src结尾的大多数指令,将它们设置默认值。如果我们将default-src定义为http://www.example.com且没有为font-src设置值,则字体只能从https://www.example.com加载。
但是,default-src不能覆盖这些指令:
base-uri form-action frame-ancestors plugin-types report-uri sandbox
我们可以在一个HTTP头中添加多个指令,方法是用分号将它们分隔。
script-src https://host1.com https://host2.com; style-src https://www.example.com
指令的多个值必须用空格隔开:
script-src https://host1.com https://host2.com;
使用内容安全策略时要切记
为HTTP响应中的每个页面集定义CSP,这将帮助你为每个页面及其特定需求定义最佳策略。你可以点此了解有关内容安全策略(CSP)的更多信息。
本文我们对HTTP标头的安全意义做了介绍,下一篇我就介绍一下有哪些标头可以起到实际的安全防护作用?