文章目录

一、了解验证机制
- 确定应用程序使用的验证技术(如表单民、证书或多元机制)。
- 确定所有与验证有关的功能(如登录、注册、账户恢复等)。
- 如果应用程序并未采用自动自我注册机制,确定是否可以使用任何其他方法获得几个用户账户。
二、数据攻击
(一)、测试密码强度
- 在应用程序中查找有关用户密码最小强度规则的说明。
- 尝试使用所有自我注册或密码修改功能,设定各种脆弱密码,确定应用程序实际应用的密码强度规则。尝试使用短密码、仅包含字母字符的密码、全部小写字符的密码、单词密码以及将当前用户名作为密码。
- 测试不完整的证书确认。设定一个强大并且复杂的密码(例如,密码长度为12个字符,其中包含大小写字母、数字和印刷字符)。尝试用这个密码的各种变化形式登录,如删除最后一个字符,改变字符的大小写,或者删除任何特殊字符。如果其中一些尝试取得成功,继续系统性地尝试,了解完整的证书确认过程。
- 了解最小密码强度规则以及密码确认的程度后,再设法确定密码猜测攻击所需要使用的密码值范围,以提高攻击成功的可能性。尝试找出所有的内置账户,它们可能并不满足标准密码复杂度要求。
(二)、测试用户名枚举
- 确定各种验证功能通过在屏幕上显示的输入字段、隐藏表单字段或Cookie提交用户名的第一个位置。这些位置通常存在于登录、自我注册、密码修改、退出与账户恢复功能中。
- 向每个位置提交两个请求,其中分别包含一个有效和一个无效的用户名。分析服务器对第一个请求的响应的各方面细节,包括HTTP状态码、任何重定向、屏幕上显示的信息、任何隐藏在HTML页面源代码中的差异以及服务器做出响应的时间。请注意,其中一些差异可能极其细微(例如,看似相同的错误消息可能包含排版方面的细小差异)。可以使用拦截代理服务器的“历史记录”功能分析进出服务器的所有流量。Burp 的compare可对两个响应进行比较,以迅速确定它们之间的任何差异。
- 如果从提交有效和无效用户名返回的响应中发现任何差异,那么使用另外一组用户名重复进行测试,确定响应之间是否存在相同模式的差异,以此作为自动化用户名枚举的基础。
- 检查应用程序中任何其他可帮助获得一组有效用户名的信息泄露源,例如,日志功能、注册用户列表以及在源代码注释中直接提及姓名或电子邮件地址的情况。
- 定位任何接受用户名的附属验证机制,并确定是否可以将其用于用户名枚举。特别注意允许指定用户名的注册页面。
(三)、测试密码猜测的适应性
- 确定应用程序提交用户证书的第一个位置。通常,用户主要在主登录功能和密码修改功能中提交证书。如果用户可提交任意用户名,密码修改功能才会成为密码猜测攻击的有效目标。
- 在每一个位置,使用一个受控制的账户手动提出几个包含有效用户名但证书无效的请求。监控应用程序的响应,确定它们之间的所有差异。如果应用程序经过大约10次登录失败后还没有返回任何有关账户锁定的消息,再提交一个包含有效证书的请求。如果这个请求登录成功,应用程序可能并未采用任何账户锁定策略。
- 如果没有控制任何账户那么尝试枚举或猜测一个有效的用户名,并使用它提交几个无效的请求,监控任何有关账户锁定的错误消息。当然,应该意识到,这种测试可能会导致其他用户的账户被冻结或禁用。