0x01 什么是验证码?

CAPTCHA(Completely Automated Public Turing test to tell Computers and Humans Apart)——全自动区分计算机和人类的图灵测试,俗称验证码,是一种区分计算机和人类的一种公共全自动程序,在CAPTCHA测试中,作为服务器的计算机会自动生成一个问题由用户来解答,这个问题可以由计算机生成并评判,但只能由人类才能解答,计算机无法通过测试,所以,能回答出问题的用户就可被判定为人类。
验证码其作用能有效防止恶意登录注册,验证码每次不同就可以排除病毒或恶意程序自动申请用户及自动登录。


有些人经常会吐槽某些网站的验证码,连输入者都看不清,需要输入多次才可以成功,其实使用这样的验证码的网站,往往是非常注重网络安全的,并且是提供非常重要服务的网站,其中最具代表性的就是12306网站,购买火车票需要输入验证码,它的验证码曾经受到许多网友的吐槽,充分体现了一句话:“能够多次欺骗购票者的验证码,才是最安全的验证码。


0x02  验证码原理

验证码机制原理

客户端发起请求->服务端响应并创建一个新的Session ID同时生成随机验证码,将验证码和Session ID一并返回给客户端->客户端提交验证码连同Session ID给服务端->服务端校验验证码同时销毁当前会话,返回给客户端结果。
验证码背后的原理除了对滑块起始位置的认知、图中文字及其顺序的认知外,实际还会基于在页面上的操作行为、操作轨迹,以及当前设备的指纹、所运行的环境等纬度进行大数据分析,并利用有监督和无监督的机器学习手段,不断升级和优化模型,不断提供破解的成本,保证人机识别的效果。

为什么要使用验证码

  • 防止系统遭受DDOS攻击;
  • 防止暴力破解;
  • 防止机器人自动批量注册;
  • 对特定的注册用户用特定程序爆破方式进行不断的登录、“灌水”、“刷单”、短信/电子邮件轰炸等;
  • 识别用户身份等攻击。

验证码设置不当的危害

  • 如果网站有提交表单的功能,并且需要由站点管理员审核才可通过,恶意用户会产生大量的垃圾表单,影响网站访问速度,加大工作量,且合法用户的请求有可能会因此被拒绝服务;
  • 恶意用户可利用程序发送短信/邮件的功能,发送大量垃圾邮件/短信,造成短信/邮件轰炸,影响用户体验及站点短信服务过度消费;
  • 通常在网站的用户注册、密码找回、登录等页面处使用验证码,但当这些验证码具有一定的规律性并且没有做好对应的防护措施时会导致攻击者通过爆破等方式猜解/绕过验证码机制,可导致任意用户注册、批量注册无用账户、重置任意用户密码、获取系统权限等危害。

0x03 验证码形式

常见的验证码有:短信验证码、语音验证码、图文验证码、标数字验证码等。虽然验证码的形式多样,但是核心内容不变,形式不同,就有了分门别类的应用。
验证码的形式有:

传统输入式验证码

主要是通过用户输入图片中的字母、数字、数学计算、汉字等进行验证。大多数网站都采用这种形式。
特点:
简单易操作,人机交互性好,但安全系数低,容易被破解。

纯字母输入式验证码
数字计算输入式验证码

输入式的图形验证码

有精美的图案,识别文本也清晰可认,专注于广告。具有代表性的有Solve Media、宇初验证码。与其说是验证码,到不如说是广告位。
Solve Media

纯行为验证码

照要求将备选碎片直线滑动到正确的位置。对于实际用户而言体验较好,不管是移动端的拖动还是PC端的鼠标操作仅需要人眼辨识滑块位置,但同样对机器识别而言,处理滑块位置定位准确,安全性极低,维度单一,很容易被逆向模拟,且答案空间有限,可以穷举。

图标选择与行为辅助

给出一组图片,按要求点击其中一张或者多张。借用万物识别的难度阻挡机器。点触的图标验证方式是先通过判断用户输入用户名和密码的键盘事件,这个过程是静默的,用户不会感知到。
具有代表性的是点触验证码、Google新型验证码、12306验证码、点触的公有云、私有云验证系统。Google新型的验证方式是通过鼠标选择一个CheckBox,将鼠标行为数据传送到后端服务器进行判断,如果行为存疑,那么就会出现选择图标的验证码。
特点:安全性强,对于图片、图库、技术要求高。

点击式的图文验证与行为辅助

点击式的字符识别类似于传统验证码的图像形式,通过文字提醒用户点击图中相同字的位置进行验证。具有代表性的是淘宝新型验证码、点触验证码,比如淘宝新型验证码是拖动滑块的鼠标行为,交于后端服务器进行判别,如果认为行为存疑,那么就让用户进行双重校验。
特点:操作简单、体验良好、单一图片区域较大,破解难度大,不需要互联网支持就可使用。

智能验证码

其思想是“去验证化”,通过行为特征、设备指纹、数据风控等技术判定当前用户的安全状况,满足一定条件后,正常用户免验证,异常用户则进行强制验证。代表性的是点触的智能验证码。
特点:简单便捷,区分人与机器、人与人、设备与设备,兼顾安全性与用户体验。

其他验证码

短信/邮件验证码,通过短信、邮件等方式接收验证码,常用于用户注册、登录、密码修改以及风险提示等应用场景,对于企业来说可以有效防止恶意注册,对用户来说,提高了安全保障。
安全程度越来越高,还有语音、视频等验证码。

0x04 验证码绕过

  • 客户端可能存在的安全问题
  1. 有的网站验证码由本地JS生成,仅仅在本地用JS验证。针对这种验证,在攻击者看来相当于没有做验证,可以在本地直接禁用JS或者使用Burp抓包把验证的字段删除进行绕过;
  2. 某些网站把验证码输出到客户端HTML中,送到客户端Cookie或Response headers;
  1. 有些网站默认不显示验证码,而是在输入错误一定数量之后才需要验证码,开发人员可能会在Cookie中写入一个标记loginErr,用来记录错误数量,则可以不更新Cookie中的loginErr中的loginErr值反复提交,验证码就不会出现。
  • 服务端可能存在的安全问题
  1. 验证码不过期,没有及时销毁会话导致同一验证码反复使用。攻击者可以在Cookie中带固定的Session ID和固定的验证码字符串;
  2. 没有对验证码进行非空判断,导致可以直接删除验证码参数;
  1. 产生验证码的问题有限。

验证码重复使用

无条件不刷新

一般是在某一段时间内,无论登录失败多少次,只要不刷新页面或者不刷新验证码,就可以无限次的使用同一个验证码来对一个或多个用户帐号进行暴力猜解。换句话说,攻击者可以在同一个会话下,在获得第一个验证码后,后面不再主动触发验证码生成页面,并且一直使用第一个验证码就可循环进行后面的表单操作,从而绕过了验证码的校验作用,对登录进行暴力猜解。

有条件不刷新

一般是在登录失败后,系统会打开一个新的页面或者出现弹窗,提示用户登录失败,点击“确定”后返回登录界面,验证码也会刷新。
这种情况下,只要我们不关闭新窗口、弹窗,直接使用BurpSuite截取登录请求包,先发送至Repeater模块,多“Go”几次,看看会不会返回“验证码错误”的提示信息,如果依旧返回“密码错误”则说明验证码不进行刷新。再将数据包发送到Intruder模块,将密码设为变量再进行MD5编码,直接爆破就是了。
不要点击【确定】;

判断验证码是否会刷新;

将密码编码,爆破;

(因为不是测试环境,所以随变写了几个弱口令进行测试)从返回包中可以看到仍旧提示“密码错误”,验证码是不失效的。正常使用的时候,直接上弱口令字典跑就是,跟平常的爆破操作一样。

验证码隐藏在源码中

程序员在写代码时安全意识不足导致验证码被隐藏在源码中,遇见这种情况,攻击者只需要记住验证码是多少,打开网站源码,搜索刚才的验证码,如果能搜索到,那就可以通过工具提取源码中的验证码并将其放入每次请求的报文中,进行账号密码的暴力破解。

验证码隐藏在Cookie中

一般来说,会将验证码的值用Session存储起来,再通过对比用户提交的验证码和Session中的验证,就可以知道用户输入的是否正确,但由于Session 会占用服务器资源,有些程序员会将验证码的值加密后存储在Cookie中。针对这种情况,攻击者可以通过抓取登录数据包,分析包中的Cookie字段,查看其中有没有相匹配的验证码或者是经过简单加密后的验证码。

验证码客户端回显

某些系统会将验证码在客户端生成而非在服务器生成。针对此类验证码,当客户端需要和服务器进行交互发送验证码时,可借助浏览器工具或抓包工具查看客户端与服务器进行交互的详细信息,可在返回包中查看到验证码。

仅在客户端生成验证码

某些网站验证码由本地JS生成,也仅仅在本地用JS验证。
可以通过截取的登录数据包发现,系统虽然存在验证码,但是验证码并没有向服务器传输,而是在本地客户端直接进行验证。攻击者可以在输入一次正确的验证码绕过客户端检测后或者禁用本地JS,使用工具对用户名或密码进行暴力猜解。

验证码空值绕过

可以通过直接删除验证码参数或者Cookie中的值来绕过判断,进行暴力破解。

其他思路

  • 由于一些程序员在网站上线前会设置固定值如0000、8888等作为验证码,上线后忘记做修改,所以可以输入1111、6666等万能验证码
  • 空验证码,某些系统即使不输入验证码也不影响正常的验证流程;
  • 使用验证码识别工具(pkav、验证码识别接口)对验证码进行爆破;
  • 某些系统获取验证码的方式为通过参数的方式去加载,如:www.xxx.com/yanzheng.php?code=xxx等,攻击者可以尝试将参数值改为undefined,即设为控制,也可以通过编写脚本的方式,获取验证码并传入验证流程。

短信验证码暴力破解

一般情况,短信验证码由4-6位纯数字组成。首先可以先抓取服务器向填写的手机号发送短信验证码的请求包,查看返回包中是否有明文的验证码,如果有就可以直接使用。如果没有可先判断验证码为4为还是6位,且判断系统是否对验证码的失效时间和尝试失败次数做限制(去接码平台找手机号,收个短信试试),如果没有,攻击者就可以通过尝试这个区间内所有的数字进行暴力破解。
比如,验证码为4位,先抓取验证码验证请求包,发送至BurpSuite的intruder模块,将验证码的范围设置为0000-9999,对验证码进行暴力破解。

验证码爆破工具

虽然验证码发展到如今这种许多人类都难以识别的状态,但仍有部分老系统使用的验证码异常的简单。还有一些网站由于程序员本身的素质或者缺乏相关图像相关的知识,所以并没有自己写验证码的生成程序,而是直接在网上随便复制粘贴一个Demo级别的代码来用,以达到网站有验证码的目的,而忽略了验证码的强弱性,导致验证码都是爆款弱验证码。比如非常简单没有任何干扰元素的验证码,或是能直接复制的验证码。
大部分的验证码爆破工具都遵循这个原理:
  1. 遍历所有的像素点;
  2. 删除干扰的点、线;
  1. 将数组里连续的字符切割成一个个独立的字符,如果字符有旋转的,还得根据边缘把它再给摆直;
  2. 循环匹配已有的所有的同字体的数据;
介绍几款适用范围比较广泛的验证码爆破工具。

PKav HTTP Fuzzer

下载地址:https://github.com/estell-yf/PKAV/(安装包中有工具使用说明书。)
Pkav HTTP Fuzzer是一款主要用于Web站点安全测试的工具,功能特点:
  1. 支持图片型和非图片型的验证码识别,支持四则运算验证码;
  2. 支持随机IP地址伪造;
  1. 支持批量HTTP代理轮换;
  2. 支持各选项参数实时调节;
  1. 可对返回数据进行各项处理等。
缺点:只能对简单的验证码进行识别
现在通过对一个没有干扰项的图形验证码进行识别,爆破用户名密码,了解此工具的基本使用。
通过系统报错信息枚举出用户名为admin,输入用户名admin、任意的密码、正确的验证码,使用BurpSuite抓取登录包。

右键验证码图片,选择“复制图片地址”

验证码识别:
先测试工具是否能准确识别出验证码。将图片地址粘贴至Pkav“图形验证码识别”模块中的验证码地址栏进行识别,如下图所示,可以准确识别出验证码。
设置变体:
将BurpSuite截取的登录数据包粘贴至“变体设置”的请求包处。选中验证码字段,点击“添加验证码标记”,再选中密码字段,点击“添加标记”。点击右侧“导入”,导入密码爆破字典。
Pkav自带很多字典
或者使用字典生成工具生成更具针对性的字典。
白鹿社工字典生成器
—社工弱口令,

下载地址:https://github.com/x311/BaiLu-SED-Tool
或者利用
https://www.bugku.com/mima/https://www.bugku.com/mima/
两个社工库密码生成工具生成密码字典。

重放选项:
点击下方的“重放选项”,需要注意两点。通过多次刷新验证码,我们知道验证码为固定长度4位字符,所以设置固定4位;当输入错误的验证码时,系统会提示“验证码不正确!”,出现这一串文字就代表验证码识别错误,必须重新识别,所以选择“字符串匹配”,添加弹出的“验证码不正确!”,当出现验证码识别错误的提示时,就会重新验证直到成功。
爆破:
切换至“发包器”模块,点击启动,进行验证码与密码爆破。与BurpSuite一样,通过返回包的长度判断验证码与密码是否正确。爆破的成功与否取决于密码字典的强大,如下图所示,因为是真实站点,我只进行了100次左右的密码爆破,并没有破解成功。虽然没有爆出来密码,但是验证码是识别正确的。
Pkav只能识别简单的图片验证码,识别不了带干扰性的验证码

BurpSuite插件

这两个插件可以直接调用云打码平台的验证码识别接口,但需要付费,所以附上使用链接与下载地址,大家有需要的自行下载吧~

captcha-kille

使用方法:https://blog.csdn.net/u014029795/article/details/105534611https://www.cnblogs.com/sunny11/p/14357016.html下载地址:https://github.com/c0ny1/captcha-killer
特点:可以直接调用云打码平台的验证码识别接口可以带来一定的便利,但是需要花钱。

reCAPTCHA

下载地址:https://github.com/bit4woo/reCAPTCHA使用方法:https://blog.csdn.net/u014029795/article/details/105534611

verifyreader

下载链接:https://github.com/DebugST/DotNet_Captcha_VerifyReader/tree/main
verifyreader是一款针对简单的验证类型进行识别的工具,包含验证码配置工具、代码模块、爆破模块,进行开源只需两个类文件,其他模块用于对这两种工具进行二次封装,主要是提供一些识别工具包的思路。
缺点:需要自己制作验证码识别的模块需要耗费一定时间训练(工具需要.net环境)。
打开verity config tool工具。
复制验证码地址,将地址粘贴至"验证码URL或者文件路径"处,点击open,开始识别验证码。

点击字库设置,进行手动采样,按照工具右侧识别出的字符,将字符输入至手动采样框,直到0-9所有的数字全部识别完,如果验证码包含大小写,则需要手动采样所有的字符:0-9、a-z、A-Z。
采样完成后,将文件保存。
关闭配置文件,打开F-login.exe文件。
抓请求包,随便输入任意密码用burpsuite抓取登录请求数据包

将抓取数据包中的内容复制到F-login工具中对应的位置,将采样文件路径也填上。
根据使用说明设置变量位置。
导入密码字典(如果需要同时爆破用户名,则同时导入用户字典),点击开始爆破。
爆破成功,根据页面长度可以判断出密码为bendss。
参考:https://blog.csdn.net/weixin_46700042/article/details/109051503?spm=1001.2101.3001.6650.5&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7ERate-5.pc_relevant_paycolumn_v3&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7ERate-5.pc_relevant_paycolumn_v3&utm_relevant_index=10https://blog.csdn.net/weixin_40412037/article/details/103655802?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522164627501216780366533805%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&request_id=164627501216780366533805&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~blog~first_rank_ecpm_v1~rank_v31_ecpm-2-103655802.nonecase&utm_term=%E9%AA%8C%E8%AF%81%E7%A0%81&spm=1018.2226.3001.4450https://blog.csdn.net/weixin_39190897/article/details/86539542
E
N
D
Tide安全团队正式成立于2019年1月,是新潮信息旗下以互联网攻防技术研究为目标的安全团队,团队致力于分享高质量原创文章、开源安全工具、交流安全技术,研究方向覆盖网络攻防、系统安全、Web安全、移动终端、安全开发、物联网/工控安全/AI安全等多个领域。
团队作为“省级等保关键技术实验室”先后与哈工大、齐鲁银行、聊城大学、交通学院等多个高校名企建立联合技术实验室。团队公众号自创建以来,共发布原创文章370余篇,自研平台达到26个,目有15个平台已开源,积极参加各类线上、线下CTF比赛并取得了优异的成绩,如有对安全感兴趣的小伙伴可以加入或关注我们。
我知道你在看
继续阅读
阅读原文