多年后,我还是怀念当年在QQ空间上和河南网友王学翠互动的美好时光。那时候经常在“谁看过我”功能里面看到王学翠,然后我也经常去她空间给她浇花。在互联网络中,她给八个比特,我给她一个字节,时间长了,我们互相爱慕上了对方。直到有一天,我的QQ被中国西南某黑客团伙盗了,从此王学翠在我生命中消失

所以当我在用微博的时候,我就在想要不要给微博加个访客统计的功能。后来实现了,见下图

网友们叫好叫骂的都有。因为被新浪的一个员工转发叫好,很多人以为这是官方要推的功能,大骂我无耻。但在知道只是我自己给自己弄的后,很多骂这个功能的人又私信我表示可以花钱买

我在微博简单说过原理,但很多人还是在问,所以我今天再多说点实现思路。下文中提到的一些漏洞,微博早已修复

想要实现一个访客统计,最直接的就是找一个微博的存储xss。但这样的方案太重了,还可能要去兼容前端页面,加载js也容易暴露,可能随时就被干掉了。用存储xss实现,又浪费又累,而且现在个人主页的xss也不好找了。我不喜欢完全利用站方漏洞的方式,我一直想找个擦边球方面的实现

当我有一天细看了下面这种微博的时候,我觉得可能有戏了

你会发现视频的封面是一张图片,图片url类似这种的
http://225.img.pp.sohu.com.cn/p225/2015/12/25/0/15/6_152b124422bg104SysCutcloud_82567372_7_4.jpg
我大概有了思路…

就是说,微博的页面加载了一个站外的图片请求。这个图片如果可以被恶意攻击者自定义,可能会有产生一些安全问题,但跟今天主题无关,有兴趣的可以去搜我发在乌云知识库的《get来的漏洞》

现在我们要想办法控制这个图片url。在sohu视频上传一个视频,在修改封面那里,抓下请求,修改里面的封面url为我们自定义的url。但貌似修改不成功,应该是限制了只能发白名单域的url

但如果把url改成
http://223.img.pp.sohu.com.cn@127.0.0.1/vedio.php 这种形式,就绕过了。这也是url的一种合法格式,at符号前面的是username,后面的才是真实的host。而且发到微博后,微博也直接使用了这个图片url。这样,我们就能以当前用户的身份发出一条get请求了,而且referer还是weibo.com域

接下来我们要找的就是一个get请求,可以实现关注用户的功能。随便用头发想想,就能想到这样的接口应该会很多。虽然大多做了防护,但都是很弱的referer校验防护。这种敏感接口,只要你使用了get方式,就等着被人搞吧

我扶了扶镜框,找到了一个
http://book.weibo.com/newcms/i/weibo_relation.php?type=follow&userid=8888888888。虽然做了referer校验,但我们的请求已经是weibo.com域发出的了,可以无视它

所以,最后我们发出的视频封面url是
http://223.img.pp.sohu.com.cn@book.weibo.com/newcms/i/weibo_relation.php?type=follow&userid=88888888。用户看到了这个视频,就会关注id为8888888的微博用户。此处id为8888888的用户应该是一个我们自己的微博小号

这样只要我们的微博小号新增了一个粉丝,就代表这个粉丝浏览了我大号发的视频。但浏览了视频,不代表别人访问了你的个人页面,因为在timeline里也可以看到我们的视频。所以,我们要发一个视频微博,不会出现在timeline里,但却可以出现在个人页里。还好我们幸运的生在了中国

中国的微博出于政治或商业目的,有着强大的屏蔽机制。我们只要触犯这个屏蔽规则就可以了,就不会在别人的timeline上出现了。很简单,发视频的同时,再发个微信二维码,然后写上“欢迎大家关注我的微信”。然后去timeline一看,果然没有,完美

这样,只有访问了我们个人页的用户才会关注我的小号

剩下的就很简单了,用程序去轮询小号的粉丝列表,得到最新的粉丝,然后写入统计日志,同时给大号发个私信通知下“谁谁谁在几点访问了你的页面”。最后再移除这个粉丝,否则会引起别人的怀疑。这一系列操作,一秒内完成,用户基本察觉不到异常。由于微博api没有私信和移除粉丝接口,需要自己模拟web版的请求实现

这样“谁看过我”的功能就完成了,效果如下

Comments
Write a Comment