帐号登录页面的安全防范
1 问题引出
最近无聊之作,写一个穷举帐号密码登录的脚本工具,摸索过一些网站的登录机制,对于帐号登录的安全问题,一点心得。
如上图一个登录页面,分析下登录的交互数据,再通过跑脚本来做测试,不用几分钟把密码跑出来了,如下:
上图可以看出,其帐号密码为:admin/admin,该网站的管理账号密码就这样被枚举出来了。
2 脚本工具原理
这里先说说上面脚本原理,原理较为简单,根据登录请求数据的格式,配置的帐号和密码字典,构造一系列http/https 请求去登录,挨个尝试,得到登录的返回结果,分析是否为非失败(即是否为成功)。
该脚本通过配置,使得非常方便构造不同网站的登录请求,从而达到了较为通用的登录爆破工具。该脚本工程为使用python缩写,脚本工程目录结构:
tree
.
├── cache
├── cache_mgr.py
├── conf
│ ├── pwd_0.txt
│ ├── pwd_1.txt
│ ├── pwd_tiny.txt
│ ├── request.json
│ ├── user_0.txt
│ ├── user_1.txt
│ ├── user_2.txt
│ └── user_temp.txt
├── data
│ └── body.dat
├── loader.py
├── log
├── main.py
├── pair_loader.py
├── password_mixer.py
├── readme.txt
├── requester.py
└── response_checkor.py
3 如何设置一个较为安全的登录页面
回看1例子的那个登录页面,那个登录页面存在较为多的问题,这些问题,也是很多登录页面的通病。这里不讨论sql 注入之类的涉及后端的问题,只聊聊一些较为普遍的前端安全问题。
一个较为安全的登录页面,应该有下面几个功能(属性):
1)杜绝弱口令
上述例子中,帐号是admin,密码也为admin,这个密码也是较为普遍的弱口令密码了,之前文章《如何设置一个安全的密码》也可以看到,该密码2017年排名11,属于较为靠前的。对于密码的设置限制,应该强制要求设置复杂点。
2)密码传输做适当加密
上面例子,发送登录请求的那个数据为:
{“username”:”admin”,”password”:”admin”,”access_token”:”db0eedebe83356b628a51d0939ba48b8″},密码也是明文传输的,这是较为不安全的做法。在路由器或者交换机抓过包的朋友一定知道,这样的数据传输,等价于帐号密码双手送人了。一个登录请求的数据传输,数据经过了多少个路由器,这些路由器在那些人手里,谁知道?
这里说的加密,不一定是加密,也可是做离散。如把密码做MD5 或者SHA (加上某盐值)计算hash,之后再传输,当然更好是做多重hash,防止信息被截取后一样可以通过彩虹表来反查。也可非对称加密算法,通过自己的公钥进行加密。
3)验证码机制
如果觉得自己的帐号系统是有价值的,那么验证码机制是不可少的。增加验证码,可以抵挡很多的穷举工具了,毕竟大部分的枚举工具都是较为简单的。加上它可以抵挡“一大波”的机器人了。
4)登录失败次数限制
在增加验证码,可防治机器人做频繁的登录尝试。但是也有些牛一点的机器人,会加入验证码识别模块(毕竟现在OCR技术也较为成熟了),所以,登录失败次数限制,是必要的。
登录失败次数限制,可以分为IP次数限制和帐号次数限制。一般情况下,只要加上其中一种即可。但是如果帐号系统有海量用户的,那么,这两种失败的次数限制都加上较为好。因为如果只加上帐号失败次数限制,没有限制IP,那么攻击者可能会使用同一个(弱口令)密码去测试不同的各个帐号;如果只做IP失败次数限制,没有帐号失败次数限制,那么攻击者就可以通过挂代理,通过不同的代理去做登录请求了,一样可以达到穷举的目的。
如果加上了这个两,可以防止绝大部分的机器人了。
5)使用https + 证书认证
这个算是2) 的加强。这个如果加上,2)就不显得那么重要了。
大部分证书认证都是需要购买的,购买证书的花钱,所以这个需要一些金钱成本。但加入了https +证书认证,也可以防治中间人攻击了金钱和安全之间,做下权衡咯,呵呵。
4 总结
上面提到的几点,其中1“杜绝弱口令”是最最为重要的,帐号系统中,制定密码规则不应该接受弱口令密码,特别是自己的后台管理系统;验证码也是必要;如果做了https+证书,那么 2)就不显得重要了,但是做下也不为过;4)里面提到的两个,没有做这两个,至少应该做其中之一吧。
如果上面提到几点都加上,借用某些杀毒软件的口头禅——你登录页面安全性已经超过98%的网站了。
相关文章:《如何设置一个安全的密码》
(全文完)
(欢迎转载本站文章,但请注明作者和出处 云域 – Yuccn )