### 老问题导致的XSS漏洞
首先看一个XSS漏洞,这个点是老问题了, WooYun: 知乎 URL 跳转造成的 XSS
知乎按照洞主提供的方法进行修复了,但明显是不行的。我们看到 https://link.zhihu.com/?target=http://www.baidu.com 这个链接的源码:
![知乎某处XSS+刷粉超详细漏洞技术分析]()
将输入的信息传入URI参数,解码以后赋值与location.href。明显可以利用JavaScript:伪协议执行js代码。
如下: https://link.zhihu.com/?target=javascript:alert(1)
![知乎某处XSS+刷粉超详细漏洞技术分析]()
如何利用这个漏洞,有如下办法:
1. 获取用户Cookie
2. 刷粉、蠕虫等
但经过分析,这两种利用办法都无法直接达到。首先,因为知乎重要cookie加了httponly,所以打不到用户cookie;另外,因为知乎的主站是www.zhihu.com,而xss处于子域link.zhihu.com,并非同域,无法获取www域下的CSRF Token,也就无法提交任意表单。
那么,这个漏洞岂不是上不了主页了?
### 知乎的CSRF防御机制
去年7月份左右,我在TSRC的西安沙龙上对基于Token的CSRF原理与实例进行了一些讲解,但唯一一种情况没有提到:那就是同主域不同子域的情况下,怎么进行CSRF?
我先来说说知乎是如何检查CSRF漏洞的:
首先用户在访问知乎后,知乎会为用户设置一个随机Cookie,叫_xsrf。用户在填写表单的时候,表单里会自动插入一个隐藏的项目,也叫_xsrf。
用户提交表单的时候,后端会将表单里插入的_xsrf和cookie中所带的_xsrf进行比对。如果二者相同,则说明为合法的表单。
这种解决方法其实比较常见,因为在没有xss的情况下,黑客无法获取到cookie中的_xsrf,不在同一个域,也无法获取表单中的_xsrf。二者都无法获取到,所以保证了表单的安全。
那么,知乎这个xss,能不能获取到_xsrf呢?
我们看到www.zhihu.com的cookie:
![知乎某处XSS+刷粉超详细漏洞技术分析]()
Domain=www.zhihu.com,没得戏,在link.zhihu.com下获取不到www的cookie。
非同域这个条件,让工作很难正常进行。那么,怎么绕过呢?
既然我们无法获取cookie,我们自己设置一个值,不就可以了?!
这涉及到cookie的机制了。x.a.com域下,可以设置x.a.com的cookie,也可以设置.a.com的cookie。所以,我们在link.zhihu.com下利用XSS设置.zhihu.com的COOKIE。这样,在www.zhihu.com的数据包中,将会带着两个_xsrf,其中一个为已知的。
### 知乎/Tornado/Python对于同名cookie的处理
据以往对知乎的了解,知道知乎是基于Tornado开发的,这一点从『_xsrf』这个名字上也可看出。我们可以看看Tornado中是怎么处理Cookie的:
利用的是python自带的Cookie库,跟进一下Cookie.SimpleCookie类的load方法:
跟进一下__ParseString方法:
这个方法有个特点:解析了HEADER中的Cookie以后,一个个赋值在self中。如果存在同名Cookie的话,后者将覆盖前者。
这也是tornado的一个特性。对比起来,我们看到php是怎么处理同名cookie的:
![知乎某处XSS+刷粉超详细漏洞技术分析]()
获取的是前者。这也是php的一个特性,二者的区别,我不再从源码上分析了。
回到知乎的这个问题,因为知乎获取的_xsrf是后者。而恰好,我们利用XSS设置的cookie,将是所有cookie里最后一个。(当然,如果是php的话,我们也可以通过设置path,将cookie的优先级提到前面)
这样,后端在检查_xsrf的时候,会从cookie中获取我们设置的token,和表单中我们提交的token相比较。这二者,我们控制其相等即可。
### 覆盖_xsrf进行刷粉
理论讲完了,我来理一下思路:
1. 利用link.zhihu.com的xss,设置cookie: _xsrf=aaaaaa; domain=.zhihu.com
2. 设置表单中的_xsrf=aaaaaa;
3. POST数据包,关注目标用户
编写POC代码:
可见,我将_xsrf设置为wooyun123123,hash_id是被关注人的id,可以通过抓包获得。
用户访问 http://mhz.pw/game/zhihu/zhihu.html 即可关注我。通过抓包可以看见,我们伪造的_xsrf已经附在cookie最后面传给服务端了:
![知乎某处XSS+刷粉超详细漏洞技术分析]()
用户已成功关注:
![知乎某处XSS+刷粉超详细漏洞技术分析]()
评论