原文:
http://www.kamilonurozkaleli.com/posts/starbucks-singapore-account-takeover/
有删减
信息收集:
当我浏览新加坡星巴克时,我注意到有部分网页的内容是来自一个第三方网站的。我们姑且称之为example.com。我仔细的分析了一下这个网站,我发现example.com/starbucks和card.starbucks.com.sg是相同的登陆页面。我想到了两种可能性:
1. example.com/starbucks可能是card.starbucks.com.sg正在开发版本的测试网址。
2. example.com/starbucks可能是card.starbucks.com.sg的老版本测试站,现在处于闲置状态。
无论那种情况,这个网站都很可能存在漏洞。但主要问题是,我不知道这个漏洞会不会影响生产环境。为了搞清楚,我在card.starbucks.com.sg上创建了一个账号,然后尝试登到example.com/starbucks里。我成功的登陆进来了,这说明这俩个网站使用的相同的认证机制。

利用
我仔细看了example.com/starbucks然后发现一个生产环境没有的接口。这个接口接收一下数据。
email=victim@victim.com
当我输入受害者的邮箱,然后发送请求。我可以在我的个人资料中心看到部分被害者的信息。但是由于CSRF无效,我还是不能更改受害者账户密码。
为了解决这个问题,我将PHPSESSID值从example.com/starbucks复制到card.starbucks.com.sg!我能够看到生产环境中所有属于受害者的信息,这里生成的有效CSRF令牌使我能够更改密码,并且能够完全接管一个我知道其电子邮件地址的帐户。
再深挖一点
通过仔细检查example.com。我又发现了两个测试环境example.com/starbucks2和example.com/starbucks3。但是我在card.starbucks.com.sg上账号,登不进example.com/starbucks2和example.com/starbucks3。example.com/starbucks2不允许我注册账号,example.com/starbucks3允许我注册账号。
我认为example.com/starbucks2和example.com/starbucks3使用测试的数据表,因此生产环境的用户登不进去。
我可以用example.com/starbucks3注册的用户登陆example.com/starbucks2,当时无法登陆开发环境。但是我从example.com/starbucks2拷贝PHPSESSID粘贴到card.starbucks.com.sg却是有效的而且我可以使用这个账号。
我想到了一个利用链:
1. 在example.com/starbucks3上使用受害者账号的邮箱创建一个账号。
2. 在example.com/starbucks2上,通过同一接口将该电子邮件帐户与您自己的帐户关联。 (将PHPSESSID与testusers表中的电子邮件相关联。)
3. 拷贝PHPSESSID到card.starbucks.com.sg然后控制该账号。(通过相同的邮件地址,控制真实的账号)

译者按:
这个网站设计的也精妙了,像CTF一样。作者分别利用了2种方式,实现了任意账户登陆。
第一种利用复用PHPSESSID,作者意识到PHPSESSID这个库可能是通用的。在第二种利用方式里,作者通过测试2个测试环境,发现测试环境用户表是独立的。但是session这个由第一种方式想到,可能是关联的。进而利用,实现任意账户登陆。这个漏洞,作者找到了2种利用方式,如果是你,你能找到几种利用方式呢?
本文迁移自知识星球“火线Zone”