11.2 用户登录
用户登录是最常见的一个功能,登录就意味着权限授予,如果攻击者能任意登录管理员的账号,也就拥有了管理员的权限,更多的访问权限就能带来更多的安全问题,所以在登录的安全尤为重要。通常登录功能有以下几个需要关注的点。
11.2.1 撞库漏洞
撞库漏洞是指登录口没有做登录次数限制,导致可以使用不同的用户及密码进行不断的登录尝试,以遍历用户密码,也可以理解为登录爆破,如图11-8所示。
图 11-8
撞库漏洞有以下几种情况:
1)用户名和密码错误次数都无限制 。这种情况是早期比较常见的,可以载入用户名和密码字典对登录口不断进行请求尝试。
2)单时间段内用户的密码错误次数限制 。之前有个“锁QQ”的茬儿,说的是QQ登录密码连续错误次数30次,就会被锁定QQ,就有人利用这个问题不断地去锁定别人的QQ。这种方式是基于账号可信认证,密码错误次数存在限制,认证的是账号。所以这种情况也是可以撞库的,只要我们有一个用户名列表,爆破完一个密码还不能登录就换一个用户,或者干脆基于社工库的密码来撞。
3)单时间段内IP登录错误次数限制 。比较典型的是discuz,就是基于IP来限制登录,当一个IP登录5次后还没有成功登录,则会被禁止该IP登录,不过discuz获取的是Client-IP存在绕过的问题。这种防御撞库的手段存在一个误杀的问题,如果出口IP里面还有一个大内网,比如企业网、学校网,这时候就会误杀其他用户。
针对撞库漏洞比较好的解决方案是使用登录验证码和多因素认证,登录验证码有很多种,选择安全的验证方式也很关键,因为目前网络上还有专门提供人工打码的服务平台。
11.2.2 API登录
2014年淘宝被曝光一个影响非常大的逻辑登录漏洞,漏洞发现者在乌云报告该漏洞后获得阿里5万元现金的奖励,随后阿里宣布拿出500万人民币建立漏洞悬赏计划。这个漏洞跟很多客户端API登录的形式差不多,相信大家都有在QQ客户端点击邮箱或者QQ空间的图标就直接免登录进入的经历,其实在后端也有一个验证登录过程。来看看淘宝当时的漏洞URL:
https : //login.taobao.com/member/login_by_safe.htm ? sub=&guf=&c_is_scure=&from=tbTop&type=1&style=default&minipara=&css_style=&tpl_redirect_url=&popid=&callback=jsonp81&is_ignore=&trust_alipay=&full_redirect=&user_num_id=123456789&need_sign=&from_encoding=%810%851_duplite_str=&sign=&ll=&ei=QaIBU-XLLYze0wHy-YGoCw&usg=AFQjCNGXm310YgBJj5KDzLkZzaOAUl2UnQ&bvm=bv.61535280 , d.cWc&cad=rjt
已经验证登录成功后会跳转到这个链接,这个链接里面有一个user_num_iduser_num_id参数,代表当前登录的用户ID,请求这个链接后服务器端会返回这个用户登录成功后的Cookie信息,这里的问题就在于将用户ID交给这个程序逻辑的时候,并没有带上唯一的一个Token,这就导致只要修改user_num_iduser_num_id这个参数即可登录任意用户。同样,QQ客户端点击图标进入QQ空间的时候我们可以看到这样一个链接:
http : //ptlogin2.qq.com/igame ? clientuin=123456&clientkey=DC81BF8E5DC1DA7918DCA17A78FDF236DD6E41C09432B1DF5694F66B04C18DF54
其中clientuin参数为QQ号码,clientkey参数为当前用户登录的key,只要拿到这个clientkey则可以登录当前QQ号,对于这样的登录方式需要注意以下几个安全点:
1)登录密钥(clientkey)需要不可预测并且不固定,生成key的算法中加入随机字符。
2)API接口禁止搜索引擎收录。
3)登录密钥当次绑定当前主机,换机器不可用,防止QQ木马和嗅探key。