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

一、什么是验证码?

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

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

二、验证码的重要性

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

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

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

2. 避免垃圾邮件和DOS

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

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

3. 保护数据挖掘机器人

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

三、验证码为什么能被绕过?

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

  • 设计问题
  • 执行问题

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

1. 设计问题

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

(1) 设计问题#1:

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

你可以在Github上下载到该验证码的源码:

https://github.com/securelayer7/Captch-Bypass-Vulnerable-Script/tree/master/ArithmeticCAPTCHA

如何破解?

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

你可以在Github上下载到该利用代码:

https://github.com/securelayer7/Captch-Bypass-Vulnerable-Script/tree/master/CaptchaExploits

(2) 设计问题#2:

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

你可以在Github上下载到该验证码的源码:

https://github.com/securelayer7/Captch-Bypass-Vulnerable-Script/tree/master/TenRepeatedCAPTCHA

如何破解?

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

你可以在Github上下载到该利用代码:

https://github.com/securelayer7/Captch-Bypass-Vulnerable-Script/tree/master/CaptchaExploits

2. 执行问题

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

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

(1) 执行问题#1:

在演示中,我们正在使用Google reCAPTCHA人机验证。我们使用API将用户解决的CAPTCHA响应发送给Google的端点。更多请点击:

https://www.google.com/recaptcha/intro/index.html 。API以JSON的输出形式回复请求,以及HTTP状态码。到现在为止,还没发现什么问题 !!

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

你可以在Github上下载到该验证码的源码:

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

如何破解?

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

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

(2) 执行问题#2:

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


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

如何破解?

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

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

(3) 执行问题#3:

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

你可以在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

如何破解?

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

你可以在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密钥。

你可以从这里下载安全的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

作者:secist
来源:51CTO

时间: 2024-12-03 10:15:31

小议验证码的安全性及如何绕过的相关文章

手机短信验证码真的安全吗?

手机的蓬勃发展,衍生出来众多行业,也让原本功能单一的手机号做出极大的改变.如今似乎每个人的手机号都绑定了或多或少的各种账号,手机绑定的东西越来越多,涉及到的重要的东西也越来越多,例如像银行卡绑定手机号,支付宝等等能与资金挂上钩的. 如今手机绑定最主要的表现方式就是通过短信验证码来证明自己的身份,验证的方式极其简单便捷,当人们在享受这份简单便捷的验证方式时,不由也为短信验证码来验证身份信息的方式产生了不信任感. 那么手机短信验证码真的安全吗? 如果说安全的话,没有什么是真正的安全的,短信验证码也不

制作一个网页刷票软件(有验证码)遇到问题

问题描述 http://www.bsdj.cn/21_syds_list1.asp这是网页地址,需要选择5个才能投票.我需要投贴心人(顾村村),另外四个锁定票数最高的四个.我个人思路如下:第一.通过request获取验证码图片第二.解析验证码第三.赋值及诶出来的验证码数字第四.添加一个submit事件我是直接将网页源代码下载下来,然后直接在后面添加了submit事件,但是本地打开就显示无法连接.望大神相助,教我如何完成该种带有简单验证码的网页刷票.PS:验证码图片解析代码使用http://www

[ASP.NET] 图形验证码破解-以简单图形为例

原文 http://www.dotblogs.com.tw/joysdw12/archive/2013/06/08/captcha-cracked.aspx 前言 这次来讲个比较有趣的主题,就是该如何破解网路上那些防止机器人攻击的图形验证码,谈到图形验证码破解,想必各位嘴角一定微微上扬了吧XD,看来学坏好像都比较有兴趣一点,但其实知道破解的原理后,之后要做防范也比较清楚该如何处理了← 主因:P.   在开始破解前先来看一下基本上的破解原理与方法,可以先参考此篇  使用PHP对网站验证码进行破解 

PHP对验证码的认证过程防止机器注册

    这段时间在写php脚本,接触到web前端以及web安全问题比较多,这时给大家简单地谈一下我们网站验证码的验证过程及其安全问题.     从三个方面去谈一下关于验证码的使用:验证码的生成,验证的过程,验证中注意的安全问题.     验证码的生成,首先还是要说说验证码的作用.众所周知,验证码的存在,是为了防止一些机器,或是刷恶意留言.无限注册用户或是暴力破解账号密码.现在普通的验证码是由一个php脚本生成的,比如打开我们emlog的include/lib/文件夹,底下有个checkcode.

网络安全真的能靠验证码么?

■本报见习记者袁一雪 3月15日,2015年春运终于落下帷幕.在今年的人口大迁徙里,12306依然成为被关注的焦点.这次被诟病的不是令人崩溃的网站,而是网站上的验证码. "日防夜防,黄牛难防",为了防止黄牛倒票,12306不断更新验证码形式,最新的一版验证码显示方式被网友戏称为"史上最奇葩":用户需要根据提示,从8张图片中找到提示中提到的相关物品,比如贺卡.雕像.贝壳.玻璃瓶.擀面杖.热气球等,看不清或者没把握的可以刷新更换.如此确认无误后,才能登陆或者提交订单.然

看瑞数信息如何玩转“从零到一”

2016年10月20日,国内第一家动态安全解决方案提供商--瑞数信息在北京隆重举行了主题为"赢在动态安全,引领数字化业务的防护新航向"为主题的新一代动态安全产品发布暨战略合作签约仪式.发布会上,瑞数信息全面推出用于动态保护数字业务及资产的新一代安全动态产品.       动态安全颠覆传统安全,痛击自动化攻击+黑色产业链      "大数据时代",阴暗面隐藏的网络黑产,正逐渐壮大,成为严重制约互联网健康有序发展的毒瘤.2016年上半年,超过5.4亿条用户信息被泄漏,

Web Service 一些对外公开的网络服务接口以及http://www.webxml.com.cn/zh_cn/index.aspx

      Web Service 一些对外公开的网络服务接口 2011-10-29 14:12 商业和贸易: 1.股票行情数据 WEB 服务(支持香港.深圳.上海基金.债券和股票:支持多股票同时查询) Endpoint: http://webservice.webxml.com.cn/WebServices/StockInfoWS.asmx Disco: http://webservice.webxml.com.cn/WebServices/StockInfoWS.asmx?disco WSD

emlog绕过验证码刷评论原理分析

最近博客常常被人刷评论,最狠的一次被刷了10000多广告.     先看看评论验证码是怎么检查的. emlog/include/controller/comment_controller.php,先获得$imgcode: $imgcode = isset($_POST['imgcode']) ? addslashes(trim(strtoupper($_POST['imgcode']))) : '' 检查: } elseif (ISLOGIN == false && Option::get

寻找阿登高地——爬虫工程师如何绕过验证码

马奇诺防线是二战前法国耗时十余年修建的防御工事,十分坚固,但是由于造价昂贵,仅修建了法德边境部分,绵延数百公里,而法比边界的阿登高地地形崎岖,不易运动作战,且比利时反对在该边界修建防线,固法军再次并没过多防备,满心期望能够依靠坚固的马奇诺防线来阻挡德军的攻势.没想到后来德军避开德法边境正面,通过阿登高地从防线左翼迂回,绕过了马奇诺防线,然后就是英法联军的敦克尔克大撤退了. 网站验证码就如同马奇诺防线一样,阻挡了爬虫工程师的正面进攻. 随着爬虫和反爬虫双方围绕验证码的不断较量,最终导致了验证码识别