【验证码逆向专栏】某度滑块、点选、旋转验证码 v1、v2 逆向分析

news2024/11/16 19:52:36

00

声明

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

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

逆向目标

  • 目标:百度滑块验证码、点选验证码、旋转验证码,v1、v2 逆向分析
  • v1 旋转验证码:
aHR0cHM6Ly93YXBwYXNzLmJhaWR1LmNvbS9zdGF0aWMvY2FwdGNoYS90dXhpbmcuaHRtbD9haz0zM2M0ODg4NGI3ZGY4M2Q0MjMwZTA3Y2JjZDBkMDdmZCZiYWNrdXJsPWh0dHBzJTNBJTJGJTJGYWlxaWNoYS5iYWlkdS5jb20mdGltZXN0YW1wPTE2MzE0MzQ0MjUmc2lnbmF0dXJlPWM2ODRhODJiNzk4MjAyOTg3NWJmZDhlMGE2NjBiNzdm
  • v2 旋转验证码:
aHR0cHM6Ly93YXBwYXNzLmJhaWR1LmNvbS9zdGF0aWMvY2FwdGNoYS90dXhpbmcuaHRtbD8mYWs9YzI3YmJjODlhZmNhMDQ2MzY1MGFjOWJkZTY4ZWJlMDY=
  • v2 滑块验证码:
aHR0cHM6Ly93YXBwYXNzLmJhaWR1LmNvbS9zdGF0aWMvY2FwdGNoYS90dXhpbmcuaHRtbD8mYW1wO2FrPWMyN2JiYzg5YWZjYTA0NjM2NTBhYzliZGU2OGViZTA2
  • v2 点选验证码:
aHR0cHM6Ly93YXBwYXNzLmJhaWR1LmNvbS92Ni9nZXRQYXNz

PS:v1、v2 是作者自己为了区分而命名的版本号,主要依据是核心 JS 文件分为 mkd.js 和 mkd_v2.js 两个版本,如下图所示:

01

此外,在界面上也有所区别,v2 版本的旋转、滑块图片有很明显的阴影、线条干扰,如下图所示:

02

上面给的地址中,点选验证码的地址有时候是点选,有时候会变成旋转,估计是异常等级不同导致的,此外,传闻还有一种无感验证,不过作者到处找也没找到个地址,估计逻辑都是差不多的,无感验证如下图所示:

03

抓包分析

以下以 v1 旋转验证码为例(v2 接口名称不一样,但逻辑是一样的),第一次 viewlog 接口,请求的 ak 是固定值,当然不同场景不同网站是不一样的,callback 回调值,_ 时间戳,返回值 astk 都是后面会用到的。

04

05

然后是一个 getstyle 接口,其中的 tk 就是前面 viewlog 接口返回的,返回值里 backstr 后续参数加密会用到,img 就是旋转图片地址,info 是一些版权信息。

06

07

旋转验证码开始验证,此时第二次出现 viewlog 接口,astk 参数是第一次 viewlog 返回的,fs 参数需要我们逆向,包含了旋转角度等信息,如果旋转角度正确且参数没问题,则返回值里的 op 为 1,另外返回的 dstk 后续还会用到。

08

09

上一步验证走完后,并不意味着通过验证了,后续还会有一个 viewlog/c 的接口需要进一步验证,其中的 tkds 参数就是上一步返回的,如果验证失败,返回值 code 为 1,验证成功,code 则为 0。

10

11

12

逆向分析 fs

接下来分析主要加密参数 fs,跟栈到 mkd.js:

13

14

可以看到 o 就是 fs,而 o 又是 r.rzData 经过加密后得到的,输出一下 r.rzData,结构如下图所示:

15

重要参数:

  • ac_c:一看就知道和旋转的角度有关;
  • backstrgetstyle 接口返回的;
  • cl:x,y 坐标以及时间戳,量一下就知道这个坐标是鼠标点击下面那个滑动条按钮的时候的坐标;
  • mv:鼠标轨迹,鼠标动一下就记录一下坐标和时间戳;
  • cr:屏幕长宽高等信息;
  • 其他值都是空或者0。

实际测试,clmv 都不校验,写死或者置空都行,当然想要自己伪造一下也是可以的,量一下滑动按钮在屏幕中的位置,cl 根据这个位置随机生成就行了。重点看看 ac_c,直接搜索即可定位:

16

17

可以看到这个值的计算方法为 parseFloat(o / a).toFixed(2)a 是定值 212,实际上就是滑动条能够滑动的最大长度,o 是滑动的距离,如果我们识别出来的是旋转角度 angle,则 ac_c 计算方法如下:

var o = angle * 212 / 360
var ac_c = parseFloat(o / 212).toFixed(2)

// 也可以直接写成:
var ac_c = parseFloat(angle / 360).toFixed(2)

r.rzData 搞定后,就只有个 r.encrypt() 方法了,直接跟进去就是我们熟悉的 AES 算法,其中 iv 是 viewlog 接口返回的 as 值加上一个定值 appsapi0,其他就不用多说了。至此加密参数就搞完了,还是非常简单的。

18

19

旋转角度识别

这里推荐一个国外大佬的 RotNet 项目,可以用于预测图像的旋转角度以纠正其方向,还有基于此项目开发的,Nanda 大佬的 RotateCaptchaBreak、另一个大佬的 rotate-captcha-crack 等,链接如下:

  • https://github.com/d4nst/RotNet
  • https://github.com/chencchen/RotateCaptchaBreak
  • https://github.com/Starry-OvO/rotate-captcha-crack

深度学习大佬可以基于这些项目进一步训练,像我这种对这方面一窍不通的当然是选择打码平台了,云码打码还不错,只不过官网只放出了 v1 版本没有阴影干扰的,找他们客服可以拿到 v2 版本有阴影干扰的类型,这里就不多说了,免得被认为是打广告了哈哈哈。

20

v2 版本分析

v2 版本和 v1 版本基本上差不多,区别在于 rzData 的结构不太一样,ac_c 的计算方法不一样,以及 AES 的 IV 不一样,先看 AES 的 IV,v2 版本是 as 值加上固定值 appsapi2

21

然后再看看 rzDatacommon 字段下基本上就是 v1 的 rzData 的格式,captchalist 下,至少有 spin-0(旋转)、``puzzle-0(滑块)、click-0(点选)三种,ac_c` 依旧是旋转角度占比、滑动占比以及点选坐标信息,其他的依旧是写死或者置空就行。

22

然后就是 ac_c 的计算方法了,首先是旋转验证码,直接搜索 ac_c

23

往上跟栈,有个 percent 的地方,一个三目表达式,e 是固定值 290,e - 52 = 238,238 也就是滑动条能够滑动的最大长度:

24

如果我们识别出来的是旋转角度 angle,则 ac_c 计算方法如下:

var distance = angle * 238 / 360
var ac_c = Number((distance / (290 - 52)).toFixed(2))

// 也可以直接写成:
var ac_c = Number((angle / 360).toFixed(2))

而对于滑块验证码就有所不同,同样是这个地方的三目表达式,但是要走后面的逻辑:

25

如果我们识别出来的是滑动距离 distance,则滑块 ac_c 的计算方法如下:

var ac_c = Number((distance / 290).toFixed(2))

同样对于点选验证码来说,也不一样,ac_c 的值是点击的 xy 坐标以及时间戳:

26

其他问题

前面我们说了百度的验证应该有两次,对于第二次验证,也就是 v1 的 viewlog/c 接口,v2 的 cap/c 接口,即便你第一次校验通过了,这个 c 接口校验也有可能不通过,出现这种情况的原因是通过的时间太短了,随机 time.sleep 1-3 秒即可,如果时间太短,c 接口可能会报以下验证错误:

{'code': 1, 'isRectified': False, 'msg': 'Verification Failed'}

还有一种情况就是提示存在安全风险,请再次验证,出现这种情况你会发现去浏览器手动滑也是一样的,所以在本地加个再次验证的逻辑就行了,一般来说第二次验证就能通过。

{'code': 0, 'msg': 'success', 'data': {'f': {'feedback': 'https://www.baidu.com/passport/ufosubmit.html', 'reason': '存在安全风险,请再次验证'}}}

然后就是请求 header 里没有 Referer 或者 Referer 不正确的话,会报错:

// v1 没有 Referer
{'code': 1, 'msg': 'Unregistered Host'}
// v1 Referer 不正确
{'code': 1, 'msg': 'Invalid Request', 'data': []}
// v2 没有 Referer 或者 Referer 不正确
{'code': 100600, 'msg': 'Unauthorized Host'}

还有一个小技巧,如果你想自己验证一下旋转的角度对不对,怎么去测量这个角度呢?我们可以借助一些做图软件,简单点儿的比如美图秀秀,新建一个画布,然后直接将验证码图片拖进去,就可以自由旋转了,旋转的时候软件会自动标注出旋转的角度,如下图所示:

27

结果验证

28

29

30

31

爬虫工具站

K哥新上线了一个爬虫工具站,欢迎测试:K哥爬虫工具站

!!!粉丝回馈!!!

为庆祝K哥爬虫公众号原创内容破百,粉丝数过万,特举办粉丝回馈活动!

感谢快代理对本次活动的大力支持!

活动规则

关注K哥爬虫公众号

于本文评论区发表评论,摇号抽出幸运粉丝

禁止重复评论

活动奖品

一等奖: 快代理包月套餐 + 知识星球 + K哥爬虫定制马克杯 (1名)

二等奖: 快代理包周套餐 + 知识星球 + K哥爬虫定制马克杯 (3名)

三等奖: K哥爬虫定制马克杯 (5名)

四等奖: 现金红包 6.6 (10名)

活动时间

活动开始时间:2023年7月7日

活动截止时间:2023年7月14日

开奖时间:2023年7月17日

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

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

相关文章

SSL密钥算法检测工具-sslciphercheck-SSL/TLS Suffers ‘Bar Mitzvah Attack’漏洞

SSL密钥算法检测工具-sslciphercheck-SSL/TLS Suffers ‘Bar Mitzvah Attack’漏洞 文章目录 sslciphercheck漏洞:SSL/TLS Suffers ‘Bar Mitzvah Attack’漏洞漏洞描述漏洞检测修复建议 sslciphercheck 下载:https://github.com/woanware/woanware.git…

Ubuntu vim 以十六进制的形式显示文件内容

Vim的介绍 Vim(Vi IMproved)是一款开源的文本编辑器,是 Unix 系统中经典的 vi 编辑器的改进版本。它具有强大的功能和高度可定制性,被广泛应用于程序开发、系统管理和文本编辑等领域。 以下是 Vim 的一些主要特点和功能&#xf…

CRC Principle and Implementation Method(Java C)

CRC原理和程序实现方法1_哔哩哔哩_bilibili 其实原理很简单 但是我想了两个小时。。 收获的是原来一些复杂的运算都可以通过位运算来实现。 实现思路 public class CRC16Calculator {public static String CRC16(byte[] bytes) {int CRC 0x0000ffff;int POLYNOMIAL 0x0000a…

【复习3-5天的内容】【我们一起60天准备考研算法面试(大全)-第七天 7/60】

专注 效率 记忆 预习 笔记 复习 做题 欢迎观看我的博客,如有问题交流,欢迎评论区留言,一定尽快回复!(大家可以去看我的专栏,是所有文章的目录)   文章字体风格: 红色文字表示&#…

Ubuntu Linux系统下创建Git项目并push到远程Github

首先在本地创建git仓库 jasminelhl:~/prj$ mkdir Github-test jasminelhl:~/prj$ cd Github-test jasminelhl:~/prj/Github-test$ git init 提示:使用 master 作为初始分支的名称。这个默认分支名称可能会更改。要在新仓库中 提示:配置使用初始分支名&a…

RabbitMQ的可视化管理页面简介

模块 描述 Overview 概览 Connections 查看连接情况 Channels 信道(通过)情况 Exchanges 交换机(路由)情况,默认四类七个 Queues 消息队列情况 Admin …

高并发架构实战:从需求分析到系统设计

很多软件工程师的职业规划是成为架构师,但是要成为架构师很多时候要求先有架构设计经验,而不做架构师又怎么会有架构设计经验呢?那么要如何获得架构设计经验呢? 一方面可以通过工作来学习,观察所在团队的架构师是如何…

网络安全工程师工作内容具体是什么?

在知乎看到一个帖子:网络安全工程师或者网络安全研究员的工作内容具体是什么?或者说他们的一天具体是怎么度过的,是否和程序员一样编码做项目? Neeao的回复: 只在甲方互联网公司呆过,简单说下甲方的情况。…

“千模千测”——针对大语言模型认知能力的高效测试方法

©PaperWeekly 原创 作者 | 庄严、宁雨亭 单位 | 中国科学技术大学BASE课题组 论文标题: Efficiently Measuring the Cognitive Ability of LLMs: An Adaptive Testing Perspective 作者: Yan Zhuang, Qi Liu, Yuting Ning, Weizhe Huang, Rui Lv, …

Docker 安装Nginx

查看Nginx镜像并拉取镜像: [rootlocalhost nginx]# docker search nginx NAME DESCRIPTION STARS OFFICIAL AUTOMATED nginx …

使用Mybatis添加记录错误

使用Mybatis添加记录错误:Error updating database. Cause: com.mysql.cj.jdbc.exceptions.MysqlDataTruncation: Data truncation: Out of range value for column ‘id’ at row 1 分析:添加记录的id值超出范围,查看JavaBean中的ID&#…

00-C++-ccache使用

ccache使用 前言ccache是什么ccache使用 前言 在编译大型C项目代码时编译时间比较长,那么可以使用ccache来加速代码的编译,一起来学习吧。 ccache是什么 ccache是一个编译器缓存。它通过缓存以前编译的结果并检测何时再次进行相同的编译来加快重新编译…

201天,太平洋保险核心系统迁至国产数据库OceanBase稳定运行

7月7日,2023全球数字经济大会上,国内首个全险种核心迁移至国产数据库的系统正式亮相。 因支撑未来海量并发、海量数据业务发展需求,太平洋保险(集团)股份有限公司(以下称“太平洋保险”)与Ocea…

使用OpenCV的viz模块创建和控制一个3D可视化窗口

#include <opencv2/viz.hpp> #include <iostream>using namespace cv; using namespace std;int main() {

神经网络解决预测问题(以共享单车预测为例)

背景:大约从2015年起,共享单车席卷了大部分城市。共享单车在给人们带来便利的同时,也存在一些问题:单车的分布很不均匀。比如在早高峰的时候,一些地铁口往往聚集着大量的单车,而到了晚高峰却很难找到一辆单车了。那么如何解决共享单车分布不均匀的问题呢?目前,共享单车…

DevOps系列文章 之 SnakeYAML解析与序列化YAML

1、简述 如何使用SnakeYAML库将YAML文档转换为Java对象&#xff0c;以及JAVA对象如何序列化为YAML文档。 在DevOps平台系统中是基础的能力支持&#xff0c;不管是spring boot 的配置还是K8S 资源清单yaml 2、项目设置 要在项目中使用SnakeYAML&#xff0c;需要添加Maven依赖…

基于go-zero的api服务刨析并对比与gin的区别

zero路由与gin的区别 官网go-zero go-zero是一个集成了各种工程实践的微服务框架&#xff0c;集多种功能于一体&#xff0c;如服务主要的API服务&#xff0c;RPC服务等。除了构建微服务工程外&#xff0c;zero也是一款性能优良的web框架&#xff0c;也可以构建单体web应用。 …

并行计算框架Polars、Dask的数据处理性能对比

在Pandas 2.0发布以后&#xff0c;我们发布过一些评测的文章&#xff0c;这次我们看看&#xff0c;除了Pandas以外&#xff0c;常用的两个都是为了大数据处理的并行数据框架的对比测试。 本文我们使用两个类似的脚本来执行提取、转换和加载(ETL)过程。 测试内容 这两个脚本主…

【Linux】-Linux部署Javaweb项目

作者&#xff1a;学Java的冬瓜 博客主页&#xff1a;☀冬瓜的主页&#x1f319; 专栏&#xff1a;【Linux】 分享: 屋檐如悬崖 风铃如沧海 我等燕归来 时间被安排 演一场意外 你悄然走开 故事在城外 浓雾散不开 看不清对白 你听不出来 风声不存在 是我在感慨 梦想来是谁在窗台 …

【服务器】Python一行命令搭建HTTP服务器并外网访问 - 内网穿透

文章目录 1.前言2.本地http服务器搭建2.1.Python的安装和设置2.2.Python服务器设置和测试 3.cpolar的安装和注册3.1 Cpolar云端设置3.2 Cpolar本地设置 4.公网访问测试5.结语 转载自cpolar极点云文章&#xff1a;【Python】快速简单搭建HTTP服务器并公网访问「cpolar内网穿透」…