天天看点

应用安全系列之二十九:密码管理

        一个系统的登录有多种方式,严格的有使用人的指纹、虹膜等生物特征作为登录凭据,在一些电影大片中,也经常看到一些牛逼的人如何盗取指纹来获取系统的登录。生活中,常见的指纹锁采用的是人的指纹作为登录凭证。不过,在Web应用系统,密码还是最常用也是最方便的登录方式,同时,它也是攻击者千方百计想要获得的信息。 本文就是讨论使用密码的过程中常遇到的一些问题,以及如何避免类似问题。

        网络上经常有一些常用的密码库,而且写密码库中的密码都是非常有规律的简单的密码,例如:12345678,qwertyuio等,而攻击者想要暴力破解密码,也会经常使用这些密码库中的密码,所以,使用这些简单容易记的密码,经常会导致用户密码的泄露。 在多年的渗透测试经验中,经常有一些网站的密码居然可以设置为111111这样的简单密码,对密码没有任何复杂度设置。其实这样的问题很容易解决,就是一个系统应该在设计之初设计一个合理的密码策略,让密码的复杂度能够得到保证,让暴力破解难易进行。例如:一个密码策略如下:

序号 策略描述 说明
1 密码的最小长度 一般建议大于等于8个字符,太短不安全
2 密码的最大长度 一般建议不要大于16个字符,太长很够容易忘记
3 密码的复杂度要求 一般都要求包含大小写字母、数字和特殊字符的组合
4 密码的最长使用时间 过期时间
5 不允许使用历史密码 一般都限制在最少不能使用过去曾经使用的3个密码,越多越好。
6 密码不能包含用户名
7 是否含有词典中的整个单词
8 单词不能使用相似的字符替代 例如:Pass->[email protected]    

使用这个密码策略定义的密码,很难构建一个常用的密码列表的库,就使得密码很难爆破。

        是不是有一个好的密码策略保证密码复杂度就可以保证密码的安全了呢?

        其实,非也。

        因为和密码相关的有很多方面,如果这些方面没有做好,其实,也会导致密码泄露的。

第一, 密码的存储方式

        当密码的存储方式不正确,其实,再安全的密码策略,也很危险。有的密码居然在数据库中明文保存;好一点的会使用加密算法保存,但是密钥如何处理又是一个头疼的问题;再好一点的是使用HASH存储,但是,相同的密码会保存相同的Hash;最好的是使用一个HASH(随机值+密码),在数据库中同时保存随机值和哈希之后的密码。

第二,认证与授权

        密码策略很安全,但是,如果授权没有控制好,让一个普通用户能够提升权限获得管理员的权限,是一件非常危险的事情。曾经渗透一个网站的时候,普通用户居然可以直接访问用户列表页面,更为致命的错误是,在编辑用户的页面,居然可以看到用户的明文密码?【通过修改input box的属性password为text】,截图如下:

应用安全系列之二十九:密码管理

 其实,也可以直接从相应消息中获取。这样一个普通的用户就可以获取系统内部所有用户的用户名和密码。

第三,忘记密码与重置密码

        所有的网站都会提供忘记密码和重置密码的功能,以防真用户忘记密码,重置密码时,一般都会发一个链接到用户的邮箱中,这个重置密码的链接如果没有处理好,导致URL中的信息可以篡改,就很容易导致攻击者通过获取重置密码的链接来重置其他用户的密码。因为,重置密码链接需要细心设计,保证这个连接只能重置收到这个链接邮件的账号的,不能做任何篡改。

第四,使用浏览器保存密码

        很多网站为了让用户容易使用,都会提供记住密码功能,浏览器也提供这一功能。如下图所示:

应用安全系列之二十九:密码管理

 这一功能确实使用户用起来跟简单,但是,也增加了风险,因为浏览器是保存的明文密码。下面以FireFox为例:

应用安全系列之二十九:密码管理

在【Setting】菜单里,选择【Privacy & Security】,点击【Saved logins...】

应用安全系列之二十九:密码管理

 所以,一旦一个用户不小心点击了保存密码,然后,这个机器又被其他人使用或者访问,就很容易获得访问的网站+用户名+密码。

无论如何,多一个地方明文保存密码,是一件非常危险的事情。

第五,防止注入绕过密码认证

        再安全的密码也难以应付注入带来的认证绕过问题,像SQL注入、LDAP注入、XPath注入等,都可以用来绕过认证。当系统里使用到数据库、LDAP和XPATH查询时,就需要做好预防措施,防止注入问题的发生。

第六、信息泄露

        经常有的系统,用户登录失败之后,会提示用户名无效,或者密码无效,如下图:

应用安全系列之二十九:密码管理

其实,在提示的信息中已经导致信息泄露了,例如:提示密码无效,可能意味着用户名是有效的,而用户名有效,就可以通过此信息发起用户枚举攻击,获得系统内部的有效的用户名,结合撞库攻击,也是一种很有效的破解用户密码的手段。

        因此,在提示错误时,不要提示任何信息有效或者无效的信息时,只提供模糊的信息:例如:用户名或者密码不正确。在重置密码时,也需要注意不要提示重置的用户名或者邮件是否有效,简单提示一下:邮件已发,请查阅邮件等模糊的信息即可。

第七、默认密码

        有些系统在初始化时或者创建新的用户时会设置默认的密码,而且默认的密码也都是很简单的密码。在做过的代码审计的系统中,就有使用“111111”作为初始化密码的。在用户被创建之后,用户自己重置密码之前,就有一个窗口期让攻击者有机可乘。所以,默认的密码尽量不要使用,即使要设置初始密码,也可以生成一个随机的密码发到用户的邮箱或者手机中,这样就可以避免默认密码的问题。

        Tomcat在设计的初期版本,将默认的用户名和密码写入配置文件,就导致很多系统被攻击者使用默认密码攻击系统,而且攻击成功的后果很严重,后来就把默认的用户名和密码从配置文件中删除,才避免类似的攻击。因此,只要有默认的密码,就难免有些用户因为没有安全意识而使用默认的密码,增加了系统的被攻击的风险。需要从源头上避免类似的设计。

第八、简单的验证码登录找回密码

        在设置找回密码功能时,有些渗透过的网站,曾使用短信验证码来重置密码,这么设计没有问题。但是,当验证码只有4位数字,而且有效时间达到5分钟时,就有问题了。其实,就等于将密码设置为四位数字。通过暴力破解工具,就可以很快尝试10000种可能,很快就可以破解。

第九、内部网站多个密码使用同一个密码

        很多网站都会有两个密码,登录网站一个密码,含有支付功能时,支付功能另外一个密码。由于支付密码很重要,关系到利益问题,所以,都会在设置支付密码时检查是否和登录密码一样,如果一样就强制用户更换一个不同的密码。但是,在设置登录密码时,却没有检查登录密码是否和支付密码是否一样,导致可以绕过密码的检查被绕过。

        虽然密码的安全依赖用户的安全意识,但是,如果能够使用一个密码很多用户为了偷懒也就不顾及安全了。但是系统依然要做好安全策略,保证用户可以以安全的方式使用系统。

第十、撞库攻击

        撞库攻击主要就是当攻击者拿到一个网站的用户名和密码时,再在其它的网站使用这个用户名和密码库去登录。因为很多用户在注册网站时,为了简单和容易记忆,就使用同样的用户名和密码。攻击者也正是抓住了很多用户的这个特征,发起撞库攻击,

        综上所述,可见关于密码的攻击方法有很多,任何一个环节有纰漏都会对网站造成威胁,所以,在系统内部需要做好以下几个方面,提前做好预防:

  • 制定一个复杂度符合需求的密码策略;
  • 在重置密码时需要做好保护,防止重置密码的链接篡改;
  • 不设置默认密码;
  • 密码的保存要使用HASH(随机值+密码),不能用明文或者对称加密保存;
  • 禁止一切的可能保存明文密码的可能,包括浏览器;
  • 防止注入漏洞;
  • 登录失败时或者重置密码时,不要提示任何信息有效或者信息无效;
  • 一个站点多个密码时,保证密码的不一样;
  • 登录时,需要做好暴力破解,例如:结合使用CAPTCHA或者短信验证码;
  • 借助防火墙或者其他安全检测工具,预防撞库攻击;
  • 使用多因子认证方式,即使密码泄露,也可以保证攻击者不能登录;
  • 再安全的系统,如果用户没有安全意识,还是很有可能导致密码泄露,例如:密码复杂度很复杂,也很长,那么,有的用户可能就会把密码写在某个地方,这样反而增加了风险。所以,加强用户的安全意识教育,或者在页面提醒用户安全注意事项,都可以增加用户的安全意识。

        密码是一个系统的认证的核心,也是一个系统的大门守护神,因此,在涉及密码的功能时,必须经过仔细的设计、安全的编码和充分的验证,才能保护好系统的大门的安全。

继续阅读