当前位置: 首页 > news >正文

【JavaScript 逆向】安居客滑块逆向分析

声明

本文章中所有内容仅供学习交流,相关链接做了脱敏处理,若有侵权,请联系我立即删除!

案例目标

验证码:aHR0cHM6Ly93d3cuYW5qdWtlLmNvbS9jYXB0Y2hhLXZlcmlmeS8/Y2FsbGJhY2s9c2hpZWxkJmZyb209YW50aXNwYW0=

以上均做了脱敏处理,Base64 编码及解码方式:

import base64
# 编码
# result = base64.b64encode('待编码字符串'.encode('utf-8'))
# 解码
result = base64.b64decode('待解码字符串'.encode('utf-8'))
print(result)

案例分析

抓包

进入网页后,F12 打开开发者人员工具,进行抓包,getInfoTp 接口响应返回 info 和 responseId:

  • info:AES 加密,解密后为图片 url 地址(背景图、滑块图)及实际渲染宽度等相关信息,基本样式如下:

{"level":310,"isimgUrls":1,"bgImgUrl":"https://wos3.58cdn.com.cn/HimeDcBazHkN/captchaimg/301e8298-af09-4198-882c-1399a66b0c23.png","width":"280","tip":"请点击并将滑块拖动到指定位置","puzzleImgUrl":"https://wos3.58cdn.com.cn/HimeDcBazHkN/captchaimg/2c2ecb8f-8678-425b-8354-544013e498e2.png","type":"1"}
  • responseId:checkInfoTp 接口(校验验证是否通过)的请求参数

getInfoTp 接口请求参数如下:

  • sessionId:网页源代码中获取

  • dInfo:浏览器 user-agent、location.href、sessionId 等经过 AES 加密得到

滑动滑块后,会抓包到 checkInfoTp 接口,校验滑块是否通过,失败则返回:

checkInfoTp 接口的请求参数:

  • sessionId:网页源代码中获取

  • responseId:getInfoTp 接口响应返回

  • dInfo:浏览器 user-agent、location.href、sessionId 等经过 AES 加密得到

  • data:缺口距离、轨迹等经过 AES 加密得到

参数逆向

sessionId

ctrl + f 局部搜索 sessionId,在网页源代码中,通过正则匹配出来即可:

dInfo

全局搜索 dInfo,就一个 js 中包含,跟进到 isd_captcha_v20210125173727.js 中,格式化后再局部搜索 dInfo,有四个结果,逐个打下断点,滑动滑块,在第 574 行断住,控制台打印各部分内容:

(0, _taN)() 为定值,包含浏览器 user-agent、location.href 等,_Lnn 定义在第 571 行,为 sessionId,_0x90o[67] 打印结果为 AESEncrypt,可以推测为 AES 加密,跟进到 _fSL[_0x90o[2]][_0x90o[67]] 中,在第 1181 行打下断点,可以看到初始向量 iv(sessionId)、加密模式 mode(CBC)以及填充方式 padding:

跟到 _GrF 的 pad 中即可看到填充方式,为 Pkcs7,至此确定为 AES 加密,引库或者扣出算法都可:

  • Block Cipher:第 8433行 _0x90o[491] 为 BlockCipher,块加密,又被称为分组加密或分块加密,是对称加密的一种常见形式,如 DES、AES,基本思路是将明文分成多个等长的块( block ),然后用相同的一个密钥,对每个块进行加密,得到密文块

  • CBC:Cipher Block Chaining(密码块链接模式),是一种循环模式,前一个分组的密文和当前分组的明文异或操作后再加密,这样做的目的是增强破解难度

  • PKCS7:在填充时首先获取需要填充的字节长度 = 块长度 - (数据长度 % 块长度), 在填充字节序列中所有字节填充为需要填充的字节长度值

data

data 定义在 dInfo 的下面,为 _5DD 的值:

向上跟栈到 slide.e26ac29666e3ea4e6cbd.js 文件的第 1085 行,即 data 参数的生成位置:

_ctu[_0x9pl[7]][_0x9pl[247]] 跟进去是与 dInfo 一样的 AES 加密,_Ugo 包含缺口距离、滑块轨迹及 p[0,0],也就是 sessionId 与 _Ugo 经过 AES 加密得到的 data,_Ugo 定义在第 1033 行:

轨迹由 x、y 及时间间隔组成,依据此及格式构造轨迹算法,缺口可通过 opencv、ddddocr 或者打码平台识别:

info

info 包含图片相关信息,安居客不同模块滑块图片的 url 拼接方式不一样,本例的 url 样式为:

a37ff22c-3b96-4bd2-9dc8-9d24e42f0665.png

而在 aHR0cHM6Ly9hcGkuYW5qdWtlLmNvbS93ZWIvZ2VuZXJhbC9jYXB0Y2hhTmV3Lmh0bWw= 中,图片 url 样式为:

# 背景图片
captcha_img?rid=f3cf84ac3eff4d63a3314bcf8be1851e&it=_big
# 滑块图片
captcha_img?rid=f3cf84ac3eff4d63a3314bcf8be1851e&it=_puzzle

这种拼接方式获取图片就相对容易了,rid 即 responseId,而本例需要解密 info 才能获取到图片相关信息,跟栈到 _jzC 即 info 的值:

也是 AES 加密,解密即可:

实际图片的大小与渲染的不一致,需要进行缩放,或者直接处理缺口距离也可以:

结果验证

http://www.lryc.cn/news/3369.html

相关文章:

  • 【STM32】【HAL库】遥控关灯1主机
  • Java 初始化块
  • 超详细讲解长度受限制的字符串函数(保姆级教程!!!)
  • 【c#】c#常用小技巧方法整理(4)——cmd命令提示符,c#调用cmd
  • 在项目中遇到的关于form表单的问题
  • 德国奔驰、博世和保时捷的员工年薪有多少?
  • Mybatis与微服务注册
  • JAVA练习47-合并两个有序数组
  • 右键菜单管理 - Win系统
  • 背包问题求方案数、具体方案
  • 电商导购CPS,淘宝联盟如何跟单实现用户和订单绑定
  • 【Shell1】shell语法,ssh/build/scp/upgrade,环境变量,自动升级bmc,bmc_wtd,
  • 刷题记录:牛客NC208250牛牛的最美味和最不美味的零食
  • 微搭低代码从入门到精通08-轮播容器
  • 分类预测 | MATLAB实现SSA-CNN麻雀算法优化卷积神经网络多特征分类预测
  • 华为10年经验测试工程师,整理出来的python自动化测试实战
  • OpenCV杂谈 - 如何导出图像到内存中其他结构
  • Session与Cookie的区别(四)
  • Linux 文件锁 - fcntl
  • CellularAutomata元胞向量机-2-初等元胞自动机MATLAB代码分享
  • OpenStack云平台搭建(6) | 部署Neutron
  • Lesson 05.Configuring the Oracle Network Environment
  • 理论五:接口vs抽象类的区别,如何用普通的类模拟抽象类和接口
  • 【Hello Linux】 Linux的权限以及Shell原理
  • 【STM32】【HAL库】遥控关灯2 分机
  • 代码随想录算法训练营第27天|● 93.复原IP地址 ● 78.子集 ● 90.子集II
  • Unity UI合批的问题
  • MWORKS--系统建模与仿真
  • PC端开发GUI
  • 解读手机拍照的各个参数(拍照时,上面会有6个符号)