小议验证码的安全性及如何绕过

标签: 数据安全 | 发表时间:2017-05-15 15:30 | 作者:secist
出处:http://www.freebuf.com

什么是验证码?

CAPTCHA是(全自动区分计算机和人类的图灵测试)的简称,是用于区分计算机和人类的一种程序算法,这种程序必须能生成并评价人类能很容易通过但计算机却通不过的测试。

像我们平时最常遇到的,就是基于图片的验证码。这类图片验证码通常包含的,都是些易于用户识别简单的验证信息。如下图所示。用户必须准确的识别图像内的字符,并以此作为人机验证的答案,方可通过验证码的人机测试。相反如果验证码填写错误,那么验证码字符将会自动刷新并更换一组新的验证字符,直到用户能够填写正确的验证字符为止。

basic-captcha.png

验证码的重要性:

防止与认证相关的攻击行为:

以下列举的是一些较易受到暴力攻击的点。例如:

  • 登录:一旦缺少验证码的保护,攻击者则很可能通过暴力破解的方式非法接管用户账户。
  • 忘记密码:如果网络应用程序使用详细消息响应帐户存在或不存在,那么攻击者则可以进行用户名的枚举。
  • 注册:程序批量创建垃圾账户。此外还可以进行用户名的枚举。(正常情况下没有应用程序会允许用户,同时注册两个相同用户名的账号)

避免垃圾邮件和DOS:

我们知道很多网站都有提交表单的功能,并需要由站点管理员审核通过。例如:会员申请,联系我们,反馈表,调查表等。这些功能都需要验证码的保护,如果不加以防护那么将会导致以下情况的出现:

  • 大量的垃圾表单可能产生,不仅会影响网站的访问速度,还会加大站点管理员的工作量,而且一些合法用户的请求,也可能会因此被拒绝。
  • 电子邮件轰炸:一些功能可以发送电子邮件到一个任意的邮件地址。如果没有得到有效的验证保护,那么恶意攻击者则可以利用程序,向特定的目标发送大量的垃圾邮件。

保护数据挖掘机器人:

某些包含大量数据的站点极易遭受数据挖掘攻击,因此它们也需要验证码的保护。例如:社交网络和搜索引擎。

验证码为什么能被绕过?

验证码被绕过,有以下两个原因:

  • 设计问题
  • 执行问题

在以下的内容,我将会带大家认识到这两个问题所在。以及如何解决这些问题,建立更为安全的人机验证。

设计问题

设计问题则意味着验证码本质上的脆弱性,但执行却不存在问题。以下演示将有助于我们了解设计问题的真正原因,以及如何破解它:

设计问题#1:

以下的示例中我们可以看到,这里的验证码就是一道数学运题。而这里的问题就出在页面的HTML源码上。

captcha-arith.png

你可以在Github上下载到该验证码的源码: https://github.com/securelayer7/Captch-Bypass-Vulnerable-Script/tree/master/ArithmeticCAPTCHA

如何破解?

在这种情况下攻击者往往都会通过获取该页面的HTML源码,计算答案并提交HTTP响应来破解验证码。

captha-arith-crack.png

你可以在Github上下载到该利用代码: https://github.com/securelayer7/Captch-Bypass-Vulnerable-Script/tree/master/CaptchaExploits

设计问题#2:

某些验证码可能会采用相对有限的问题数据库。例如以下是一个基于图片的验证码,很显然这里不能再利用上面提到的破解方案来破解。但这里的问题出在,这里的图片验证码字符是固定并且有限的,在本例中该验证码只会在来回10个固定字符组合中更换。因此一旦掌握了它的问题数据库,那么破解也自然就不成问题了。

captcha-ten.png

你可以在Github上下载到该验证码的源码: https://github.com/securelayer7/Captch-Bypass-Vulnerable-Script/tree/master/TenRepeatedCAPTCHA

如何破解?

攻击者首先必须手动解决这10个验证码问题,并同时记录下这些问题的答案。然后通过工具将这些问题的答案存放在自己的数据库中,进行不断的暴力攻击尝试即可。

captcha-tenrepeated-crack.png

你可以在Github上下载到该利用代码: https://github.com/securelayer7/Captch-Bypass-Vulnerable-Script/tree/master/CaptchaExploits

执行问题:

执行问题则意味着验证码由于执行不力而可被破解,但从设计的角度来看是完美的。

以下示范将有助于我们了解,执行问题的真正含义以及如何破解它:

执行问题#1:

在演示中,我们正在使用Google reCAPTCHA人机验证。我们使用API将用户解决的CAPTCHA响应发送给Google的端点。更多请点击: https://www.google.com/recaptcha/intro/index.html 。API以JSON的输出形式回复请求,以及HTTP状态码。到现在为止,还没发现什么问题 !!

但是执行问题也就出在这里。开发人员无法检查JSON响应,而以检查发送的HTTP状态码是否为200 OK,作为验证码正确与否的判断依据。

weak-captcha-1.png

你可以在Github上下载到该验证码的源码: https://github.com/securelayer7/Captch-Bypass-Vulnerable-Script/blob/master/GooglereCAPTCHA/weakcaptcha1.php

weak-captcha-1-code.png

如何破解?

攻击者只需要制作一个脚本即可将任何值发送给人机验证码,并且都将会被服务器所接收,因为无论你发送什么答案,服务器都只会通过检查Google API发送的状态码是否为200 OK来作为判断依据。下图中,我们作为答案发送的值是“InvalidAnswerOfCAPTCHA”

weak-captcha-1-crack.png

你可以在Github上下载到该利用代码: https://github.com/securelayer7/Captch-Bypass-Vulnerable-Script/tree/master/CaptchaExploits

执行问题#2:

验证码存在于web页面,在用户提交后将被验证,但问题却出在了if和else一个简单的子句中。这个错误是由于开发人员将响应码写在了其它部分形成的。所以这里即使验证码答案是错误的,应用程序仍将给予用户积极的响应。

weak-captcha-2.png weak-captcha-2-code.png

你可以在Github上下载到该验证码的源码: https://github.com/securelayer7/Captch-Bypass-Vulnerable-Script/blob/master/GooglereCAPTCHA/weakcaptcha2.php

如何破解?

攻击者只需要制作一个脚本,即可向验证码发送任意值。在下图中,我们作为答案发送的值是“InvalidAnswerOfCAPTCHA”

weak-captcha-2-crack.png

你可以在Github上下载到该利用代码: https://github.com/securelayer7/Captch-Bypass-Vulnerable-Script/tree/master/CaptchaExploits

执行问题#3:

验证码存在于web页面,但在提交后未在服务器端进行验证。

weak-captcha-3.png weak-captcha-3-code.png

你可以在Github上下载到该验证码的源码: https://github.com/securelayer7/Captch-Bypass-Vulnerable-Script/blob/master/GooglereCAPTCHA/weakcaptcha3.php

https://github.com/securelayer7/Captch-Bypass-Vulnerable-Script/blob/master/GooglereCAPTCHA/weakcaptcha4.php

如何破解?

攻击者只需通过输入错误的验证码和任意电子邮件,就可以轻松地绕过它。

weak-captcha-3-crack.png

你可以在Github上下载到该利用代码: https://github.com/securelayer7/Captch-Bypass-Vulnerable-Script/tree/master/CaptchaExploits

如何保护自己免受CAPTCHA攻击?

其实这个问题也很简单,大家可以按照以下步骤,来制作一个强大的CAPTHCA功能:

设计:实施设计良好的CAPTCHA方案。从以上示例中我们可以看到,大多数我们自己设计的验证码都或多或少的存在一些问题。因此,我建议大家尽可能的使用像Google这样的第三方CAPTCHA。

执行:在你选择了具有良好设计的人机识别系统后,下一步是正确的执行。我们已经看到,尽管有一个设计良好的CAPTCHA,但是如果不能正确执行,仍然可以被破解。如果你使用的是Google reCAPTCHA,请参照以下操作步骤:

  • 以检查Google发送的JSON响应取代HTTP状态码检查。
  • 在if和else子句中实现正确的逻辑,区分有效和无效的答案。
  • 不要透露你的私人CAPTCHA密钥。

final-captcha.png

你可以从这里下载安全的CAPTCHA代码: https://github.com/securelayer7/Captch-Bypass-Vulnerable-Script/blob/master/GooglereCAPTCHA/goodcaptcha.php

总结

在实际业务及生产中,某些功能会要求有CAPTCHA。而不安全的CAPTCHA,将会导致敏感数据被窃取,认证攻击,DOS用户甚至管理员等严重问题的发生。因此对于开发人员和使用者而言,具有一个好的设计和实施的CAPTCHA至关重要!

所有脚本的Github链接: https://github.com/securelayer7/Captch-Bypass-Vulnerable-Script

*参考来源: securelayer7,FB小编 secist 编译,转载请注明来自FreeBuf(FreeBuf.COM)

相关 [验证码 安全] 推荐:

小议验证码的安全性及如何绕过

- - FreeBuf.COM | 关注黑客与极客
CAPTCHA是(全自动区分计算机和人类的图灵测试)的简称,是用于区分计算机和人类的一种程序算法,这种程序必须能生成并评价人类能很容易通过但计算机却通不过的测试. 像我们平时最常遇到的,就是基于图片的验证码. 这类图片验证码通常包含的,都是些易于用户识别简单的验证信息. 用户必须准确的识别图像内的字符,并以此作为人机验证的答案,方可通过验证码的人机测试.

“短信验证码”早已不安全,睡梦之中就能被盗刷

- - FreeBuf互联网安全新媒体平台 | 关注黑客与极客
近日,国内各地都陆续发生了一些利用短信验证码冒用身份、窃取银行账户、金融类 APP 财产的案件,受害者甚至莫名其妙“被网贷”,进而遭遇较大经济损失. 根据@江宁公安在线 的分析,这种犯罪手法是近两年来出现的新型伪基站犯罪手段,多地警方已经有所发现. 具体说来,这是一种新型的“伪基站”技术. 主要采用“GSM劫持+短信嗅探技术”,可实时获取用户手机短信内容,进而利用各大知名银行、网站、移动支付APP存在的技术漏洞和缺陷,实现信息窃取、资金盗刷和网络诈骗等犯罪.

java 验证码

- - ITeye博客
// 创建字体,字体的大小应该根据图片的高度来定. // 随机产生160条干扰线,使图象中的认证码不易被其它程序探测到. // randomCode用于保存随机产生的验证码,以便用户登录后进行验证. // 随机产生codeCount数字的验证码. // 得到随机产生的验证码数字. // 产生随机的颜色分量来构造颜色值,这样输出的每位数字的颜色值都将不同.

验证码新趋势:NuCaptcha推出动态验证码

- Mac.Baby - 36氪
曾开发过提供视频验证码服务的加拿大创业公司NuCaptcha刚刚发布了动态验证码,可为网站提供新的安全保证,有望为验证码市场带来新气象. 验证码是人们在网站上最常见的安全问题,只要是上网的人都会遇到被要求辨认和输入数字或者单词的情况. 网站通过验证码来区分人和恶意程序. 而我们所见的大部分的验证码都是基于文字的.

10种用户友好的验证码

- Liang - cnBeta.COM
众所周知,验证码就是帮助我们确定答案不是由电脑自己生成的. 今天我推荐给大家10种用户体验绝佳、令人意想不到的验证码设计风格.

使用 PIL 生成验证码图片

- HarryHan - python.cn(jobs, news)
现在的网页中,为了防止机器人提交表单,图片验证码是很常见的应对手段之一. 这里就不详细介绍了,相信大家都遇到过. 现在就给出用Python的PIL库实现验证码图片的代码. _letter_cases = "abcdefghjkmnpqrstuvwxy" # 小写字母,去除可能干扰的i,l,o,z. _upper_cases = _letter_cases.upper() # 大写字母.

response生成图片验证码

- - ITeye博客
服务器对客户端浏览器做出的响应被封装成一个HttpResponse对象. 要对浏览器进行操作,只需要操作HttpRespones对象,通过HttpServletResponse.getWriter()获得PrintWriter,该对象为outputStream的子类.     本例将使用Servlet输出图片验证码.

验证码的现在与未来

- Yishen - 爱范儿 · Beats of Bits
”验证码“( CAPTCHA )其实并不是各位网友总是在不同网站上看到的难以辨认的字母组合的代名词,而是“全自动区分计算机和人类的图灵测试”的俗称,顾名思义,它的作用是区分计算机和人类. 在 CAPTCHA 测试中,作为服务器的计算机会自动生成一个问题由用户来解答. 这个问题可以由计算机生成并评判,但是必须只有人类才能解答.

jsp+servlet实现验证码功能

- - CSDN博客推荐文章
验证码的功能大多数人可能不都理解,但几乎每个安全网站都会有. 验证码是用来防止非人为因素操作的行为,例如一个黑客要黑一个网站,怎么弄呢. 最简单的思路当然是造成其网路拥堵直至系统瘫痪掉. 如果没有验证码,那么我就可以在注册页面,写一个程序,只有注册表单,不断更换主键或不可重复的内容,不停的提交. 那这样每秒可以注册几万次都有可能,这样服务器就大量负载,很容易就瘫痪并死掉.

Servlet实现图形验证码

- - CSDN博客推荐文章
|-- 配置开发图形验证码Servlet. // 设置响应头 Content-type类型. // 以下三句是用于设置页面不缓存. // 建立指定宽、高和BufferedImage对象. Graphics g = image.getGraphics(); // 该画笔画在image上. Color c = g.getColor(); // 保存当前画笔的颜色,用完画笔后要回复现场.