Sniffly: 利用HSTS和CSP嗅探浏览器历史纪录

14489471134766

Sniffly是一种通过利用HSTS(HTTP Strict Transport Security)和内容安全策略(Content Security Policy)进行攻击的方式,它允许任意网站嗅探用户的浏览器历史。该技术被测试于 Firefox 和 Chrome 浏览器。

Demo

首先可以先参照DEMO的演示,通过使用Firefox/Chrome/Opera,但请先将HTTPS关闭。

演示地址: Sniffly(打开之前,请再确认是否使用Firefox/Chrome/Opera浏览器打开,否则可能引起其他浏览器的崩溃)

工作原理

首先推荐先读一读源文件中的src/index.js,可以先理解下Sniffly是如何工作的。

下面讲介绍其主要的工作原理:

1、首先,用户一开始会先访问嵌入Sniffly的网页;
2、接着,浏览器会先尝试通过http协议,转向使用HTTPS协议从服务器下载图像;
3、这个时候,Sniffly会通过设置 CSP(内容过滤策略)屏蔽图像下载,从而实现阻断从http重定向到https,这是很重要的一步。如果浏览器完成了对https网址的请求,那么随后将会直接接收hsts发过来的 pin码,而接下来的攻击将难以实现。
4、当图像被 CSP所中断,接下来将会调用onerror处理程序。在这种情况下,由onerror处理程序对图像从HTTP重定向到HTTPS的时间进行追踪计算。如果时间是在毫秒内,那么这意味着浏览器不需要发出网络请求,也就是用户以前访问过目标域名。如果时间是100毫秒左右,那么这意味着浏览器需要发出网络请求,也就是用户以前没有访问过目标域名。

寻找HSTS主机地址

加入网站列表,检测哪一台主机是发送 HSTS报文头部信息,

$ cd util
$ ./run.sh > results.log

其中初始配置有100个网址,根据实际的环境,也可以使用不同的网址列表替代进行检测,如全Alexa排名前100万。

通过最大时间跨度对结果进行处理和分类,先排除那些最大时间跨度少于1天以及预下载的。

$ cd util
$ ./process.py > processed.log

执行之后,你可以从process.log中将主机地址复制到src/index.js中。

运行

在Chrome浏览器中访问file:///path/to/sniffly/src/index.html。而在Firefox中,显然是不支持CSP 头部信息使用标签的,所以需要建立一个本地网络服务器,去为CSP HTTP响应头部信息做回应。我的Nginx服务器功能模块如下,

server {
listen 8081;
server_name localhost;
location / {
root /path/to/sniffly/src;
add_header Content-Security-Policy “img-src http:”;
index index.html;
}
}

或者通过分布式配置文件.htaccess

Header set Content-Security-Policy “img-src http:”

又或者通过php发送头部信息

将以下代码段粘贴在脚本的开头(请记得修改index.php名称)

<?php
    $csp_rules = "img-src http:";
    // Just to ensure maximum compatibility
    header(&#039;X-WebKit-CSP: &#039;.$csp_rules);
    header(&#039;X-Content-Security-Policy: &#039;.$csp_rules);
    header(&#039;Content-Security-Policy: &#039;.$csp_rules);
?>
温馨提示

1、目前尚不支持Safari, IE, o或者Chrome (iOS)
2、请将HTTPS功能关闭,浏览器的扩展功能如HTTPS会混淆结果;
3、请勿使用 Tor浏览器,因为时间统计会被四舍五入到接近100毫秒;
4、用户如果有不同的HSTS预置列表(因为有较低版本的浏览器),可能看不到准确结果。

Github地址:Github download

来自FreeBuf

原创文章转载请注明:转载自 七行者博客

本文固定链接: http://www.qxzxp.com/6396.html