【验证码逆向专栏】某 SDN 验证码逆向分析

news/2025/10/23 10:09:50/文章来源:https://www.cnblogs.com/ikdl/p/19159731

pV4CESx.png

声明

本文章中所有内容仅供学习交流使用,不用于其他任何目的,不提供完整代码,抓包内容、敏感网址、数据接口等均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关!

本文章未经许可禁止转载,禁止任何修改后二次传播,擅自使用本文讲解的技术而导致的任何意外,作者均不负责,若有侵权,请在公众号【K哥爬虫】联系作者立即删除!

前言

最近在逛某 SDN 的时候,突然触发了滑块验证码(应该是风控权重加高了),因为没有相关业务,还是第一次看到该站的验证码,正好,可以用来充实验证码逆向专栏。风控的验证码不好触发、调试,不过一般登录会上和风控一样的验证码,目前登录是文字点选验证码,风控是滑块验证码,算法上差别不大。本文将对登录触发的验证码进行逆向分析:

pV4CBhn.png

逆向目标

  • 目标:某 SDN 文字点选验证码
  • 网址:aHR0cHM6Ly9rZ3NwaWRlci5ibG9nLmNzZG4ubmV0

抓包分析

打开无痕浏览器,进入页面,点击右上角的登录,选择验证码登录,输入格式正确的手机号,获取验证码即会调用 /sendVerifyCode 接口,响应状态码为 521,触发了安全风控:

pV4lxeJ.png

该接口的请求参数有三个,code 为中国国际电话区号,mobile 即登录的手机号,type 对应验证类型,该接口会返回一个响应 cookie,waf_captcha_marker,可看作是当前验证码的标识,后续请求需要携带。

接着,出现两个 /convert 接口,第一个返回验证码类型,文字点选对应的 click_v2,第二个返回图片链接,经过了加密处理:

pV41uFI.png

这两个接口需要的请求参数差别不大,都经过了加密,后文将对其进行分析:

pV41MfP.png

按题目依次点击图片文字,触发 /verify 校验接口,响应返回的 result 参数为 success 即验证成功,反之失败:

pV411l8.png

验证通过,会响应返回 yd_captcha_token 参数,cookies 携带该参数与 waf_captcha_marker 参数,即可成功发送短信验证。该接口的请求参数和 convert 接口类似,只不过加密了坐标、轨迹等信息,接下来,对这些加密参数进行逆向分析。

逆向分析

先从第一个 convert 接口入手,从控制台可以看到,该接口是 xhr 类型的,下个 xhr 断点,重新触发验证码,即可断住:

pV4YnR1.png

此时还看不出什么关键信息,向上跟栈分析,到 app.js 文件中,该文件经过了 ob 混淆处理,一看就是藏了东西的:

pV4YdQP.png

该验证码的处理流程并不复杂,直接硬跟加密,或者使用 ast 技术解混淆都可以。当然,不论哪种方案,由于该 js 会随时间戳 v 动态变化,最好都本地固定一套,再替换调试。ast 解混淆后的 js 文件,已同步到知识星球中,感兴趣的小伙伴可以参考下。

接下来逐个分析下相关加密参数,第一个 convert 的加密参数,在 xhr 断点断住后,向上跟到第二个 app.js 的堆栈处即可找到:

pV4qpMd.png

由上图可知,除了 captcha_protect 参数外,其余参数都是经过 gzip 压缩字符串后得到的,标准算法,JavaScript 的话,直接用 pako 库即可复现:

const pako = require('pako');function base64Uint8ArrayToString(fileData) {var dataString = "";for (var i = 0; i < fileData.length; i++) {dataString += String.fromCharCode(fileData[i]);}dataString = decodeURIComponent(escape(dataString));return dataString;
}function gzip(text) {let compressedText = pako.gzip(text);// 将压缩后的字节数组转换为字符串return base64Uint8FromByteArray(compressedText);
}

搜索 _0x43706c["_bsc_cv"]["fpv"] 即可找到生成 fpv 参数的算法:

pV4qkIf.png

level、type、originalImage 是 gzip 的固定字符串,_0x43706c["_bsc_cv"]["wlocation"] 包含了些环境参数:

pV4XezD.png

captcha_protect 稍微复杂点,跟到 _0x43706c["captcha_protect"] 中去,如下图所示,控制流打乱了执行顺序:

pV4XQeA.png

还原后,执行顺序如下:

// 原始逻辑
_0x478615["end_time"] = new Date().getTime();  // case '1'
_0x478615["guid"] = window["_bsc_cv"]["guid"]();  // case '5'
var _0x29e761 = CryptoJS.MD5(_0x478615["name"] + '_' + _0x478615["fpv"]).toString();  // case '2'
var _0x36ae83 = window["rsaEncrypt"](_0x29e761);  // case '4'
var _0x6c0312 = window["aesEncryptKey"](_0x29e761, JSON.stringify(_0x478615));  // case '0'
return encodeURIComponent(window["gzip"](_0x36ae83 + "captcha_protect" + _0x6c0312));  // case '3'

时间戳、随机数、fpv 等,经过 MD5、RSA 以及 AES 算法加密后,再 gzip 压缩得到参数值,都是标准算法,其中 AES 加密流程如下:

// 原始逻辑
function originalLogic(_0x1f96f3, _0x3ebdd2) {// 1. 生成 MD5 哈希var _0x132fa1 = CryptoJS.MD5(_0x43706c["_bsc_cv"]["fpv"]).toString();// 2. 前 16 字节作为 AES 密钥var _0x2afe7e = CryptoJS.enc.Utf8.parse(_0x132fa1.substring(0, 16));// 3. 后 16 字节作为 AES IVvar _0x13d566 = CryptoJS.enc.Utf8.parse(_0x132fa1.substring(16));// 4. 执行加密var _0x20b3ba = _0x3ebdd2(_0x1f96f3, _0x2afe7e, _0x13d566);// 5. 返回结果return _0x20b3ba;
}

各加密调库、扣对应算法复现即可,也可以考虑用 python 还原。

后续接口相关参数的算法,都是类似的,无非是 gzip 的字符串或者入参有差异而已。获取到真实的图片链接后,下载时需要注意,保持 cookie 中的 waf_captcha_marker 值以及 ip 与之前的接口一致,否则会导致响应状态码为 521,无法成功下载图片。

有些参数值与之前接口的一致,验证接口多了个 body 参数,加密的坐标、轨迹以及 convert 接口返回的 randomKey 参数:

pV4XsYV.png

需要注意的是,verify 接口的 captcha_protect 中的 start_timeend_time 不能写成定值,否则一段时间后,会导致验证失败,响应如下:

{"time": 1758097027127,"message": "检测未通过,验证失败","ret": 0,"code": 521,"result": "block"
}

过了验证码之后,将获取到的 yd_captcha_token 参数添加到 cookies 中,即可成功发送短信验证,至此,整套流程分析就结束了。相关算法和解混淆后的 js 文件,会分享到知识星球中,仅供学习交流。

结果验证

pV4XblD.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/944010.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

高压电缆生产厂家口碑榜:基于技术实力、客户服务及市场反馈的专业评估

高压电缆作为电力传输的核心组件,其质量直接关系到电网安全、能效和长期稳定性。随着基础设施建设和新能源项目的快速发展,市场对高压电缆的需求持续增长,厂家之间的竞争也日益激烈。本文基于行业调研、客户反馈及产…

oracle long转日期 和日期转long时间戳

oracle long转日期 和日期转long时间戳SELECT TO_DATE(1970-01-01 08:00:00, YYYY-MM-DD HH24:mi:ss) + (TO_NUMBER(1761015597082) / (24 * 60 * 60 * 1000)) AS converted_date FROM dual; --date转long示例 select…

国产DevSecOps工具崛起:安全与效率的双重革命

国产DevSecOps工具崛起:安全与效率的双重革命 在数字化转型浪潮席卷各行各业的今天,软件开发的安全性问题日益凸显。随着《网络安全法》《数据安全法》等法规的密集出台,中国企业正面临前所未有的安全合规压力。这一…

2025 年最新外墙涂料厂家推荐排行榜:聚焦优质产品与实力企业,助力建筑涂装高效选品

引言 当前建筑涂料市场中,外墙涂料作为建筑外观装饰与防护的核心材料,需求持续攀升,但行业乱象也让选购者倍感困扰。部分产品耐候性差、易褪色开裂,环保不达标含高甲醛与 VOC,且市场信息不对称,缺乏权威指引,导…

2025年10月长白山亲子酒店排名榜:亲测十家安心入住

长假将至,不少父母把“带娃看雪”提上日程,长白山因粉雪早至、空气纯净、动植物丰富,成为东北亲子游首选。飞猪《2025冰雪游趋势报告》显示,长白山区域亲子酒店预订量同比增47%,其中带“儿童俱乐部、自然教育”标…

解决windows下启动tomcat乱码问题

解决windows下启动tomcat乱码问题如上图所示 解决方法: 1.打开Tomcat安装目录下的bin/catalina.bat文件,找到set JAVA_OPTS=这一行,注释掉,添加下面的配置 set JAVA_OPTS=%JAVA_OPTS% -Dfile.encoding=GBK -Dsun.j…

类组件(Classcomponent)和函数式组件 (Functionalcomponent)之间有何不同?

在 React 中,类组件 (Class Component) 和 函数式组件 (Functional Component) 都是用来定义 UI 的两种方式,但它们在语法、生命周期管理、状态处理等方面有显著区别。 定义方式类型 定义示例类组件 jsx<br>cl…

2025 年仿石漆厂家最新推荐品牌排行榜:聚焦真石漆水包砂等优质产品,助力采购方精准选品

引言 近年来,仿石漆凭借美观、耐用、环保等优势,在建筑装饰领域应用愈发广泛,但市场品牌繁杂、产品质量参差不齐的问题也愈发凸显。部分小品牌产品存在仿石效果失真、耐候性差、环保不达标等问题,不仅影响建筑外观…

D. Secret Passwords

题意:给定n个字符串s,如果两个字符串有任意的相同的字符,那么字符串是equivalent的,并且如果有ab, bc, cd。那么cd和ab也是equivalent的。现在要破解n个字符串的密码,并且n个字符串中只有一个是正确的密码,问最少…

Java EE初阶启程记02---认识线程 - 实践

Java EE初阶启程记02---认识线程 - 实践pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Mo…

2025年10月北京口腔医院排行:十强机构对比指南

“到底该去哪家?”——这是不少北京居民在牙齿突然疼痛、孩子乳牙松动或父母缺牙需要种植时,最先蹦出的疑问。北京口腔机构数量多、宣传杂,公立三甲难挂号,私立诊所又担心资质。2025年北京市卫健委发布的《口腔医疗…

springcloud中网关gateway总结

在 Spring Cloud 微服务架构中,网关(Gateway)是客户端与微服务集群之间的 "统一入口",负责处理跨服务的共性问题。以下从作用、实现原理、核心配置(含限流、鉴权详解)三方面展开说明。 一、网关的核心…

郑州短视频代运营公司口碑榜:TOP3企业权威推荐

在数字化营销浪潮中,短视频已成为企业品牌推广的核心渠道之一。郑州作为中原地区的重要经济中心,短视频代运营服务需求持续增长。据行业统计,2023年河南省短视频用户规模突破5000万,年均增长率超20%,代运营市场呈…

深入大模型-2-大模型微调之Windows10安装大语言模型Unsloth微调环境 - 教程

深入大模型-2-大模型微调之Windows10安装大语言模型Unsloth微调环境 - 教程pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-famil…

K.20

K.20K20ITU-T K.20建议书规定了安装在电信中心的电信设备的抗力要求和测试程序。本建议书所述的过电压或过电流是指包括发电厂上或附近发生雷击、相邻交流电源线或铁路系统造成短期导电、电源故障引发大地电位上升以及…

C#语法查缺补漏

C#语法补充 空条件运算符和空合并运算符var clientIp = context.HttpContext.Connection.RemoteIpAddress?.ToString() ?? "unknown";- 首先RemoteIpAddress允许为空 - 若这个表达式(context.HttpContext…

Docker 部署 Elasticsearch 全流程手册

Elasticsearch(简称 ES)是一款基于 Lucene 构建的分布式、高扩展、高实时的全文搜索引擎,也是 ELK(Elasticsearch + Logstash + Kibana)技术栈的核心组件,目前广泛应用于企业级数据检索与分析场景。在开始 Elast…

办公神器-好用的办公软件

整理分享几个好用的办公软件: 1、互联网资源下载软件:ndm 下载方式:edg浏览器下载下载地址:https://www.neatdownloadmanager.com/index.php/en/进行下载。 2、压缩工具:7-zip 下载方式:edg浏览器搜索:z-ziphtt…

基于TMS320F28034的全桥LLC电源控制

基于TMS320F28034的全桥LLC电源控制实现,包含400V→48V转换的稳定版方案一、核心参数配置 // 系统时钟配置 #define SYSCLK_FREQ 150e6 // 150MHz #define PWM_FREQ 100e3 // 100kHz开关频率 #define EPWM_CLKDI…

ORA-12154TNS-03505 案例分享2

ORA-12154&TNS-03505 案例分享22025-10-23 09:58 潇湘隐者 阅读(0) 评论(0) 收藏 举报前几天遇到了ORA-12154&TNS-03505这个错误, 因为对其数据库环境不了解, 远程登录过去检查的时候, 了解到一些大概情况…