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

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

superCookie.js:
http://beta.tfxiq.com/superCookie.js

demo:

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

服务器端设置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,为什么用到这么多子域名,下面会谈到。

启或关闭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/0

    

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


     
     这个
13-hsts-lab.radicalresearch.co.uk子域名服务器返回的不同HSTS开启状态是根据url中https://13-hsts-lab.radicalresearch.co.uk/hsts/set/0标红的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的特性有关。下面会有解释。

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也是没有任何返回的,代码就利用到了这一点。

实现原理

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:
当用户用相同浏览器再次访问beta.tfxiq.com/sc.html的时候,必须用协议http(注意非常重要,因为要利用HSTS的跳转)去访问1-32的不同子域名,并且传递一个cb的回调函数

步骤1: 在http://1-hsts-lab.radicalresearch.co.uk/hsts/get?cb=window[‘hsts‘]._[‘1‘](0)     这个域名HSTS关闭,访问跳转,response没有任何结果,cb回调函数里的参数的值为0,浏览器network中你看到的是取非运算
步骤2: 在http://2-hsts-lab.radicalresearch.co.uk/hsts/get?cb=window[‘hsts‘]._[‘2‘](0)     上同
步骤3: 在http://3-hsts-lab.radicalresearch.co.uk/hsts/get?cb=window[‘hsts‘]._[‘3‘](0)     上同
步骤4: 在http://4-hsts-lab.radicalresearch.co.uk/hsts/get?cb=window[‘hsts‘]._[‘4‘](0)     上同
步骤5: 在http://5-hsts-lab.radicalresearch.co.uk/hsts/get?cb=window[‘hsts‘]._[‘5‘](0)     上同
步骤6: 在http://6-hsts-lab.radicalresearch.co.uk/hsts/get?cb=window[‘hsts‘]._[‘6‘](1)     这个域名HSTS开启,访问没有跳转,response有数据,cb回调函数里的参数的值为true
.
.

等等


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

这个域名HSTS开启,访问没有跳转,response有数据,cb回调函数里的参数的值为true

上面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值),进行数据的存入和读出。

此为原创,如果想转载请注明出处,thanks  @author 刘明海

时间: 2024-10-10 11:05:26

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

web前端利用vue.js实现品牌列表的添加,删除与筛选功能

实现效果图: 实现功能:web前端利用vue.js实现品牌列表的添加,删除与筛选功能 实现代码: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> &l

web前端之MVC的JavaScript Web富应用开发一:MVC和类

web前端之MVC的JavaScript Web富应用开发一:MVC和类 开篇: 本书以 assert() 和 assertEqual() 函数来展示变量的值或者函数调用的结果. assert() 是一种快捷表述方式, 用来表示一个特定的变量( revolves to true). 这在自动化测试中是一种非常常见的模式. assert() 可以接收两个参数 : 一个值和一个可选的消息. 如果运行结果不是真值, 这个函数将抛出一个异常 : var assert = function(value,

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

HTTP Strict Transport Security (通常简称为HSTS) 是一个安全功能,它告诉浏览器只能通过HTTPS访问当前资源, 禁止HTTP方式. Freebuf百科:什么是Strict-Transport-Security? 一个网站接受一个HTTP的请求,然后跳转到HTTPS,用户可能在开始跳转前,通过没有加密的方式和服务器对话,比如,用户输入http://foo.com或者直接foo.com.这样存在中间人攻击潜在威胁,跳转过程可能被恶意网站利用来直接接触用户信息,而不

Nginx-HTTP Strict Transport Security(HSTS)

HTTP Strict Transport Security(HSTS) HTTP Strict Transport Security(通常简称为HSTS)是一个安全功能,它告诉浏览器只能通过HTTPS访问当前资源,而不是HTTP. HSTS的作用是强制客户端(如浏览器)使用HTTPS与服务器创建连接.服务器开启HSTS的方法是,当客户端通过HTTPS发出请求时,在服务器返回的超文本传输协议响应头中包含Strict-Transport-Security字段.非加密传输时设置的HSTS字段无效.

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

wind.js如下: $(function() { var dixing = L.tileLayer.chinaProvider('Google.Satellite.Map', { maxZoom: 18, minZoom: 2 }); var map = L.map("map", { center: [33.5, 114.6], zoom: 10, maxZoom: 20, minZoom: 3, layers: dixing, zoomControl: false, attribu

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

样例如下: <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>等值线的生成</title> <link href="Scri

web前端利用jq实现折叠菜单

实现效果图:  功能:点击某一个一级菜单时,相应的二级菜单会下拉出现 实现代码: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title&

web前端黑客技术揭秘 9.Web蠕虫

9.1 Web蠕虫的类型 9.2 XSS蠕虫

web前端开发视频教程全集下载 WEB前端网页设计教程

轻松搞定网页设计(html.css.js),全集共54讲!免费分享!更多好资源,尽在齐学网!!!!!! 第0讲.开山篇第1讲.html介绍第2讲.html项目演示.运行原理.开发工具.html文件结构.标记和元素.属性.符号~第3讲.超链接href.图像image.表格table第4讲.html菜谱页面练习第5讲.html无序列表.有序列表.框架和综合练习第6讲.html表单form元素.各种input元素.常用元素综合案例第7讲.html加强(各种字体.Entities)第8讲.html加强(