弱口令定义
网站管理、运营人员由于安全意识不足,为了方便、避免忘记密码等,使用了非常容易记住的密码,或者是直接采用了系统的默认密码等。
攻击者利用此漏洞可直接进入应用系统或者管理系统,从而进行系统、网页、数据的篡改与删除,非法获取系统、用户的数据,甚至可能导致服务器沦陷。
弱口令(weak password) 没有严格和准确的定义,通常认为容易被别人(他们有可能对你很了解)猜测到或被破解工具破解的口令均为弱口令。弱口令指的是仅包含简单数字和字母的口令,例如“123456”、“abc”等,因为这样的口令很容易被别人破解,从而使用户的计算机面临风险,因此不推荐用户使用。
口令爆破
口令爆破其实就是攻击者对用户口令进行穷举尝试。在用户登录界面,攻击者通过遍历生成口令或者加载口令字典,进行多次登录尝试,直至把用户口令穷举出来,成功登录
因为一般能被成功猜测出的用户口令都是弱口令,所以口令爆破也称弱口令漏洞
口令破解的漏洞原理其实很简单,即网站未对用户登录认证的请求频率和次数进行限制,使得攻击者可以无数次地进行遍历口令登录。从理论上讲,只要加载的字典范围足够大,尝试的次数足够多,攻击者可以把任意用户的口令穷举出来
防护手段
防御口令爆破的方法很简单,我们对认证请求频率和失败次数进行限制,使攻击者不能无代价地进行口令尝试。如果攻击者进行口令爆破所需要付出的成本,高出其可接纳的范围,那么在一定程度上,我们达到了安全
同前面注册页面的用户枚举漏洞讨论的一般,我们可以通过增加验证码机制来辨别人和机器,从而限制自动化工具在认证请求处的使用,进而达到限制认证请求频率的效果
而对认证失败次数进行限制的方案又可分两种。一是把认证失败次数记录在数据库中和用户数据相关联的,这样可对单个用户的失败次数进行限制。当一个具体用户的口令错误次数达到某个值时,对其进行认证限制。如,在一段时间内不允许该用户再次进行登录尝试,或者直接永久冻结
另一种则是把认证失败的次数记录到 Session 中,如此可限制单个客户端上请求的认证失败的次数(基于 Cookie 判断)。当某个客户端上发起的认证请求(不管是不是同一个用户的登录尝试)失败次数到达某个值时(在一个 Session 有效期内),对该客户端上发起的认证请求进行限制
如下代码所示,
def login(request):
if request.session.get('is_login', None): # 检查是否已登录
return redirect('/index/')
if request.method == 'POST': # 如果有提交表单
if not request.session.get('fail_count', None):
request.session['fail_count'] = 0
if request.session['fail_count'] == 8:
return render(request, 'login.html', {'mess': '登录失败达8次,请30分钟后再尝试'})
username = request.POST.get('username', '').strip()
password = request.POST.get('password', '').strip()
try:
user = User.objects.get(username=username)
except User.DoesNotExist:
request.session['fail_count'] += 1 # 失败次数加一
return render(request, 'login.html', {'mess': '用户名或密码输入错误'})
else:
if check_password(password, user.password):
request.session['fail_count'] = 0 # 清零
request.session['is_login'] = 'T' # 标记已登录
request.session['user_id'] = user.id
request.session['username'] = username
return redirect('/index/')
else:
request.session['fail_count'] += 1 # 失败次数加一
return render(request, 'login.html', {'mess': '用户名或密码输入错误'})
return render(request, 'login.html')
方法讨论
上述两种防御方法各有其优劣,限制认证失败次数的方法显然是更为安全的,但给用户的体验感可能不如使用验证码限制登录请求频率的方法。比方说,某用户忘记了自己的口令,需要经过有限次的尝试来找回,该用户自然不希望在尝试口令时,其用户账号被冻结或者被限制登录
显然,这需要根据网站的服务性质和安全需求程度来选择防御口令爆破的方法
如果是类似理财和银行这种安全需求极高的网站,可以选择限制认证失败次数以及冻结账号的方法,宁可杀错,不可放过。如果网站更看重用户的体验感,追求的是方便快捷的服务性质,而相对于安全的需求没有那么高,那么可以使用验证码来限制自动化工具
一个比较常用,且可获得极佳用户体验感的方法是,记录登录失败的次数,当其达到某一个阈值时,增加验证码机制来限制自动化工具