我忽略跨子域的一个小问题

昨天sogl微博@了我一个问题:

#Web前端黑客#p342 子域无法通过单向设置document.domain跨到主域,书中写的新浪微博可以通过子业务跨到顶级域名下,事实上不可以。

大家可以看我放在GitHub上的demo:https://github.com/web2hack/proxy

1、设置hosts:
127.0.0.1 evil.com
127.0.0.1 a.evil.com
2、将proxy目录放到本地Web服务根目录下。
3. 访问http://a.evil.com/proxy/attack.htm

原理:
双方页面都设置:document.domain=’evil.com’;在浏览器下,可跨子域。

这样设置并测试后,会发现访问a.evil.com/proxy/attack.htm后,弹出了顶级域evil.com的proxy.htm内容(自己先测试,先理解),而如果把proxy.htm里下面这段代码注释掉的话:

document.domain=”evil.com”; // 这个很关键,可以注释掉看看

a.evil.com通过iframe加载evil.com的proxy.htm时就无法得到这个子页dom树,虽然看上去两边的document.domain都是evil.com(因为a.evil.com/proxy/attack.htm已经设置了document.domain=”evil.com”),但由于evil.com下的proxy.htm没主动设置document.domain=”evil.com”,也不行,chrome下会报下面这段错误:

Unsafe JavaScript attempt to access frame with URL http://evil.com/proxy/proxy.htm from frame with URL http://a.evil.com/proxy/attack.htm. The frame requesting access set ‘document.domain’ to ‘evil.com’, but the frame being accessed did not. Both must set ‘document.domain’ to the same value to allow access.

Firefox/IE报错内容差不多,都是权限不允许,这个就是我之前忽略的一个小问题。不过话说回来,可能我们书里p342页说的这句话在某些技巧下也并不会错:):

还有一种糟糕的子域设计是新浪微博,主内容都在顶级域下(weibo.com),大量的子域提供不同的业务,任何一个子域有XSS,都可以轻易跨到顶级域下。

更多的需要大家自己去实战了。如果发现书里有任何bugs请反馈给我,通过微博、这个博客、我的邮箱(evilcos@gmail.com)都可以。书的每次加印都会改掉这些bugs:)

顺便说下我们重新设计了web2hack.org的首页,停了blog/book栏目,尤其是blog,我想了一段时间,我发现这真不是一个聪明的方案,总有一天会继续荒废,想了想,还是就主要一个首页就行,并且我们计划持续地将《Web前端黑客技术揭秘》这本书里相关的源码开放到GitHub上:https://github.com/web2hack,方便大家调试与参考,请关注。

——————————–分割线——————————–

跨子域的问题很严重,我觉得腾讯、人人网等等的整个业务体系都很悲剧,下回准备单独说下微信的一个这方面问题。小心社交网络中的任何第三方,有心的黑客是可以搞下任何人的权限的。

4 comments

  1. 可以简单讲一下怎么设置host 127.0.0.1 evil.com 的方法吗 不白不会啊TT

    1. windows下修改c:windowssystem32driversetchosts
      添加一条
      127.0.0.1 evil.com

      linux下修改/etc/hosts
      同样加上这样一条

发表评论

电子邮件地址不会被公开。 必填项已用*标注