【黑产攻防道03】利用JS参数更新检测黑产的协议破解
任何业务在运营一段时间之后都会面临黑产大量的破解。验证码和各种爬虫的关系就像猫和老鼠一样, 会永远持续地进行博弈。极验根据十一年和黑产博弈对抗的经验,将黑产的破解方式分为三类:
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的计算的难度把握在极验手中。如果你对下一期也感兴趣,敬请关注我们~
相关文章:

【黑产攻防道03】利用JS参数更新检测黑产的协议破解
任何业务在运营一段时间之后都会面临黑产大量的破解。验证码和各种爬虫的关系就像猫和老鼠一样, 会永远持续地进行博弈。极验根据十一年和黑产博弈对抗的经验,将黑产的破解方式分为三类: 1.通过识别出验证码图片答案实现批量破解验证,即图片…...

什么是web3.0?
Web 3.0,也常被称为下一代互联网,代表着互联网的下一个重大演变。尽管关于Web 3.0的确切定义尚无共识,但它通常被认为是一种更分散、更开放且更智能的互联网。 以下是Web 3.0的一些主要特征和概念: 1. 去中心化 Web 3.0旨在减少…...

二、W5100S/W5500+RP2040树莓派Pico<DHCP>
文章目录 1 前言2 简介2 .1 什么是DHCP?2.2 为什么要使用DHCP?2.3 DHCP工作原理2.4 DHCP应用场景 3 WIZnet以太网芯片4 DHCP网络设置示例概述以及使用4.1 流程图4.2 准备工作核心4.3 连接方式4.4 主要代码概述4.5 结果演示 5 注意事项6 相关链接 1 前言 …...

【开源】基于SpringBoot的天然气工程业务管理系统的设计和实现
目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块三、使用角色3.1 施工人员3.2 管理员 四、数据库设计4.1 用户表4.2 分公司表4.3 角色表4.4 数据字典表4.5 工程项目表4.6 使用材料表4.7 使用材料领用表4.8 整体E-R图 五、系统展示六、核心代码6.1 查询工程项目6.2 工程物资…...

讯飞星火大模型V3.0 WebApi使用
讯飞星火大模型V3.0 WebApi使用 文档说明:星火认知大模型Web文档 | 讯飞开放平台文档中心 (xfyun.cn) 实现效果 初始化 首先构建一个基础脚手架项目 npm init vuelatest用到如下依赖 "dependencies": {"crypto-js": "^4.2.0",&q…...

拥有DOM力量的你究竟可以干什么
如果你希望访问 HTML 页面中的任何元素,那么您总是从访问 document 对象开始! 查找HTML元素 document.getElementById(id) 通过元素 id 来查找元素 <!DOCTYPE html> <html> <head><meta charset…...

GnuTLS recv error (-110): The TLS connection was non-properly terminated
ubuntu git下载提示 GnuTLS recv error (-110): The TLS connection was non-properly terminated解决方法 git config --global --unset http.https://github.com.proxy...

Notepad++安装插件和配置快捷键
Notepad是一款轻量级、开源的文件编辑工具,可以编辑、浏览文本文件、二进制文件、.cpp、.java、*.cs等文件。Notepad每隔1个月,就有一个新版本,其官网是: https://github.com/notepad-plus-plus/notepad-plus-plus。这里介绍其插件…...

iOS Autolayout 约束设置【顺序】的重要性!
0x00 顺序不同,结果不同 看图说话 1 代码是这样滴~ 设置好约束,让 4 个按钮,宽度均分~ 结果如上图 [_pastButton.topAnchor constraintEqualToAnchor:_textView.bottomAnchor constant:6].active YES;[_pastButton.leftAnchor constraintEq…...

Echarts渲染不报错但是没有内容
🔥博客主页: 破浪前进 🔖系列专栏: Vue、React、PHP ❤️感谢大家点赞👍收藏⭐评论✍️ 问题:在开发项目的时候使用了Echarts但是好端端的忽然就不渲染了 感觉很无语啊,毕竟好好的就不渲染了&am…...

数据结构 | 算法的时间复杂度和空间复杂度【详解】
数据结构 | 算法的时间复杂度和空间复杂度【详解】 1. 什么是数据结构? 数据结构(Data Structure)是计算机存储、组织数据的方式,指相互之间存在一种或多种特定关系的数据元素的集合。 2. 什么是算法? 算法(Algorithm):就是定义良好的计算过…...

高级篇之ENC编码器多机位帧同步配置详解
高级篇之ENC编码器多机位帧同步配置详解 一 帧同步方案多样性1. 配合vMIX导播的帧同步方案3. 配合硬件导播的帧同步方案3. 配合芯象导播的帧同步 二 帧同步方案1实现步骤1. 准备设备2. 搭建环境3 配置设备3.1 配置固定机位3.2 配置帧同步转发端3.3 配置vMIX 三 效果对比1 不开帧…...

matlab simulink 四旋翼跟拍无人机仿真
1、内容简介 略 7-可以交流、咨询、答疑 2、内容说明 四旋翼跟拍无人机仿真 四旋翼、无人机 需求分析 背景介绍 无人飞行机器人,是无人驾驶且具有一定智能的空中飞行器。这是一种融合了计算机技术、人工智能技术、传感器技术、自动控制技术、新型材料技术、导航…...

jenkins、ant、selenium、testng搭建自动化测试框架
如果在你的理解中自动化测试就是在eclipse里面讲webdriver的包引入,然后写一些测试脚本,这就是你所说的自动化测试,其实这个还不能算是真正的自动化测试,你见过每次需要运行的时候还需要打开eclipse然后去选择运行文件吗ÿ…...

【阅读和学习代码】VoxelNet
文章目录 将点特征 转换为 voxel 特征稀疏张量 到 稠密张量,反向索引参考博客 将点特征 转换为 voxel 特征 https://github.com/skyhehe123/VoxelNet-pytorch/blob/master/data/kitti.py 【Python】np.unique() 介绍与使用 self.T : # maxiumum numbe…...

【23种设计模式】接口隔离原则
个人主页:金鳞踏雨 个人简介:大家好,我是金鳞,一个初出茅庐的Java小白 目前状况:22届普通本科毕业生,几经波折了,现在任职于一家国内大型知名日化公司,从事Java开发工作 我的博客&am…...

【Python机器学习】零基础掌握PartialDependenceDisplay检验、检查
如何更好地理解模型对特定特征的依赖性?如何使用历史数据来预测明天股票市场的走势? 想象一下,作为一名数据分析师,面对海量的数据,如何准确地预测明天股票市场的走势?这是一个复杂且具有挑战性的问题。但别担心,有一种神奇的工具可以帮助解析模型对各种因素(特征)的…...

Jmeter的接口自动化测试
在去年实施了一年的三端(PC、无线M站、无线APP【Android、IOS】)后,今年7月份开始,我们开始进行接口自动化的实施,目前已完成了整个框架的搭建以及接口的持续测试集成。今天做个简单的分享。 在开始自动化投入前&#…...

windows c++获取开机启动项
#include <iostream> #include <Windows.h> #include <string> #define RUN_LOCATION "Software\\Microsoft\\Windows\\CurrentVersion\\Run" int main() { HKEY hKey; LONG result; // 打开注册表键 result = RegOpenKeyExA(HKEY_CU…...

【C++初阶】类和对象——构造函数析构函数拷贝构造函数
个人主页点击直达:小白不是程序媛 C系列专栏:C头疼记 目录 前言 类的6个默认成员函数 构造函数 概念 构造函数的特性 析构函数 概念 析构函数特性 拷贝构造函数 概念 拷贝构造函数特性 总结 前言 上篇文章我们对于C中的类有了初步的认识和…...

Java实现SQL分页
在日常开发需要对数据进行分页,配置如下 <!-- baomidou --><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.4.0</version></dependency> 在控…...

软件测试进阶篇----自动化测试脚本开发
自动化测试脚本开发 一、自动化测试用例开发 1、用例设计需要注意的点 2、设计一条测试用例 二、脚本开发过程中的技术 1、线性脚本开发 2、模块化脚本开发(封装线性代码到方法或者类中。在需要的地方进行调用) 3、关键字驱动开发:selen…...

rust std
目录 一,std基本数据结构 1,std::option 2,std::result 二,std容器 1,vector 三,std算法 1,排序 2,二分 (1)vector二分 (2)…...

SpringMVC(下)
1、拦截器: 1、拦截器的配置: SpringMVC中的拦截器用于拦截控制器方法的执行 SpringMVC中的拦截器需要实现HandlerInterceptor <!--配置拦截器--><mvc:interceptors><!--对所有的请求进行拦截--><!--<bean class"com.songzhishu.m…...

分布式操作系统的必要性及重要性
总有人在各个平台留言或者私信问LAXCUS分布式操作系统的各种问题,尤其是关于分布式操作系统的应用市场、价值、意义之类的问题。我们团队做LAXCUS分布式操作系统,也不是头脑凭空发热,是基于我们之前的大量产品设计、经验逐渐一步步做起来。当…...

【Javascript】定时器
目录 延迟执行 定时执行 清除定时任务 延迟执行 setTimeout(function(){}, 毫秒) console.log(1); console.log(2); console.log(3); setTimeout(function (){console.log(5) },5000) console.log(4);setTimeout(function (){ console.log(5) },5000) 设定了一个任务&…...

基于stm32的ADC读取烟雾报警器的数值
本文想要设计一个设计一个有stm32控制的烟雾报警系统。通过MQ-2烟雾报警器将获取模拟的数值传递给stm32的ADC外设并在串口助手上显示对应的电压值。烟雾报警器浓度越高,他的电压就越高,但是不会超过3.3V。设置一个电压临界值,当传输回来的电压…...

无需更换vue-cli 脚手架 uniapp-搭建项目-H5-低版本安卓IOS兼容问题(白屏)(接口请求异常)
✨求关注~ 💻博客:www.protaos.com I. 简介 A. UniApp项目概述 B. 白屏和接口请求异常问题的背景 II. 白屏问题 A. 问题描述 1、uniapp 打包H5内嵌入APP内、低版本手机系统访问白屏问题 B. 问题根本原因 1、低版本手机系统 自带的webview内核不支持ES6语…...

【IO面试题 四】、介绍一下Java的序列化与反序列化
文章底部有个人公众号:热爱技术的小郑。主要分享开发知识、学习资料、毕业设计指导等。有兴趣的可以关注一下。为何分享? 踩过的坑没必要让别人在再踩,自己复盘也能加深记忆。利己利人、所谓双赢。 面试官:介绍一下Java的序列化与…...

M1本地部署Stable Diffusion
下载安装 参考博客: 在Mac上部署Stable Diffusion(超详细,AI 绘画入门保姆级教程) 安装需要的依赖库 brew install cmake protobuf rust python3.10 git wget 可能中途会存在下载报错或者下载卡主的问题,需要切国内源 brew进行替换源: …...