使用HTTP Headers防御WEB攻击(Part3)

标签: 资讯 | 发表时间:2015-07-27 02:28 | 作者:鸢尾
出处:http://www.freebuf.com

在FreeBuf之前发布的《 使用HTTP Headers防御WEB攻击(Part1) 》,《 使用HTTP Headers防御WEB攻击(Part2) 》中讲述了如何使用HTTP Headers对WEB攻击进行防御,比如使用X-Frame-Options以及X-XSS-Protection。在本文中,我们将探索如何利用HTTP Headers保卫我们的Cookies。

简介

在用户会话中Cookies是一个十分重要的东西,一个身份验证的Cookies就相当于是密码。保卫这些身份验证的Cookies是一个十分重要的话题。在本文中,我们将演示如何在PHP应用中执行某些Cookies属性从而在某些攻击中保护我们的Cookies。

使用HTTP Header保护Cookies

这是一个已知的事实,跨站脚本攻击是一个十分危险的漏洞,其能够让攻击者从用户浏览器窃取到Cookies。HttpOnly的引进能够禁用外部JavaScript脚本读取Cookies。即使应用程序本身存在XSS漏洞,只要开启了HTTPOnly标记就无法读取Cookies。

现在我们就打开上一篇文章中使用过的简单应用程序。

首先,观察HTTP响应中的头信息

HTTP/1.1 200 OK
Date: Sun, 12 Apr 2015 15:07:14 GMT
Server: Apache/2.2.29 (Unix) mod_fastcgi/2.4.6 mod_wsgi/3.4 Python/2.7.8 PHP/5.6.2 mod_ssl/2.2.29 OpenSSL/0.9.8y DAV/2 mod_perl/2.0.8 Perl/v5.20.0
X-Powered-By: PHP/5.6.2
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
Set-Cookie: PHPSESSID=a2ed2bf468dd811c09bf62521b07a023; path=/
Content-Length: 820
Keep-Alive: timeout=5, max=100
Connection: Keep-Alive
Content-Type: text/html; charset=UTF-8

正如我们所见,在Set-Cookie头中没有额外的标记。如果该应用存在Xss漏洞那么攻击者就能够轻松获取到Cookies信息。

为了避免这种情况,我们可以使用HTTPOnly标记。这使得我们只能够通过HTTP协议来发送Cookies信息,而不能使用JavaScript。

启用HTTPOnly标记

如下示例代码片段中演示了在PHP应用中启用HTTPOnly标记的一种方法:

<?php
ini_set("session.cookie_httponly", "True");
session_start();
session_regenerate_id();
if(!isset($_SESSION['admin_loggedin']))
{
    header('Location: index.php');
}
if(isset($_GET['search']))
{
    if(!empty($_GET['search']))
    {
        $text = $_GET['search'];
    }
    else
    {
        $text = "No text Entered";
    }
}
?>
<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title>Admin Home</title>
        <link rel="stylesheet" href="styles.css">
    </head>
    <body>
 
        <div id="home"><center>
        </br><legend><text id=text><text id="text2">Welcome to Dashboard...</text></br></br> You are logged in as: <?php echo $_SESSION['admin_loggedin']; ?> <a href="logout.php">[logout]</a></text></legend></br>
        <form action="" method="GET">
            <div id="search">
            <text id="text">Search Values</text><input type="text" name="search" id="textbox"></br></br>
 
            <input type="submit" value="Search" name="Search" id="but"/>
 
            <div id="error"><text id="text2">You Entered:</text><?php echo $text; ?></div>
 
            </div>
        </form></center>
    </div>
 
    </body>
</html>

从上面的代码片段中我们可以看出下面这一行代码是用来开启HTTPOnly的:

ini_set("session.cookie_httponly", "True");

接下来我们就来看看在HTTPOnly标记开启之后获得的HTTP头信息

HTTP/1.1 200 OK
Date: Sun, 12 Apr 2015 15:03:15 GMT
Server: Apache/2.2.29 (Unix) mod_fastcgi/2.4.6 mod_wsgi/3.4 Python/2.7.8 PHP/5.6.2 mod_ssl/2.2.29 OpenSSL/0.9.8y DAV/2 mod_perl/2.0.8 Perl/v5.20.0
X-Powered-By: PHP/5.6.2
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
Set-Cookie: PHPSESSID=36cb82e1d98853f8e250d89be857a0d3; path=/; HttpOnly
Content-Length: 820
Keep-Alive: timeout=5, max=100
Connection: Keep-Alive
Content-Type: text/html; charset=UTF-8

在上面的信息中我们可以从Set-Cookie头信息中看出已经成功开启HTTPOnly

Set-Cookie: PHPSESSID=36cb82e1d98853f8e250d89be857a0d3; path=/; HttpOnly

HttpOnly标记的效果如下,当攻击者挖掘到一个Xss漏洞之后,尝试着使用JavaScript脚本读取Cookies时,是不会被执行的。

从上图中我们可以看出,不能通过执行脚本来读取Cookies,即使存在Xss漏洞!

Secure标记

另一个Cookies属性就是“Secure”,我们经常能够见到一个网站同时存在着HTTP协议和HTTPS协议。当应用通过HTTP传送其Cookies的时候,由于使用的是明文传输方式,所以攻击者可以有多种方法劫持信息。“Secure”属性也是设置在Set-Cookie头中,它可以保证所有的Cookies信息只通过HTTPS协议进行传输。

如下示例代码片段中演示了在PHP应用中启用Secure标记的一种方法:

<?php
ini_set("session.cookie_secure", "True");
session_start();
session_regenerate_id();
if(!isset($_SESSION['admin_loggedin']))
{
    header('Location: index.php');
}
if(isset($_GET['search']))
{
    if(!empty($_GET['search']))
    {
        $text = $_GET['search'];
    }
    else
    {
        $text = "No text Entered";
    }
}
?>
<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title>Admin Home</title>
        <link rel="stylesheet" href="styles.css">
    </head>
    <body>
 
        <div id="home"><center>
        </br><legend><text id=text><text id="text2">Welcome to Dashboard...</text></br></br> You are logged in as: <?php echo $_SESSION['admin_loggedin']; ?> <a href="logout.php">[logout]</a></text></legend></br>
        <form action="" method="GET">
            <div id="search">
            <text id="text">Search Values</text><input type="text" name="search" id="textbox"></br></br>
 
            <input type="submit" value="Search" name="Search" id="but"/>
 
            <div id="error"><text id="text2">You Entered:</text><?php echo $text; ?></div>
 
            </div>
        </form></center>
    </div>
 
    </body>
</html>

从上面的代码片段中我们可以看出下面这一行代码是用来开启Secure的:

ini_set("session.cookie_secure", "True");

接下来我们就看看上面代码执行后获取到的HTTP Headers

HTTP/1.1 200 OK
Date: Sun, 12 Apr 2015 15:14:30 GMT
Server: Apache/2.2.29 (Unix) mod_fastcgi/2.4.6 mod_wsgi/3.4 Python/2.7.8 PHP/5.6.2 mod_ssl/2.2.29 OpenSSL/0.9.8y DAV/2 mod_perl/2.0.8 Perl/v5.20.0
X-Powered-By: PHP/5.6.2
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
Set-Cookie: PHPSESSID=f95afc96ecb7acc6c288d31f941e682f; path=/; secure
Content-Length: 820
Keep-Alive: timeout=5, max=100
Connection: Keep-Alive
Content-Type: text/html; charset=UTF-8

从上面的头信息中我们看到,Secure属性已经成功启用。我的本地主机没有开启HTTPS支持,当我刷新页面时,由于没有HTTPS协议支持Cookies没有通过Secure通道,且会话不会通过HTTP协议。这是由于会话没有发送到服务器,因为必须要HTTPS协议才可用。

关闭浏览器结束会话

关闭浏览器前没有单击注销按钮对于用户来说这十分常见。当我们在使用一个敏感的应用时,在关闭浏览器时强制注销Cookies很有必要。

下面两行代码可以在PHP中实现该过程

session_set_cookie_params(0);
session_start();

假设我们运行的页面集合了上面的属性。登录应用然后关闭浏览器,如果我们重新打开这个页面,会话不会活跃。

为了检测这个属性是否已经成功启用,我们可以在chrome浏览器中使用类似“EditThisCookie”的cookie编辑器。

登录页面并启用EditThisCookie扩展

如上图,将Session选项勾选上,这会保证我们的会话在关闭浏览器后不会继续活跃。

同样我们也可以在Chrome的开发者工具中设置

以下为Cookies的其他一些属性

Domain: 该属性控制着哪些Cookies能够访问域

Path: 指定Cookies能够访问域的路径

Expiration: 该属性指定Cookies过期后不再能使用

只需要3行代码即可将这三个属性加入到PHP应用中:

ini_set("session.cookie_secure", "True"); //secure
ini_set("session.cookie_httponly", "True"); //httponly
session_set_cookie_params(3, '/', '.localhost'); //This cookie is valid for 3 seconds (max age)
// “/” ensures that this cookie is valid on all //paths of this domain
// since the domain is prefixed with dot, this //cookie is accessible from all the subdomains.
 
session_start();

重新加载该页面,看看响应头

HTTP/1.1 200 OK
Date: Thu, 30 Apr 2015 03:04:11 GMT
Server: Apache/2.2.29 (Unix) mod_fastcgi/2.4.6 mod_wsgi/3.4 Python/2.7.8 PHP/5.6.2 mod_ssl/2.2.29 OpenSSL/0.9.8y DAV/2 mod_perl/2.0.8 Perl/v5.20.0
X-Powered-By: PHP/5.6.2
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
Set-Cookie: PHPSESSID=f4d99777d9810bfedb6869acd556bc66; expires=Thu, 30-Apr-2015 03:04:14 GMT; Max-Age=3; path=/; domain=.localhost; secure; HttpOnly
X-XSS-Protection: 1
Content-Security-Policy: script-src 'self'
Content-Length: 820
Keep-Alive: timeout=5, max=100
Connection: Keep-Alive
Content-Type: text/html; charset=UTF-8

在本文中,我们了解了如何使用HTTP头保卫我们的Cookies。虽说这些头可以帮助我们提高WEB应用的安全,但是我们不能完全依赖这些头来保护我们的WEB安全,我们应该考虑使用添加额外的安全层。

* 参考来源 infosec,译者/鸢尾 转载请注明来自FreeBuf黑客与极客(FreeBuf.COM)

相关 [http headers web] 推荐:

使用HTTP Headers防御WEB攻击(Part3)

- - FreeBuf.COM | 关注黑客与极客
在FreeBuf之前发布的《. 使用HTTP Headers防御WEB攻击(Part1) 》,《. 使用HTTP Headers防御WEB攻击(Part2) 》中讲述了如何使用HTTP Headers对WEB攻击进行防御,比如使用X-Frame-Options以及X-XSS-Protection.

HTTP Headers 入门

- johnny - Time Machine
非常感谢 @ytzong 同学在twitter上推荐这篇文章,原文在此. 本文系统的对HTTP Headers进行了简明易懂的阐述,我仅稍作笔记. 什么是HTTP Headers. HTTP是“Hypertext Transfer Protocol”的所写,整个万维网都在使用这种协议,几乎你在浏览器里看到的大部分内容都是通过http协议来传输的,比如这篇文章.

http协议:Web前端-HTTP Cache-control/浏览器缓存(转)

- - 互联网 - ITeye博客
HTTP协议分别在 1.0 / 1.1 两个时代推出了 Expires / Cache-control 两种cache策略,这里我们无需了解全部的细节,无需记住整个RFC内容,但是当我们需要使用HTTP cache策略时,我们需要注意以下细节:. Expires 是HTTP 1.0 那个时代的东西了,目前来看,可以不使用了,因为HTTP 1.0 的user agent占有率在 0.1% 以下(我们主要面向的web浏览器均默认使用HTTP 1.1),Cache-control 是 HTTP 1.1 的新特性,也是我们主要做文章使用cache策略的工具.

HTTP/2 与 WEB 性能优化(一)

- - JerryQu 的小站
2013 年 11 月份开始,我的博客开始支持了 SPDY 协议( 详见这里),也就是 HTTP/2 的前身. 今年二月份,Google 宣布将在 16 年初放弃对 SPDY 的支持,随后 Google 自家支持 SPDY 协议的服务都切到了 HTTP/2. 今年 5 月 14 日,HTTP/2 以 RFC 7540 正式发布.

HTTP/2 与 WEB 性能优化(二)

- - JerryQu 的小站
在「 HTTP/2 与 WEB 性能优化(一)」这篇博客中,我主要写了 HTTP/2 中的 Server Push 给 WEB 性能优化带来的便利,今天继续来聊一聊 HTTP/2 其他方面的改变. 我们知道,HTTP/2 并没有改动 HTTP/1 的语义部分,例如请求方法、响应状态码、URI 以及头部字段等核心概念依旧存在.

web基础-web工作原理,http协议,浏览器缓存

- - 浏览器 - 互联网 - ITeye博客
4,cookie和session. 平时用浏览器,输入网址后回车,页面响应我们想要浏览的内容,简单操作的背后蕴涵了什么原理. 当输入url回车后,客户端(浏览器)会去请求DNS服务器,通过DNS获取域名对应的IP地址,然后通过这个地址找到对应的服务器,要求建立TCP连接,建立连接,客户端发送httpRequest(请求包)后,服务器接收并开始处理请求,调用自身服务,返回httpResponse(响应包),客户端收到响应包后开始渲染body主体,等到全部接收,断开与该服务器端的TCP连接.

WEB已死? HTTP将死?还是Browser会死?—— 一篇迟来的脚注

- cgeek - It Talks--上海魏武挥的博客
网易科技《数字与人》专栏供稿,得到网易科技的许可,在此同步发出. 《连线》的这篇东西,不无商业目的. 文章很明显带有站在苹果(以及facebook)这一边向google叫板的味道,毕竟google是web的最大玩家(昨儿还传言说要推出google的平板电脑以及web应用商店). 巨头们的竞争,不是市场这个层面上的,更不是什么应用层面上的,而是标准、规则、接入方式等.

HTTP基础

- - ITeye博客
HTTP的结构主要包括下面几个要点:. HTTP的版本主要有1.0,1.1 和更高版本.    1.1 及以上版本允许在一个TCP连接上传送多个HTTP协议,1.0能 .    1.1 及以上版本多个请求和响应可以重叠,1.0不能.    1.1 增加了很多的请求头和响应头.     一个请求行,若干小心头,以及实体内容,其中的一些消息头和实体内容是可选的,消息头和实体内容需要空行隔开.

HTTP Header 详解

- - 博客园_Ruby's Louvre
HTTP(HyperTextTransferProtocol)即超文本传输协议,目前网页传输的的通用协议. HTTP协议采用了请求/响应模型,浏览器或其他客户端发出请求,服务器给与响应. 就整个网络资源传输而言,包括message-header和message-body两部分. 首先传递message- header,即 http header消息.

HTTP负载测试

- - 博客 - 伯乐在线
英文原文: ON HTTP LOAD TESTING 来源: oschina. 有很多人在谈论HTTP服务器软件的性能测试,也许是因为现在有太多的服务器选择. 这很好,但是我看到有人很多基本相同的问题,使得测试结果的推论值得怀疑. 在日常工作中花费了很多时间在高性能代理缓存和源站性能测试方面之后,这里有我认为比较重要的一些方面来分享.