验证码机制测试

1、验证码暴力破解测试

测试原理和方法

验证码机制主要被用于防止暴力破解、防止DDoS攻击、识别用户身份等,常见的验 证码主要有图片验证码、邮件验证码、短信验证码、滑动验证码和语音验证码。 以短信验证码为例。短信验证码大部分情况下是由4~6位数字组成,如果没有对验证 码的失效时间和尝试失败的次数做限制,攻击者就可以通过尝试这个区间内的所有数字来 进行暴力破解攻击。

测试过程

攻击者填写任意手机号码进行注册,服务器向攻击者填写的手机号码发送短信验证 码,攻击者设置验证码范围 000000~999999、00000~99999、0000~9999,对验证码进 行暴力破解,通过返回数据包判断是否破解成功,然后通过破解成功的验证码完成注册,如图所示。

image.png

以某会员网站任意手机号码注册为例。

步骤一:填写任意号码进行注册,本案例使用手机号码为16666666666,单击获取手 机动态码,会向手机发送一条验证码信息。
步骤二:快速登录,抓取数据包,对code参数进行暴力破解,

image.png

破解信息如下,如下图所示。

image.png

步骤三:通过返回值的长度可判断 46547 为正确的验证码,使用该验证码可成功登录 网站,获取个人信息,如下图所示。

image.png

修复建议

针对验证码的暴力测试,建议采取如下的加固方案:
(1)设置验证码的失效时间,建议为180秒;
(2)限制单位时间内验证码的失败尝试次数,如5分钟内连续失败5次即锁定该账号 15分钟。

2、验证码重复使用测试

测试原理和方法

在网站的登录或评论等页面,如果验证码认证成功后没有将session及时清空,将会导 致验证码首次认证成功之后可重复使用。测试时可以抓取携带验证码的数据包重复提交, 查看是否提交成功。

测试过程

攻击者填写投诉建议,输入页面验证码,抓取提交的数据包,使用发包工具对数据包 进行重复提交,然后查看投诉建议页面是否成功提交了多个投诉信息,如图所示。

image.png

以某App手机客户端应用程序为例。

步骤一:在客户投诉建议处,输入要投诉的内容,并输入验证码,如图所示。

步骤二:抓取数据包并修改投诉内容参数complaintsContent的值,如图所示。通过Burp Suite工具重复提交投诉信息,如图所示。

image.png

image.png

image.png

步骤三:经过暴力重复提交后,客户端显示提交成功,如图所示。

image.png

步骤四:返回页面查看历史投诉建议内容,可看到通过首次验证码认证,成功提交了 多次投诉。

修复建议

针对验证认证次数问题,建议验证码在一次认证成功后,服务端清空认证成功的 session,这样就可以有效防止验证码一次认证反复使用的问题。

3、验证码客户端回显测试

测试原理和方法

当验证码在客户端生成而非服务器端生成时,就会造成此类问题。当客户端需要和服 务器进行交互发送验证码时,可借助浏览器的工具查看客户端与服务器进行交互的详细信息。

测试过程

攻击者进入找回密码页面,输入手机号与证件号,获取验证码,服务器会向手机发送 验证码,通过浏览器工具查看返回包信息,如果返回包中包含验证码,证明存在此类问题,如图所示。

image.png

以某P2P金融平台为例。

步骤一:使用浏览器访问该网站,在找回密码页面中任意输入一个手机号码和开户证 件号,如图所示。

image.png

步骤二:单击“下一步”按钮,即可向该手机发送短信验证码。按 F12 键启用浏览器调 试工具可看到短信验证码在本地生成,如图所示。

image.png

步骤三:输入本地生成的验证码,如图所示。

image.png

进入重置密码页面,如图所示。

image.png

步骤四:重置密码成功,如图所示。

image.png

修复建议

针对验证码在客户端回显的情况,建议采取如下措施来预防此类问题:
(1)禁止验证码在本地客户端生成,应采用服务器端验证码生成机制;
(2)设置验证码的时效性,如180秒过期;
(3)验证码应随机生成,且使用一次即失效。

4、验证码绕过测试

测试原理和方法

在一些案例中,通过修改前端提交服务器返回的数据,可以实现绕过验证码,执行我 们的请求。

测试过程

攻击者进入注册账户页面,输入任意手机号码,获取验证码,在注册账户页面填写任 意验证码,提交请求并抓包,使用抓包工具查看并修改返回包信息,转发返回数据包,查看是否注册成功,如图所示。

image.png

以某P2P网站系统注册功能为例。

步骤一:首先输入任意手机号码和密码,我们此处以 18888888886 为例,单击“获取 手机验证码”,由于我们无法获取到18888888886这个手机的真实验证码,我们随意填写一 个验证码1234,如图所示。

image.png

步骤二:单击注册领红包并通过 burp 对数据包进行截获,右击选择 Do intercept- Response to this request,如图所示。

image.png

步骤三:然后单击 Forword 后,burp 工具里显示的就是网站返回的数据包。因为我 们填写的手机验证码1234肯定是错误的,而此时res_code的值为1,证明了当手机验证码 错误时res_code的值为1。我们将返回数据包中的res_code的值改为0,从而实现绕过验证 码,如图所示。

image.png

步骤四:继续单击Forword后,即可成功注册该手机号码18888888886的账号并登录跳 转到用户界面,如图所示

image.png

修复建议

针对此漏洞,建议在服务端增加验证码的认证机制,对客户端提交的验证码进行二次 校验。

验证码自动识别测试

测试原理和方法

前面几小节介绍的测试方法主要针对业务逻辑设计上存在缺陷的验证码机制,而事实 上还有很大一部分验证码机制在逻辑上并不存在问题,这就涉及与验证码机制本身的正面 对抗,也就是验证码识别技术。 网站登录页面所使用的图形验证码是出现最早也是使用最为广泛的验证码,我们就以图形验证码为例来讲解如何对其进行自动识别。 一般对于此类验证码的识别流程为:图像二值化处理→去干扰→字符分割→字符识 别。图像二值化就是将图像上像素点的灰度值设置为0或255,也就是将整个图像呈现出明 显的黑白效果。 为了防止验证码被自动识别,通常用加入一些点、线、色彩之类的方式进行图像干扰,所以为了达到良好的识别效果,需要对图像进行去干扰处理。 字符分割主要包括从验证码图像中分割出字符区域,以及把字符区域划分成单个字符。字符识别就是把处理后的图片还原回字符文本的过程。

测试过程

攻击者访问网站登录页面,通过刷新验证码页面查看验证码组成规律,进行图像二值 化、去干扰等处理,并进行人工比对,存储成功识别的验证码包,截入工具,利用工具对 登录页面进行暴力破解,根据返回包的大小和关键字判断是否破解成功,如图所示。 以某游戏站点为例。

image.png

步骤一:首先通过多次刷新验证码,发现验证码主要由数字或小写字母组成,于是通 过PKAV HTTP Fuzzer工具设定一个验证码包含的字符范围,如图所示。

image.png

步骤二:通过第三方识别工具可以自动对验证码图像进行二值化、去干扰等处理,然 后通过人工比对来完善识别的准确率,如图所示。

image.png

步骤三:当识别的准确率符合自己预期的效果后(比如达到90%以上),就可以对登 录页面进行抓包分析了,通过Burp Suite工具抓取登录的数据包,如图所示。

image.png

步骤四:将抓取到的请求数据包放至PKAV HTTP Fuzzer工具的请求包内,设置验证 码标志位,用户名和密码标志位,如图所示。

image.png

单击即可开始对账号密码进行暴力破解,验证码会自动载入,如图所示。

image.png

查看请求结果,可发现一个长度为611的返回包,用户名和密码为admin:admin,可 成功登录网站。

修复建议

针对验证码被自动识别的风险,建议通过以下几个方面来进行加固:
(1)增加背景元素的干扰,如背景色、背景字母等;
(2)字符的字体进行扭曲、粘连;
(3)使用公式、逻辑验证方法等作为验证码,如四则运算法、问答题等;
(4)图形验证码和使用者相关,比如选择联系人头像、选择购买过的物品等作为验 证码。