关于JSONP应用信息泄漏问题

前天给博客换了新皮,如果你留意到右上角的欢迎词,你可能会惊讶的发现上面写着你的QQ昵称,至少看过我新版博客的好友都是这样跟我说的。如果没有显示你的QQ昵称,那是因为你在访问我博客的时候已经注销或被注销了QQ的登录记录。好吧,为什么会知道你的QQ昵称?容我慢慢道来。【ps:腾讯已经和谐了一些接口,还有一些我就不放出来了,老是被人举报→_→】

JSONP即JSON with Padding。由于同源策略的限制,XmlHttpRequest只允许请求当前源(域名、协议、端口)的资源。如果要进行跨域请求,我们可以通过使用html的script标记来进行跨域请求,并在响应中返回要执行的script代码,其中可以直接使用JSON传递javascript对象。这种跨域的通讯方式称为JSONP。

上面是从网络上摘抄的一个解释,显然jsonp是一种脚本注入的行为,假设有A,B两个站点通过它进行通信,A对B开放了接口,如果A站点被非法入侵,B站点也会因此受到不同程度的影响,这个要看接口的用途与实现。本文要说的不是什么程序缺陷,也不会教你如何入侵一个站点,而是要简单的说明jsonp会被恶意利用从而导致用户利益受到损失。

正如上面对jsonp描述的那样,jsonp可以轻松的实现跨域通信,因此很多站点,特别是集群站点都喜欢通过它实现一些简易的信息同步,以腾讯QQ为例,QQ有很多的分站,这些分站都通过sso(Single sign-on,单点登录)实现一处登录到处共享用户信息,而这些站点只需通过同一接口获取用户信息,这样给开发人员和用户都带来极大的便利,但是其中也存在着一些安全隐患。恶意用户同样可以通过这些接口来获取受害者的信息,从而达到某些目的。我的博客右上角的欢迎信息足以证明这个想法的可行性,我无需窃取用户cookie,那对我来说难度较大。

当然,要利用此方法有一个必要前提就是,用户必须“授权”给web应用,否则无法获得信息,也就是用户必须登录QQ的相关站点并未注销登录。这点对我来说并不会太担心,因为QQ已经将用户抓住,用户随时可能在线,可能很大部分网民有一大半的时间都在QQ的相关站点登录过。

那么泄漏了这些信息可以做什么?你可能听过“网络钓鱼”,就是骗子制作一个假的官方的网站,以骗用户有抽奖活动等方式骗取用户的QQ帐号或直接骗钱,当然现在QQ的安全知识普及做得不错,可能很多用户很容易就能识别骗子网站。但是如果一个站点伪装成与腾讯合作举办活动,并且在你访问的时候,在你“还没登录”的时候,就能知道你的QQ号码,昵称,QQ商城的消费信息,住址,电话号码等信息,你很难不相信它,就像有人会相信算命先生,因为它已经“未卜先知”了。利用这点可以很大程度提高“钓鱼”的成功率。这只是一种常见的利用方式,还可以结合社会工程学得到你的各种信息,可能直接就能破解你的邮箱或者在其他各种站点的帐号密码信息,再进一步利用进行欺骗的话,危害巨大。一个你一访问就泄漏各种信息的站点,即使你知道是骗子网站,信息也已经泄漏了,想法邪恶的同学可能可以想到更多可怕的事情。

说了这些,你可能还是不相信,腾讯的应用真的会泄漏很多信息吗?出于安全考虑,我不打算直接给出这些接口的信息,但是有心的开发人员轻松的就能找到它们。希望不管是架构师朋友还是程序员或者是前端开发的伙伴,在做项目的时候不要只是为了方便而使用一项方便却不保险的技术,更不要把重要的信息交给这样的技术,我们做产品的核心是用户,保证用户的利益是前提。本文以腾讯QQ作为例子,但是我相信其他的门户网站都存在类似的问题,应该引起重视。最后感谢“Edie→明” 提供测试的参考数据。

2011-05-25凌晨,发现一个更为严重的接口,泄露的个人信息直接可能导致用户QQ被盗或其它财产损失。
qq jsonp 0day

2011-06-16下午,发现一个可以泄漏好友信息的接口。
json信息泄漏

如需转载,请注明出处:https://i.wanz.im/2011/02/06/jsonp_user_info_leak/

Comments

  1. By IceFire

    回复

  2. 回复

  3. By evil4

    回复

  4. By Neeke

    回复

    • By 丸子

      回复

  5. By hhehe

    回复

    • By 丸子

      回复

发表评论

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

Time limit is exhausted. Please reload CAPTCHA.

This site uses Akismet to reduce spam. Learn how your comment data is processed.