web前端如果想实现cookie跨站点,跨浏览器,清除浏览器cookie该cookie也不会被删除这似乎有点难,下面的教程让你完全摆脱document.cookie

1、服务器端设置HSTS

如PHP:

<?php header("Strict-Transport-Security: max-age=31536000; includeSubDomains");?>

includeSubDomains必不可少,因为Super Cookie要用到很多子域名(Super Cookie必备条件,最好32个)。

demo用到的子域名:*-hsts-lab.radicalresearch.co.uk       如 1-hsts-lab.radicalresearch.co.uk,2-hsts-lab.radicalresearch.co.uk  等,demo用到32个子域名  到32-hsts-lab.radicalresearch.co.uk,为什么用到这么多子域名,下面会谈到。

<?php   //根据请求输出不同header   //header("Strict-Transport-Security: max-age=31536000; includeSubDomains")或者header("Strict-Transport-Security: max-age=0; includeSubDomains")
//下面这个1是必须输出的值,cb回调函数里会用到
echo 1;
?>

2、开启或关闭HSTS
子域名设置HSTS 状态头:

https://13-hsts-lab.radicalresearch.co.uk/hsts/set/1

在浏览器里打开上面URL,如下图:


     

上面会有个Strict-Transport-Security的头,max-age=31436000 注意此时max-age不为0,表示HSTS开启了

再打开https://13-hsts-lab.radicalresearch.co.uk/hsts/set/

    

     此时max-age=0,HSTS失效被关闭了


     
     这个
13-hsts-lab.radicalresearch.co.uk子域名服务器返回的不同HSTS开启状态是根据url中https://13-hsts-lab.radicalresearch.co.uk/hsts/set/标红的0/1进行输出不同的状态头的: 0关1开
 
     服务器根据url判断HSTS输出哪种Strict-Transport-Security头
     如HSTS开启:
<?php header("Strict-Transport-Security: max-age=31536000; includeSubDomains");?>
      HSTS关闭:<?php header("Strict-Transport-Security: max-age=0; includeSubDomains");?>

这里面还有个关键点是,开启和关闭HSTS必须要用https协议,即在浏览器里打开的时候https://13-hsts-lab.radicalresearch.co.uk/hsts/set/0,协议必须是https,这跟HSTS的特性有关。下面会有解释。

所有子域名(1-32)服务器端除了输出 headerStrict-Transport-Security是否开启外,还都输出1值

3、Super Cookie利用的关键点:
     如果我们事先设置了第13个子域名的HSTS的状态开启了,并且在当前浏览器访问过该子域名、或者脚本动态加载过,如浏览器访问过
    
      https://13-hsts-lab.radicalresearch.co.uk/hsts/set/1
      http://13-hsts-lab.radicalresearch.co.uk/hsts/get

         我们会发现http会自动被浏览器重定向到  https://13-hsts-lab.radicalresearch.co.uk/hsts/get 
         这里特别关键,如果这理解不了,那么HSTS Super Cookie 就无法理解了。

相反如果https://13-hsts-lab.radicalresearch.co.uk/hsts/set/0 你设置 HSTS关闭,你再通过http打开该子域名下的任何资源,是不会有任何https跳转的。

我们再来访问下http://beta.tfxiq.com/sc.html,打开控制台下的network,会发现很多跳转丢失:

         这里跳转丢失的原因是因为该子域名下HSTS服务器端开启了,因为你之前用https访问过该域名,并且开启了HSTS,那么后续的所有访问都会被强制跳转到https;

跳转丢失的response也是没有任何返回的,代码就利用到了这一点。

 
4、实现原理

http://beta.tfxiq.com/sc.html

为例,当前chrome客户端要保存一个71009647的 cookie值,  71009647的36进制为:169ze7(页面显示值),二进制00000100001110111000010101101111,前面4位黑的0是为了凑全32位。
保存cookie:
 
按照12进制值00000100001110111000010101101111从左到右的顺序,url最右边的/0或者/1按顺序对应12进制
步骤1: 在https://1-hsts-lab.radicalresearch.co.uk/hsts/set/关闭当前子域名HSTS
步骤2: 在https://2-hsts-lab.radicalresearch.co.uk/hsts/set/关闭当前子域名HSTS
步骤3: 在https://3-hsts-lab.radicalresearch.co.uk/hsts/set/关闭当前子域名HSTS
步骤4: 在https://4-hsts-lab.radicalresearch.co.uk/hsts/set/关闭当前子域名HSTS
步骤5: 在https://5-hsts-lab.radicalresearch.co.uk/hsts/set/关闭当前子域名HSTS
步骤6: 在https://6-hsts-lab.radicalresearch.co.uk/hsts/set/开启当前子域名HSTS
步骤7: 在https://7-hsts-lab.radicalresearch.co.uk/hsts/set/关闭当前子域名HSTS
步骤8: 在https://8-hsts-lab.radicalresearch.co.uk/hsts/set/关闭当前子域名HSTS
步骤9: 在https://9-hsts-lab.radicalresearch.co.uk/hsts/set/关闭当前子域名HSTS
步骤10: 在https://10-hsts-lab.radicalresearch.co.uk/hsts/set/关闭当前子域名HSTS
步骤11: 在https://11-hsts-lab.radicalresearch.co.uk/hsts/set/1  开启当前子域名HSTS
步骤12: 在https://12-hsts-lab.radicalresearch.co.uk/hsts/set/1  开启当前子域名HSTS
步骤13: 在https://13-hsts-lab.radicalresearch.co.uk/hsts/set/开启当前子域名HSTS
步骤14: 在https://14-hsts-lab.radicalresearch.co.uk/hsts/set/关闭当前子域名HSTS
步骤15: 在https://15-hsts-lab.radicalresearch.co.uk/hsts/set/1  开启当前子域名HSTS
步骤16: 在https://16-hsts-lab.radicalresearch.co.uk/hsts/set/1  开启当前子域名HSTS
步骤17: 在https://17-hsts-lab.radicalresearch.co.uk/hsts/set/关闭当前子域名HSTS
步骤18: 在https://18-hsts-lab.radicalresearch.co.uk/hsts/set/关闭当前子域名HSTS
步骤19: 在https://19-hsts-lab.radicalresearch.co.uk/hsts/set/关闭当前子域名HSTS
步骤20: 在https://20-hsts-lab.radicalresearch.co.uk/hsts/set/1  开启当前子域名HSTS
步骤21: 在https://21-hsts-lab.radicalresearch.co.uk/hsts/set/关闭当前子域名HSTS
步骤22: 在https://22-hsts-lab.radicalresearch.co.uk/hsts/set/1  开启当前子域名HSTS
步骤23: 在https://23-hsts-lab.radicalresearch.co.uk/hsts/set/关闭当前子域名HSTS
步骤24: 在https://24-hsts-lab.radicalresearch.co.uk/hsts/set/1  开启当前子域名HSTS
步骤25: 在https://25-hsts-lab.radicalresearch.co.uk/hsts/set/关闭当前子域名HSTS
步骤26: 在https://26-hsts-lab.radicalresearch.co.uk/hsts/set/1  开启当前子域名HSTS
步骤27: 在https://27-hsts-lab.radicalresearch.co.uk/hsts/set/1  开启当前子域名HSTS
步骤28: 在https://28-hsts-lab.radicalresearch.co.uk/hsts/set/关闭当前子域名HSTS
步骤29: 在https://29-hsts-lab.radicalresearch.co.uk/hsts/set/1  开启当前子域名HSTS
步骤30: 在https://30-hsts-lab.radicalresearch.co.uk/hsts/set/1  开启当前子域名HSTS
步骤31: 在https://31-hsts-lab.radicalresearch.co.uk/hsts/set/1  开启当前子域名HSTS
步骤32: 在https://32-hsts-lab.radicalresearch.co.uk/hsts/set/1  开启当前子域名HSTS

上面32个步骤,都是根据二进制00000100001110111000010101101111从左到右的顺序,设置了HSTS对应的开启状态,0:关,1:开

保存cookie的 url必须协议是https,原因上面提过,再提一遍,因为开启了HSTS协议,并且通过https加载过该子域名下的任何资源,当再通过http访问任何资源,会发生页面跳转,跳转到https安全协议对应的url.

当然代码在beta.tfxiq.com/superCookie.js中是通过循环动态在head中插入一个script 来模拟浏览器子域名开启和关闭HSTS的

 
 
 
 

读取cookie:

步骤1: 在http://1-hsts-lab.radicalresearch.co.uk/hsts/get?cb=window['hsts']._['1'](!1) 

    这个域名HSTS关闭,不跳转,response结果为上面php脚本输出的1,cb回调函数里的参数值取1的反值,相当于0,对应00000100001110111000010101101111的左边第一位0
步骤2: 在http://2-hsts-lab.radicalresearch.co.uk/hsts/get?cb=window['hsts']._['2'](!1)     上同 对应00000100001110111000010101101111的左边第二位0
步骤3: 在http://3-hsts-lab.radicalresearch.co.uk/hsts/get?cb=window['hsts']._['3'](!1)     上同 对应00000100001110111000010101101111的左边第三位0
步骤4: 在http://4-hsts-lab.radicalresearch.co.uk/hsts/get?cb=window['hsts']._['4'](!1)     上同 对应00000100001110111000010101101111的左边第四位0
步骤5: 在http://5-hsts-lab.radicalresearch.co.uk/hsts/get?cb=window['hsts']._['5'](!null)     上同 对应00000100001110111000010101101111的左边第五位0
步骤6: 在http://6-hsts-lab.radicalresearch.co.uk/hsts/get?cb=window['hsts']._['6'](!null)     这个域名HSTS开启,访问跳转到安全协议,response没有数据,cb回调函数里的参数的值为null ,js取反相当于1, 对应00000100001110111000010101101111的左边第六位1
步骤7: 在http://7-hsts-lab.radicalresearch.co.uk/hsts/get?cb=window['hsts']._['7'](!1)     这个域名HSTS关闭,不跳转,response结果为上面php脚本输出的1,cb回调函数里的参数值取1的反值,相当于0,对应00000100001110111000010101101111的左边第七位0
.
.
.
.
等等
.
.
.
步骤32: 在http://32-hsts-lab.radicalresearch.co.uk/hsts/get?cb=window['hsts']._['32'](!null)   这个域名HSTS开启,访问跳转,response没有数据,cb回调函数里的参数的值为null ,js取反相当于1, 对应00000100001110111000010101101111的右边第一位
所有response值都是取反的

最后  汇总response的 数据 等于二进制00000100001110111000010101101111

上面32个步骤在superCookie.js中也是通过循环在head中加载script,我们会发现设置Cookie和读取Cookie返回的二进制是一致的,都是00000100001110111000010101101111,00000100001110111000010101101111再转换成71009647,71009647再转换成页面显示的36进制:169ze7

使用32个站点的原因是相当于32位二进制,可以识别20亿个客户端。

缺点

1、每次读取cookie都需要访问32次子域名,

存取cookie的时候也要加载32次script,开销大、读取cookie速度慢

2、作为一个安全漏洞,以后各大浏览器厂商估计会修复这个bug

优点:

跨站点、浏览器关闭或者清除cookie也删除不了该 HSTS super cookie

 
上面的解释有点啰嗦,简洁的说是 利用HSTS的漏洞,32个子域名为数据库(

每个子域名代表1或者0,组合起来就是一个unique值),进行数据的存入和读出。
 
superCookie.js

 (function(n, t, i, r, u) {
n[i] = n[i] || new function() {
function y(n) {
var t = (e.index++).toString(36);
return e[t] = function() {
return delete e[t], n.apply(null, arguments);
}, "window['" + i + "']._['" + t + "']";
}
function p(t, i) {
var u, r;
if (n.push({
i:t,
b:i
}), n.length >= f) {
for (u = 0, r = 0; r < f; ++r) n[r].b && (u |= 1 << n[r].i);
return u & 2147483647;
}
return !1;
}
function h(n, t, i) {
var r = p(t, i);
r !== !1 && n(r);
}
function c(t) {
return n.push(!0) >= f ? (t(), !0) :!1;
}
function w(t) {
n = [];
for (var i = 0; i < f; i++) a(i, h.bind(this, t, i), h.bind(this, t, i, !1));
} function b(t, i) {
var u, r;
for (n = [], u = t | -2147483648, r = 0; r < f; r++) {
d(u >> r & 1, r, c.bind(this, i), c.bind(this, i));
}
}
function k(n) {
var t = f - 1;
a(t, l.bind(this, n, t), l.bind(this, n, t, !1));
}
function l(n, t, i) {
n(!!i);
} function a(n, t, i) {
var r = "http://" + n.toString(16) + o + s + "/hsts/get";
v(r, t, i);
}
function d(n, t, i, r) {
var u = "https://" + t.toString(16) + o + s + "/hsts/set/" + n;
v(u, i, r);
}
function v(n, i, f) {
i && (n += (n.indexOf("?") === -1 ? "?" :"&") + "cb=" + y(i));
var e = t.createElement(r), o = t.getElementsByTagName(r)[0], s = o.getAttribute(u);
e.setAttribute(u, s);
e.onerror = f;
e.async = 1;
e.src = n;
o.parentNode.insertBefore(e, o);
}
var o = "-hsts-lab.", s = "radicalresearch.co.uk", f = 32, n = [], e = {
index:0
};
return {
_:e,
test:k,
read:w,
write:b
};
}();
})(window, document, "hsts", "script", "nonce"),
function(n, t, i) {
function u(n) {
for (var i = t.getElementById("hstsValue"); i.firstChild; ) i.removeChild(i.firstChild);
i.appendChild(t.createTextNode(n));
}
function r(n) {
for (var i = t.getElementById("hstsState"); i.firstChild; ) i.removeChild(i.firstChild);
i.appendChild(t.createTextNode(n));
}
function f() {
r("reading...");
n[i].read(function(n) {
r("Your tracking id was read.");
u(n.toString(36));
});
}
function e() {
r("writing...");
//var t = Math.floor(Math.random() * 2147483647);
var t=71009647;
n[i].write(t, function() {
r("Your tracking id was set.");
u(t.toString(36));
});
}
n.location.protocol !== "http:" ? n.location.replace(n.location.href.replace(/^[^:]+:/, "http:")) :(r("checking..."),
n[i].test(function(n) {
n ? f() :e();
}));
}(window, document, "hsts");

demo页面 sc.html:

 <!DOCTYPE html>
<html>
<head lang="en">
<meta charset="UTF-8"> </head>
<body>
<p class="hstsDemo">
<span id="hstsState"></span>
<code id="hstsValue"></code>
</p>
</body>
<script type="text/javascript" src="superCookie.js"></script>
</html>

大家可以将代码拷贝下来运行下。

 
 
此为原创,如果想转载请注明出处
 

web前端利用HSTS(新的Web安全协议HTTP Strict Transport Security)漏洞的超级Cookie(HSTS Super Cookie)的更多相关文章

  1. 范仁义web前端介绍课程---2、web前端是干嘛的

    范仁义web前端介绍课程---2.web前端是干嘛的 一.总结 一句话总结: 前端开发是创建Web页面或app等前端界面呈现给用户的过程,通过HTML,CSS及JavaScript以及衍生出来的各种技 ...

  2. HTTP Strict Transport Security (HSTS) in ASP.NET Core

    本文是<9012年了,还不会Https>的后篇,本文着重聊一聊 HTTP Strict Transport Security协议的概念和应用. 启用HTTPS还不够安全 站点通过HTTPS ...

  3. HTTP Strict Transport Security (通常简称为HSTS)

    HTTP Strict Transport Security (通常简称为HSTS) 是一个安全功能,它告诉浏览器只能通过HTTPS访问当前资源, 禁止HTTP方式. Freebuf百科:什么是Str ...

  4. Nginx-HTTP Strict Transport Security(HSTS)

    HTTP Strict Transport Security(HSTS) HTTP Strict Transport Security(通常简称为HSTS)是一个安全功能,它告诉浏览器只能通过HTTP ...

  5. HTTP严格安全传输(HTTP Strict Transport Security, HSTS)chromuim实现源码分析(一)

    // HTTP strict transport security (HSTS) is defined in// http://tools.ietf.org/html/ietf-websec-stri ...

  6. HTTP严格安全传输(HTTP Strict Transport Security, HSTS)chromuim实现源码分析(二)

    HTTP严格安全传输(HTTP Strict Transport Security, HSTS)chromuim实现源码分析(一) 下面来查看其他对保存HSTS信息的enabled_sts_hosts ...

  7. web前端-《手机移动端WEB资源整合》——meta标签篇

    前端网页meta元素可提供有关页面的元信息(meta-information),比如针对搜索引擎和更新频度的描述和关键词.meta标签的作用有:搜索引擎优化(SEO),定义页面使用语言,自动刷新并指向 ...

  8. web前端利用turf.js生成等值线、等值面

    样例如下: <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> ...

  9. web前端利用leaflet生成粒子风场,类似windy

    wind.js如下: $(function() { var dixing = L.tileLayer.chinaProvider('Google.Satellite.Map', { maxZoom: ...

随机推荐

  1. Unreal Engine 4 RenderTarget制作Live Camera效果

    Unreal Engine 4 RenderTarget制作Live Camera效果 先上效果: Live Camera我不知道怎么翻译.反正意思就是将一个摄影机的Image渲染到一个2D平面上. ...

  2. 《javascript高级编程》读书笔记(三)变量、范围和内存的问题

     第四章:变量.范围和内存的问题 检測类型:typeof是确定一个变量是字符串.数值.布尔值,还是undefined的最佳工具.可是假设变量的值是一个对象或null,typeof仅仅会返回" ...

  3. java中线程机制

    java中线程机制,一开始我们都用的单线程.现在接触到多线程了. 多线性首先要解决的问题是:创建线程,怎么创建线程的问题: 1.线程的创建: 四种常用的实现方法 1.继承Thread. Thread是 ...

  4. crashRpt用法

    从官网上下载crashRpt的源代码,按说明编译出对应的lib和dll 1 在编译crashRpt的时候,在环境变量中设置  crashrptDir=D:\work\AIW\WebMicaps\Web ...

  5. HDU ACM 2586 How far away ?LCA-&gt;并查集+Tarjan(离线)算法

    题意:一个村子有n个房子,他们用n-1条路连接起来,每两个房子之间的距离为w.有m次询问,每次询问房子a,b之间的距离是多少. 分析:近期公共祖先问题,建一棵树,求出每一点i到树根的距离d[i],每次 ...

  6. cocos2d-x 3.1.1 学习笔记[2]Sprite 精灵

    Sprite应该是用到最多的一个类吧.无法想像一个游戏没有精灵将怎样进行愉快的玩耍. Sprite继承于Node 和 TextureProtocol. Sprite是一个2d的图像. Sprite能够 ...

  7. python学习笔记之八:迭代器和生成器

    一. 迭代器 在前面的笔记中,已经提到过迭代器(和可迭代),这里会对此进行深入讨论.只讨论一个特殊方法---__iter__,这个方法是迭代器规则的基础. 1.1 迭代器规则 迭代的意思是重复做一些事 ...

  8. 再见,CSDN

    这是第三次的博客, 首先是从百度改变自己 从他的变化二CSDN 看看多年的积累, 真的不想,但CSDN搜电缆和编辑(新MarkDown更烂)实在不敢恭维 再见CSDN, 新的博客 http://my. ...

  9. AndroidUI的组成部分GridView

    java 代码例如以下(简单的知识点我会以凝视的形式解说): package com.gc.gridviewdemo; /** * @author Android将军 */ /** * 知识点解说: ...

  10. iOSSingleton设计模式详细的说明教程

    iOS有很多的设计模式,当然,不管是什么语言有很多的设计模式.辛格尔顿是一种之一,辛格尔顿,它从字面上是一个单独的实例,首先,它是只有一个单一的,其次,它是一个实例.我们知道,在iOS用于开发Obje ...