背景:最近,在对某产品进行安全测试时,发现了登录功能模块中验证码检测的一些安全缺陷。
详情:该产品的登录功能包括忘记密码和注册子功能,这两个子功能都使用了短信验证码、手机验证码和图像验证码。其中,图像验证码采用了SVG格式,需要将其转换为图像文件格式后才能进行识别。然而,由于SVG验证码项目的设计缺陷,使得它可以被工具百分百识别。具体的破解方法可以在该验证码项目的issus中找到。
根据上述验证码图片,可以简单描述该验证码的SVG文件由五个部分组成,其中四个部分是验证码字符,另一个是干扰线。不同字符在SVG中的长度也不同,因此可以通过计算每个部分的长度来确定字符是什么。然而,不同字体和其他配置的变化会导致长度的差异,因此在不同场景下需要针对性地计算每个字符对应的长度。
验证码破解:尽管默认字体的SVG文件可以完全重合,但在使用公开的Node.js破解代码时,可能会遇到无法百分百破解的情况。通过对比SVG文件,发现本次产品使用的是默认字体,但其他配置参数并非默认。通过反复比较和调整参数,可以获得与生成的验证码图片完全重合的结果。
找到的参数如下:(参数内容保持不变)
有了这些参数,我们可以根据配置生成验证码,并求出字符长度和字符的对应表。通过获取绘制过程中最小和最大的x轴和y轴坐标,可以进一步区分字符长度相同的情况。由于SVG验证码存在设计缺陷,我们可以使用计算好的对应表来破解该验证码。与使用打码平台相比,这种方法更快速、无需接入第三方,且在本地进行识别。
任意手机短信/邮箱邮件轰炸:由于我们测试的是登录模块的注册功能,很可能存在任意手机短信/邮箱邮件轰炸漏洞,只要绕过图像验证码即可。测试的逻辑过程如下:
1.发送一个刷新验证码的请求,从返回的包中获取验证码ID和验证码SVG文件。
2.使用公开的Node.js破解代码识别验证码,将其中的字符对应表替换为我们自己训练的表。
3.将解密后的验证码和验证码ID传递给发送邮件的请求包,发送请求。
经过测试,虽然会有提示请求被阻止,但仍然可以继续发送短信验证码。在几分钟内,成功发送了100条短信。对于邮箱验证码,设置了10分钟内同一邮箱账号只发送20次的限制,超过限制会有相应提示。
总结:本次测试主要是为了测试短信轰炸,并顺便发现了图像验证码和短信验证码的不安全问题。这两个问题都属于验证码的逻辑漏洞,一个是图像验证码设计的缺陷,另一个是短信验证码没有设置阈值和频率限制。