geetest_logo

任何业务在运营一段时间之后都会面临黑产大量的破解。验证码和各种爬虫的关系就像猫和老鼠一样, 会永远持续地进行博弈。极验根据十一年和黑产博弈对抗的经验,将黑产的破解方式分为三类:


1.通过识别出验证码图片答案实现批量破解验证,即图片答案识别;

2.在了解通讯流程之后直接携带相关参数发请求进行交互,即协议破解;

3.使用各种客户端模拟器来模拟真人通过验证,即模拟器破解。


针对以上三种破解方式,极验一一总结了对应的验证码攻防点:图片答案博弈协议破解检测环境检测,用于保护极验客户相关场景和接口的安全。


前两期,我们已经分别从图片资源遍历、图片答案识别介绍了与黑产的第一大攻防点:图片答案博弈。

本期,我们继续来介绍与黑产的第二大攻防点:协议破解对抗。协议破解是黑产最常用的破解方式,我们先来聊聊如何检测协议破解。


一、道场


什么是协议破解


为了通过验证进而达到刷量的目的,所有黑产的爬虫都会去模拟真人的请求特点,通过伪造相应的请求及参数直接访问通信接口。这种攻击方式被我们称为协议破解。


为了更好地理解协议破解,我们来举个例子:在2023年6月的五月天演唱会异常订单事件中,就涉及了类似的伪造参数问题。


在五月天武汉、沈阳两场激情的抢票大战结束后,某票务平台F为了维护抢票的公平性,杜绝第三方代拍、第三方抢票及抓包软件和未使用官方APP/小程序下单等违规脚本行为,事后共对455笔异常订单(共计754张票)进行了退票退款,因此引发了众多歌迷的不满。


对于“无辜”被退票歌迷的投诉,该平台做出的回应是:通过官方APP/小程序正常下单,应包含如下完整的订单流参数,而异常订单缺乏部分核心参数。



简单来说,就是该票务平台提前在请求参数里设置了一个非必填的钓鱼参数,通过官方APP/小程序正常下单的请求都会自动携带上这个参数。而脚本抓包工具虽然会模拟正常请求,看似与正常请求无异,但会因为非必填而略过这个核心参数。



如上图所示,未正常使用官方APP/小程序的异常订单缺失了“119533”这个无实义的钓鱼参数。这就是该票务平台检测脚本破解的方法。


当黑产模拟真人请求时,只要我们设置一个新的钓鱼参数,那么黑产原来固定的脚本就会因为缺失这个新的参数而“露出马脚”。虽然缺失核心参数的黑产仍然能正常通过校验(同理于脚本运行的异常订单仍然能提交成功并付款),但我们已能很直观地将黑产账号与正常账号做出区分,从而实时掌握黑产行踪进行后续处置(同理于平台强制退票退款)。因此,新增参数来标记异常账号的方法能大大减少隐藏的黑产协议破解带来的损失,实现从防御到反制的诱捕打击。


二、攻击方视角(黑产)


站在攻击方视角,黑产具体是如何破解协议、伪造参数的呢?


攻击流程

验证码的所有请求都是HTTP请求。HTTP(Hypertext Transfer Protocol,超文本传输协议)是一个简单的请求-响应协议,用于客户端和服务器端的通信。它指定了客户端可能发送给服务器什么样的消息以及得到什么样的响应。


而所有的爬虫都会模拟真人的协议,它是我们的影子,会去模拟我们真人所有的请求特点。黑产想要破解前后端通讯,通常是通过伪造HTTP协议请求的参数。


黑产具体的破解协议、伪造参数的流程如下:

Step 1: 浏览器F12打开开发者工具面板,进行网络抓包。


Step 2: 进入目标页面,观察网络请求列表,找到关键请求。(关键请求会因不同的业务而不同,要具体分析)



Step 3: 打开关键请求详情,观察请求协议,分析请求参数。

  1.主动输入的参数,例如 账号密码、邮箱、手机号、答案 等等。

  2.语义清晰的参数,例如 时间戳、客户端类型、业务id、业务流水号 等等,通常多次请求不发生变化,或是可以从前置请求中提取。

  3.请求头参数,例如 Referer、Ua、Cookies 等等。

  4.签名、加密参数。


Step 4: 逆向参数生成逻辑。

协议破解的关键就是最后一类 签名、加密参数。这类参数的生成伴随着单向散列、加密等逻辑,再配合上客户端代码混淆,参数生成逻辑会藏得较深,需要配合 断点、调用栈 进行调试分析。


Step 5: 脚本伪装客户端逻辑。

使用代码将 IP代理、参数伪造、HTTP请求 等逻辑固定下来形成脚本。脱离客户端,略过页面渲染和交互过程,使效率最大化。


牟利方式


站在黑产的视角,为什么协议破解是他们最常用的破解手段?


前面我们提到,图片答案识别需要经历批量爬取下载图库、人工打码、穷举识别/训练模型等一系列流程来获取验证答案,这需要黑产在前期投入很大的时间和精力成本。黑产下载一批30万张的验证图库需耗时8.33小时;而人工打码获取答案又需要花费数千元成本,耗时8~10天,效率相对较低。


而后面要讲的模拟器破解还受环境条件的限制,需要黑产对浏览器十分了解进而用各种自动化测试工具,例如 Selenium 操作 chromium 内核实现自动化的拖动、点击等操作,攻击流程更复杂,技术门槛更高。


相比之下,协议破解最大的优点就是成本低、效率高。黑产无需花费很多资金成本,只需要进入目标页面,模拟最核心的关键参数,就能实现对验证码的破解,整个过程的执行效率更高。当脚本写好固定下来后,就能以每次几百到上万元不等的价格出售给需要的人,在短时间内赚取巨额的利润,收益远远高于成本。因此,绝大部分黑产在攻击时都会选择协议破解。


当然,协议破解在效率高的同时也存在一个不可避免的缺点:伪造参数困难。协议破解需要黑产对验证码的前端源码进行解析,从而实现对前端发送的参数的伪造,因此也需要一定的技术门槛。


三、被攻方视角(客户)

站在客户视角,如果遭遇了协议破解攻击,数据又会发生哪些异常变化?


协议破解对客户的影响


某资讯行业客户G,在信息查询场景长期遭受爬虫攻击爬取信息。2023年8月22日,G公司后台的查询量级突然急剧上升,验证请求量大大上升,达到每小时7000左右交互。该时段内的存在大批次的异常数据攻击情况,给客户业务造成了巨大损失。



并且,从ip维度上分析,0点至9点时段的4万多次交互中,单个ip访问次数最大达到了28次,说明爬虫已经控制ip访问频率!这将给客户业务造成更大的威胁。


CT命中量:定位协议破解


遭到爬虫攻击后,G公司第一时间找到了极验寻求帮助。极验安全专家查看后台数据后发现:验证请求量、验证交互量和验证防御量都很高,说明黑产在验证失败后频繁请求验证进行重试,或者重新搜集验证资源信息进行打码攻击。单从这几个验证量来看,与之前图片答案识别攻击的数据并没有太大区别,无法准确辨别黑产的攻击方式。


遭遇图片答案识别攻击的后台数据


遭遇协议破解的后台数据


从这几个验证量辨别不出与图片答案识别攻击的明显区别后,极验安全专家单独打开了紫色的CT(captcha token)命中量,这是极验特有的“异常标记”功能,专门用于定位黑产的协议破解。其原理主要是针对前端 js 变化以及变换参数,检测出是否存在黑产破解了前端协议。


如果CT命中量很高,则说明黑产正在进行协议破解攻击,命中了我们的前端“异常标记”。

单独查看CT命中量,定位协议破解


发现CT命中量高达2万后,极验安全专家于8月23日11点开始打开对协议破解请求的封禁拦截,成功量开始下降,失败量和交互量开始上升,说明黑产此时确实正在进行协议破解。


在这期间,爬虫不断的组织逆向破解,拦截效果持续到9月5日,同日验证通过量和验证交互量不断上升,说明此时爬虫已针对该版本验证协议完成了破解。


四、防守方视角(极验)


前面我们了解到,既然黑产协议破解的原理是模拟真人请求、伪造真人协议,那么防守方如何从中进行防御?关键就在于:区分出这些伪造的危险请求。


防御思路


如何区分出伪装成正常用户的黑产?虽然黑产已经从行为、设备、IP等维度上模拟了真人,看上去拥有了真实身份,但有一点最明显的区别:黑产的出发点永远是获取利益最大化,因此会将流程自动化,把破解复用了的协议固化成一套自动化脚本。若脚本没有出现问题或没人反馈异常,就不会花成本更新。


因此,我们可以利用这一点去设计陷阱:黑产为了通过验证会模拟真人请求,那么我们只需要在请求中新增一个钓鱼参数。由于黑产破解协议后的脚本是已经固化好的,不会携带这个新的钓鱼参数,因此会缺失参数而暴露身份。 这一原理与本文开头提到的票务平台检测异常订单十分相似,脚本抓包工具发出的请求往往会缺失核心的钓鱼参数。


防御策略


针对黑产的协议破解,极验的应对策略就是基于已有的请求参数,在前端再加一个新的钓鱼参数。如果是来自于正常浏览器的用户,将会在更新后自动携带上这个新的参数;而已经破解了协议的黑产则会沿用原先固化的协议,不会携带新的参数。这能很有效地检测出黑产:如果请求中未携带新增的参数,只携带了旧的参数,那么就极有可能是之前破解了我们协议的黑产。


这一新增参数、区分黑产的过程就是我们协议破解检测中的“异常标记”功能,通过参数的变化比对,让我们得以区分异常的黑产。并且,被检测出来的黑产仍然能正常通过验证,但我们已能很直观地将黑产账号与正常账号做出区分,从而暗中实时地观察黑产行踪。


“异常标记”功能实现起来也非常简单:


Step 1:在极验后台轻轻一点,即可配置好新的参数(示例版本为v1.7.4-c6515a)。后台一般会提前储备50个左右的新参数,以便被破解后随时动态更新。



Step 2:在v1.7.4-c6515a版本下,正常通过客户端发出请求的用户会自动携带上"9pI3": "7k9E"这个新配置的参数。


而脚本发起的黑产请求则会缺失"9pI3": "7k9E" 这个新配置的参数,只携带上一批的旧参数,从而与正常请求不同。


破解永远是难以避免的。黑产一定会破解我们前端的协议,会不断变换IP,设备,修改行为参数,原因就在于前端代码已被透露公开,无论是我们还是任何其他竞品,包括谷歌的 recaptcha 都是如此,大家都会不可避免地遭到破解。


被动的防御永远会落后于黑产,“兵来将挡水来土掩”的方式反而使得防御方疲惫不堪,运营压力庞大。因此,我们必须跳出黑产模仿真人的各种数据参数维度,主动区分出黑产。


问题解决


目前,极验第四代验证码中的“异常标记”功能(captcha token,CT)能够通过前端 js 变化以及变换参数,检测出是否存在黑产破解了前端协议,是否需要重新调整验证的交互协议。只要是协议破解,必然会被极验的下一次更新所识别。

针对G客户遭遇的爬虫问题,极验通过协议破解检测以及参数动态更新,在爬虫逆向破解完成此前版本的验证协议后,于9月12日9点半开始更新新的验证协议,可以看到更新前后协议破解命中的变化。




此后,协议破解检测命中持续生效,即使爬虫再次破解,也可以随时更新参数来完成破解检测,客户的数据最终恢复了正常。


技术突破

除了帮助G客户解决爬虫问题以外,我们还将参数动态更新做成了一个相应的后台工具,能够帮助各类客户一出现问题,就能快速地响应解决。客户在日常运营中了解到的极验技术可能仅仅只是冰山一角,而我们在验证码背后真正的开发实力才是水面下更夯实的冰山。


在整个协议破解识别的过程中,极验做到了以下技术突破:


1)JS混淆:通过混淆js代码从而具有自我防御能力,将JavaScript代码转换为使用自动分析攻击、防止逆向工程的形式。


2)参数加密:前端参数进行了SHA256等复杂加密算法的加密,对轨迹和答案位置都进行了加密,根本无法对参数进行阅读,也无法知晓参数中传值的意义,不能通过参数的伪造进行破解。


3)参数混淆:极验还在前端参数中增加了部分混淆参数。有部分数据是真实采集的数据,有部分数据是蜜罐参数,破解者无法区分哪些是必须的参数,哪些是蜜罐参数。


4)协议更新:极验每日不定时更新协议,全网一键更新、秒级别生效。协议更新瞬间迅速标记黑产脚本请求,收集大量黑样本数据。


五、结语


数据信息永远具有滞后性。多数厂商区分黑产仍然是通过已有的数据库/黑白名单来识别出有问题的账户,但数据库往往都是过往的数据,对于最新的黑产,或者黑产更换设备、账号、IP后,便不能立即识别出来,所以依赖安全数据库并不能识别出全部的黑产,验证厂商长期以来都难以解决黑产账号漏封的问题。


而现在,通过协议破解检测,极验在行业内首次做到了对漏封的黑产也进行精准的识别处理。2022年,极验的CT“异常标记”功能正式上线,能通过前端参数的动态变化标记出黑产请求,为下一步的封禁处置提供有效的依据。截至目前,极验的CT“异常标记”功能已为服务客户标记出了810.74亿个黑产请求。



还是那句话,任何业务在运营一段时间之后都会面临黑产大量的破解,因为无论是环境还是行为,最终传回服务器的形式都是参数,黑产依旧可以通过破解正常校验的请求参数,来伪造真实用户。因此,部署验证码这个防御工具不可能是一劳永逸的。验证码和各种黑产会永远持续地进行博弈。


作为防守的一方,我们如何能在这场博弈中取胜?一是要足够的了解攻击方的技术;二是在知己知彼的基础上,比攻击方储备更多、更高效的防御手段。正如我们前面所提到的种种工具和技术,能帮助客户提供更多的防御方案,在防守时更早地发现,更快地反应。极验秉承着“为世所想,为世所用”的信念,并不避讳谈论破解,而是永远走在黑产前面,为了客户更好的体验去主动地和黑产抗衡。


极验专利墙


下一期,我们将继续介绍协议破解对抗的第二部分:Pow防暴力破解。协议破解追求的是"效率",黑产在协议破解过程中,为了完成大量的验证交互,就必须要完成大量的Pow计算,而Pow的计算的难度把握在极验手中。如果你对下一期也感兴趣,敬请关注我们~

Start your free trial
Over 320,000 websites and mobile apps worldwide are protected by GeeTest captcha