【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 加密,解密即可:

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

结果验证

猜你喜欢

转载自blog.csdn.net/Yy_Rose/article/details/128981220