网络安全 频道

Ajax让Sohu邮箱成为垃圾邮件的帮凶

    可以看出,它访问了check.jsp页面验证用户名是否存在,把地址简化一下然后直接输入地址栏访问:

(图6)

    在必要的参数中,operator是用来判断调用不同验证方法的(该check页面提供了几种不同的验证,还有两次密码是否一致等等),userdomain是域名,sohu有几个不同域名的邮箱,username就是用户名了,而代码中的time应该是为了保证每次get提交的时候让浏览器不缓存而设的(没有细看,不重要)。所以,三个参数中主要是username发生变化,而服务器仅仅返回两种不同的结果。

    这样就很利于我们爆破用户名了,还记得我们怎么暴力破解邮箱密码么?挂字典,然后不断提交,判断服务器返回字符中有没有特定的字符,破解的速度取决于网速和返回字符的多少。正常的访问是返回一个页面,这样就有一堆垃圾数据。然而Ajax告诉我们,只要从服务器返回“0”和“1”就可以作出判断,所以这里返回的更少了,仅仅是:

(图7)

    为此,我们完全可以可以尝试使用其他更方便的语言写出工具,用于搜集有效邮件地址,速度一定很快。很多大网站都使用了这样的验证方法,就不一一例举了。我已经仿照Ajax使用JAVASCRIPT写个爆sohu用户名测试程序,相关代码在这里不在本文列出来了。有兴趣的朋友可以去论坛(http://www.ixpub.net/thread-654600-1-1.html)查看。

    我列举了大家可能经常想到的一些解决方案:
    1、判断request的来源地址。这样的方式不推荐,因为黑客可以更改http包头,从而绕过检测。
    2、采用验证码。也不推荐,请各位大大想一下用户的感受,刚输入用户名就让我输入注册码?这样Ajax意义何在?
    3、给一个IP在一个小时内,分配一些份额,比如500个(考虑到网吧等等多台机器一个IP,使用NAT的地方)。
    4、返回随机图片。这是我自己设想了一种解决方案,没有经过测试,下面详细说明。

    从给出的前三个方案看,都存在一个误区,认为Ajax应该获得服务器返回的两个有特殊意义的值(用户名可用或不可用),然后再判断,分两种情况在页面显示出来不同的信息,或者把两个不同的返回结果直接给用户,这样两种经典的处理模式,问题就集中在“两个不同结果的值”这里。现在我们从需求出发,分析用户希望看到的结果,无非就是想知道用户名是否可用,也就是说最终的结果显示在用户容易看到的地方,而且用户可以“看懂”信息,并可以加以区别(知道能不能使用这个用户名注册)。而黑客(或垃圾邮件搜集者)认为,只要用户能看懂,程序也应该可以看懂并预测出两种结果,所以就有了这种暴力获取邮箱名称的攻击。如果“人”能看懂而程序不能看懂呢?举个典型的例子,大家还记得QQ网站的那个令人讨厌的中文验证码吧?那个东西就是随机的,程序不能预测并且用户可以看懂。在这里也可以使用这项技术。直接在服务器随机把“可以注册”和“不能注册”四个字,做成随机图片,文字以随机的字体和随机的颜色出现在图片中随机的位置,然后返回给javascript,再由javascript把图片放到网页中,用户看到的是返回的是随机大小的图片,暴力获取邮箱名的攻击就立刻失去了效果。
 

(图8)

    是否该在这里也使用Ajax技术,无所谓对错,只要大网站一带头,这样做的就会大有人在,只是我们在模仿的时候也要仔细考虑。毕竟Ajax的实质其实是在用户“感觉不出来”的情况下访问了web应用程序,再把返回的结果交给用户,同时用户可以去做其他的事情,不用等待结果。既然Ajax可以访问,恶意用户当然也可以自己去访问,所以我们应该把处理Ajax请求的web应用程序像其他页面一样做好相应的防范措施,就可以有效的避免安全问题。

0
相关文章