Publicsuffix介绍
首先我们了解下同域名Cookie共享。在php中,我们通过如下代码很方便的实现:
<?php
setcookie("user", "yumu", time()+3600,"/",'.域名.com');
或者在JS中:
document.cookie="user=yumu; domain=.域名.com;path=/"
当我们在 demo.域名.com
下放置执行上面的代码,在访问test.域名.com
也会包含有user:yumu
的Cookie。既然同一个域名下可以设置Cookie共享,但是GithubPages的域名(*.github.io)的Cookie为什么不能被共享呢? 答案如下:
If the user agent is configured to reject "public suffixes" and the domain-attribute is a public suffix: If the domain-attribute is identical to the canonicalized request-host: Let the domain-attribute be the empty string. Otherwise: Ignore the cookie entirely and abort these steps.
原来存在一个名为Publicsuffix:公共后缀
的组织,他们维护着一个列表 https://publicsuffix.org/list/public_suffix_list.dat 这里面的后缀都属于公共后缀,除了常见的域名后缀外,还有一些公共服务所提供的域名、二级国别。他们都不会能被设置当前域上的“Cookie共享”(例如github.io、cn.com 存在于列表中,所以在浏览器就不能设置.github.io、.cn.com的“Cookie共享”)
使用Publicsuffix机制来“攻击”小米
一些国别域名提供了二级域名,但是并没有提交该域名到 Publicsuffix
,所以我们可以设置“Cookie共享”以完成“攻击”。我们以“com.md”后缀为例。
首先将 yumu.com.md
hosts指向了我自己的服务器(家境贫寒,就不刻意注册了)。然后使用服务端下发cookie(JS也可以):
<?php
setcookie("user", "yumu", time()+3600,"/",'.com.md');
然后去互联网寻找受害者: [site:.com.md],然后发现了mi.com.md。嗯,访问的时候我们的Cookie已经被加入了头部。
不过能做的事也就仅限于此了。并不能做到偷取Cookie(除非受攻击站点主动将Cookie设置为.com.md域下共享)。本文中描述的“攻击”危害较小,固算不上真正的攻击。