暴力破解(Brute Force)

是指黑客利用密码字典,使用穷举法猜解出用户口令。

主要特征

连续性尝试 + 字典 + 自动化

高效的爆破字典

一个有效的字典,可以很大程度提高暴力破解的效率。

1.常用的账号密码(弱口令),比如常用用户名/密码 TOP 500等。
2.互联网上被脱裤的账号密码(社工库),比如当年CSDN泄漏的600万用户信息库。
3.使用指定的字符、使用工具按照指定的规则进行排列组合算法生成的密码。(社工方式之一,根据目标已知信息推测目标可能使用的密码组合。)

应对暴力破解的认证安全策略

一个web应用系统存在暴力破解漏洞,一般是指该web应用系统没有采用或者采用了比较弱的认证安全策略,导致其被暴力破解的“可能性”变的比较高。

这里的认证安全策略, 包括:

1.是否要求用户设置复杂的密码;
2.是否每次认证都使用安全的验证码或者手机OTP(One Time Password);
3.是否对尝试登录的行为进行判断和限制(如:连续5次错误登录,进行账号锁定或IP地址锁定等风控策略);
4.是否采用了双因素(或多因素)认证;
...等等。

所以在系统设计阶段,就要充分考虑业务安全问题,将这些防护措施加入到对应的认证场景中。绝不能抱侥幸心理。

暴力破解漏洞测试流程

1.确认登录接口的脆弱性

确认目标是否存在暴力破解漏洞。
比如:用BurpSuite抓包分析。

2.对字典进行优化

根据实际情况优化字典,提高爆破效率。自己平时也要注意整理收集字典。
  • 关于字典优化的技巧:

(1)根据注册信息进行优化(比如密码最小和最大长度,字母数字组合等)

(2)如果爆破的是管理后台,系统管理员一般是admin/administrator/root等的概率相对较高。可以尝试用这几个账号名+字典密码进行暴力破解。

(3)根据错误提示缩小爆破范围。

举例:
输入xxx/yyy   返回"用户名和密码错误"
输入admin/yyy 返回"密码错误",则可推测admin是有效的用户名,可针对admin用户只进行密码爆破,提高爆破效率。

业务安全提示:在登录界面的提示语要注意模糊提示,比如无论是用户名还是密码填写错误,一律返回"用户名或密码错误"。

3.工具自动化操作

配置自动化爆破工具或编写自动化爆破脚本(比如:线程,超时时间,重试次数、是否使用代理池等),高效进行自动化爆破操作。

暴力破解的绕过和防范

什么是验证码?

CAPTCHA,即是Completely Automated Public Turing Test to Tell Computers and Humans Apart (全自动区分计算机和人类的图灵测试)的简称,一般译作验证码。

一般用验证码做什么?

1.防止登录的暴力破解
2.防止机器恶意注册

理解验证码的认证流程

1.客户端request登录页面,后台生产验证码;
1)后台使用算法生成图片,并将图片reponse给客户端;
2)同时将算法生成的值全局赋值存到SESSION中;

2.校验验证码
1)客户端将认证信息和验证码一同提交;
2)后台对提交的验证码与SESSION里解析的验证码进行比较;

3.客户端重新刷新页面,再次生成新的验证码;
1)验证码算法中一般包含随机函数,所以每次刷新都会改变;

暴力破解不安全的验证码分析

  • -- on client常见问题:
1)使用前端js实验验证码(纸老虎,很容易被绕过);
2)将验证码在cookie中泄露,容易被获取;
3)将验证码在前端源代码中泄露,容易被获取;
4)验证码容易被识别(比如:4位数字母数字验证码);
  • -- on server常见问题:
1) 验证码在后台不过期或验证码过期时间过长,导致可以长期被使用;
2) 验证码校验不严格,逻辑出现问题(比如:使用验证码后没有重置关键验证数据);
3) 验证码设计得太过简单和有规律,容易被猜解;

鉴于目前简单的验证码已经有很成熟的识别技术,实际上基本等于形同虚设,所以除了设计安全的验证流程外,验证码是否够复杂且不影响用户体验在验证码设计中也很重要。(安全性和用户体验的平衡和取舍)

暴力破解常见的防范措施

1.设计安全的验证码(安全的流程+复杂且可用的图形)

2.对错误的提交进行计数并给出限制,比如:连续5次密码错误,锁定2小时,etc.

3.必要情况下,使用双/多因素认证(会影响到用户体验)

Token可以防止暴力破解吗?

不能。

普通token的用法:
一般toke以"type='hidden'"的形式输出在表单中;
在提交认证的时候一起提交,并在后台对其进行校验;

但由于token输出在了前端源码中,通过技术手段很容易被获取,因此也就失去了防止暴力破解的意义。
但token在防止CSRF上会有比较好的功效。(比如Django的csrf_token)