声明
本文章中所有内容仅供学习交流,相关链接做了脱敏处理,若有侵权,请联系我立即删除!
案例目标
验证码: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 加密,解密即可:
实际图片的大小与渲染的不一致,需要进行缩放,或者直接处理缺口距离也可以:
结果验证
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/38097.html