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. 【android自己定义控件】自己定义View属性

    1.自己定义View的属性 2.在View的构造方法中获得我们自己定义的属性 3.重写onMesure 4.重写onDraw 3这个步骤不是必须,当然了大部分情况下还是须要重写的. 1.自己定义Vie ...

  2. (Android+IOS)我们正在做一个新闻App,做几乎一样的,倾听您的建议 (画画)

    (Android+IOS)我们正在做一个新闻App,做几乎一样的,倾听您的建议! 新闻采访是做,前端展示APP界面感觉还不是非常好,还须要改进改进,希望公布(Android和IOS版本号)前听听大家的 ...

  3. Context Switch and System Call

    How many Context Switches is “normal”? This depends very much on the type of application you run. If ...

  4. Unity3D之挥动武器产生的剑痕特效

    网维教程网 观看很多其它教程 眼下已知3种方法能够做这样的剑痕特效 1.尾随特效 2.程序实现动态面来处理剑痕动画. 3.美术实现剑痕动画,直接坐在模型动画里面 (由于我不会美术所以这个忽略 嘿嘿) ...

  5. 微软 Build 2016

    微软 Build 2016年开发者大会发布多项功能升级 微软Build 2016开发者大会在美国旧金山的莫斯康展览中心开幕.本次大会对一些重点功能进行了完善.如手写笔支持技术Windows Ink.语 ...

  6. python学习笔记之11:图像用户界面

    这里会介绍如何创建python程序的图像用户界面(GUI),也就是那些带有按钮和文本框的窗口等.目前支持python的所谓“GUI工具包”的有很多,本文简要介绍最成熟的跨平台pythonGUI工具包- ...

  7. 大页(huge pages) 三大系列 ---计算大页配置参数

    使用以下shell 脚本来计算大页配置参数,确保使用脚本实例之前的数据已经开始, 如果数据库的版本号11g,确认是否使用自己主动的内存管理(AMM) +++++++++++++++++++++++++ ...

  8. 线程锁的概念函数EnterCriticalSection和LeaveCriticalSection的使用方法

    线程锁的概念函数EnterCriticalSection和LeaveCriticalSection的使用方法 注:使用结构CRITICAL_SECTION 需增加头文件#include “afxmt. ...

  9. 间隔DP基础 POJ2955——Brackets

    取血怒.first blood,第一区间DP,这样第一次没有以某种方式在不知不觉中下降~~~ 题目尽管是鸟语.但还是非常赤裸裸的告诉我们要求最大的括号匹配数.DP走起~ dp[i][j]表示区间[i, ...

  10. Unity3D之Vector3.Dot和Vector3.Cross采用

    在Unity3D中.Vector3.Dot表示求两个向量的点积;Vector3.Cross表示求两个向量的叉积.   点积计算的结果为数值,而叉积计算的结果为向量.两者要注意差别开来.   在几何数学 ...