声明
本文章中所有内容仅供学习交流,相关链接做了脱敏处理,若有侵权,请联系我立即删除!
案例目标
验证码:aHR0cHM6Ly93d3cuaXNodW1laS5jb20vbmV3L3Byb2R1Y3QvdHcvY29kZQ==
以上均做了脱敏处理,Base64 编码及解码方式:
import base64
# 编码
# result = base64.b64encode('待编码字符串'.encode('utf-8'))
# 解码
result = base64.b64decode('待解码字符串'.encode('utf-8'))
print(result)
案例分析
抓包
register 接口获取图片链接,请求参数中的 captchaUuid、organization 是动态变化的,需要扣出来:
响应返回滑块和背景图片的 url、rid 等参数的值:
滑动滑块后,抓包到 fverify 接口,请求参数中红框框出来的经过魔改的 DES 加密得到的,变量名即 key 值每周更新,需要通过 AST 匹配出来,rid 是 register 接口返回的:
通过riskLevel 的值即位 PASS,未通过则为 REJECT:
逆向分析
从 fverify 中跟栈进去:
向上跟栈到 _0x37a3a7 中,可以看到,此时那些加密参数的值已经生成了:
接着向上跟栈,np、id、zp、pf 为定值,加密方法皆为 this['getEncryptContent']:
跟进去,case 1 为检测点,如果格式化或者用 AST 解混淆后替换了 JS 则会被赋值为 1679801607548.209ishumei.com:
case 8 为 DES 加密,不是标准的,需要将算法扣出来,case 7 为 base64加密,也就是 DES 加密后再经过 base64 加密得到的结果:
其他的参数加密方式也都一样,传的第二个参数为 key 值,变量名即 key 值每周变化:
ru 为缺口距离,图片存在缩放,ep 为轨迹,ug 为滑动时间,其他的就是图片比例、language 等等:
captchaUuid: