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域下共享)。本文中描述的“攻击”危害较小,固算不上真正的攻击。