文章目录

    • 概要
    • 整体架构流程
    • 技术名词解释
    • 小结

概要

提示:仅供学习,不得用做商业交易,如有侵权请及时联系

逆向:x程滑块、点选验证码+登录+phantom-token

URL:aHR0cHM6Ly9hY2NvdW50cy5jdHJpcC5jb20vaDVMb2dpbi9sb2dpbl9jdHJpcD9zaWJsaW5nPVQ=

接口:aHR0cHM6Ly9pYy5jdHJpcC5jb20vY2FwdGNoYS92NC9yaXNrX2luc3BlY3Q=

一、滑块
在这里插入图片描述
二、点选
在这里插入图片描述

整体架构流程

提示:获取滑块图片信息接口-逆向参数-验证滑块-风控-出现二次验证点选-验证点选

1、验证码:携程v4,获取滑块图片接口-captcha/v4/risk_inspect

在这里插入图片描述
直接打开堆栈,在加密的地方进行断点,这里直接展示
在这里插入图片描述

这里r = dimensions;_0x311148_(“0x72”) = '{“rt”:“fp=BAD79A-C7B9F1-28AE3E&vid=1741310313314.d34dAGplAZnm&pageId=153001&r=set_cookie_success&ip=14.216.139.115&rg=undefined&kpData=0_0_0&kpControl=0_0_0-0_0_0&kpEmp=0_0_0_0_0_0_0_0_0_0-0_0_0_0_0_0_0_0_0_0-0_0_0_0_0_0_0_0_0_0&screen=1536x864&tz=+8&blang=zh-CN&oslang=zh-CN&ua=Mozilla%2F5.0%20(Windows%20NT%2010.0%3B%20JiSu)%20AppleWebKit%2F537.36%20(KHTML%2C%20like%20Gecko)%20Chrome%2F118.3.1.7%20Safari%2F537.36&d=xxx.com&v=25&kpg=0_4_0_0_13662_13_4_0_0_0&adblock=F&cck=T”,“ua”:“Mozilla/5.0 (Windows NT 10.0; JiSu) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.3.1.7 Safari/537.36”,“p”:“pc”,“fp”:“BAD79A-C7B9F1-28AE3E”,“vid”:“1741310313314.d34dAGplAZnm”,“sfp”:undefined,“identify”:“aBAD79A-C7B9F1-28AE3E”,“svid”:undefined,“guid”:“09031053217969500223”,“h5_duid”:null,“pc_duid”:null,“hb_uid”:null,“pc_uid”:null,“h5_uid”:null,“infosec_openid”:null,“device_id”:“824c80bc7d9f0ee6eb23287ae62996b8”,“client_id”:“NCsRIqkEaOup1BOYcp0PQ6COuJxUpfs2”,“pid”:“8904266218468852”,“sid”:“UYgjreThrBcGTHaI”,“login_uid”:“0828121099”,“client_type”:“PC”,“site”:{“type”:“PC”,“url”:“https://xxx.com/h5Login/login_ctrip?sibling=T”,“ref”:"",“title”:“x程旅行-登录”,“keywords”:""},“device”:{“width”:1536,“height”:864,“os”:"",“pixelRatio”:1.25,“did”:""},“user”:{“tid”:"",“uid”:"",“vid”:""}}'进行加密得到

在这里插入图片描述

很明显这里是Aes加密,ECB模式,key和iv贴上:

def encrypt_aes_hex_iv(plaintext):
    # 将十六进制格式的密钥和初始化向量转换为字节串
    key = binascii.unhexlify('8f235bc1cac17a46530c616ff234be78')
    iv = binascii.unhexlify('69783956775867344e5853626b645431')

    # 创建AES加密对象,使用CBC模式
    cipher = AES.new(key, AES.MODE_CBC, iv)

    # 对明文进行填充(因为AES加密要求数据长度是块大小的整数倍)
    padded_plaintext = pad(plaintext.encode('utf-8'), AES.block_size)

    # 进行加密
    ciphertext = cipher.encrypt(padded_plaintext)

    # 将加密后的字节串转换为Base64编码的字符串
    return binascii.b2a_base64(ciphertext).decode('utf-8')

然后进行分析extend_param = _0x342058(0x311148.stringify(a), 0);a = {
resolution_width: M[
(“0xa5”)],
resolution_height: M.scrH,
language: P
},这里直接可以看出是浏览器的宽高了,然后进行aes加密,所以可以固定死,当然了也可以自己修改;

最后就是分析我们的sign值:
在这里插入图片描述

在这里插入图片描述

观察发现它是其他body参数拼接而成,然后进行加密的,我们再看需要返回的值,哪些需要用到:

在这里插入图片描述
这里我们发现背景和滑块图片是base64的,所以我们解码:

jigsaw_image = base64.urlsafe_b64decode(response['result']['risk_info']['process_value']['jigsaw_image'])
processed_image = base64.urlsafe_b64decode(response['result']['risk_info']['process_value']['processed_image'])

识别滑块缺口:

import cv2,numpy as np
# 获取滑块距离
def identify_gap(bg, tp):
    """
    bg: 背景图片
    tp: 缺口图片
    out: 输出图片
    """
    # 读取背景图片和缺口图片
    bg_img = cv2.imdecode(np.frombuffer(bg, np.uint8), cv2.IMREAD_GRAYSCALE)
    tp_img = cv2.imdecode(np.frombuffer(tp, np.uint8), cv2.IMREAD_GRAYSCALE)  # 缺口图片
    yy = []
    xx = []
    for y in range(tp_img.shape[0]):
        for x in range(tp_img.shape[1]):
            r = tp_img[y, x]
            if r < 200:
                yy.append(y)
                xx.append(x)
    tp_img = tp_img[min(yy):max(yy), min(xx):max(xx)]
    # 识别图片边缘
    bg_edge = cv2.Canny(bg_img, 100, 200)
    tp_edge = cv2.Canny(tp_img, 100, 200)
    # 转换图片格式
    bg_pic = cv2.cvtColor(bg_edge, cv2.COLOR_GRAY2RGB)
    tp_pic = cv2.cvtColor(tp_edge, cv2.COLOR_GRAY2RGB)
    # 缺口匹配
    res = cv2.matchTemplate(bg_pic, tp_pic, cv2.TM_CCOEFF_NORMED)
    min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(res)  # 寻找最优匹配
    # # 绘制方框
    th, tw = tp_pic.shape[:2]
    tl = max_loc  # 左上角点的坐标
    br = (tl[0] + tw, tl[1] + th)  # 右下角点的坐标
    cv2.rectangle(bg_img, tl, br, (0, 0, 255), 2)  # 绘制矩形
    cv2.imwrite('distinguish.jpg', bg_img)  # 保存在本地
    # 返回缺口的X坐标
    return max_loc[0]

接下来就是分析验证接口:captcha/v4/verify_jigsaw,先观察参数

在这里插入图片描述
这里还是一样堆栈断点:
在这里插入图片描述
在这里插入图片描述

这里直接全部拿下来_0xb24c2dx(“0x128”)就行,它是不校验轨迹的,直接将滑动距离替换一下即可

在这里插入图片描述

同样还是AES加密,这里说一下,怎样才算验证成功呢

在这里插入图片描述

如果返回NONE则表示验证成功,然后拿到token就可以了,返回JIGSAW表示验证失败,返回ICON表示验证成功,但是出现二次验证

在这里插入图片描述

继续分析当出现二次验证,点选验证码ICON应该怎么解决:

在这里插入图片描述
这里滑块和背景图片变了,其他rid和tokn需要提取,其余的都没有变化:
在这里插入图片描述

big_image = response['result']['risk_info']['process_value']['big_image']
small_image = response['result']['risk_info']['process_value']['small_image']

点选验证接口:captcha/v4/verify_icon

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

这里我们还是一样轨迹不用管,直接拿坐标替换一下自己得到的就可以

在这里插入图片描述

2、登录pwdLogin,接口:aHR0cHM6Ly9tLmN0cmlwLmNvbS9yZXN0YXBpL3NvYTIvMjIxNjAvcHdkTG9naW4=

观察参数:
在这里插入图片描述
需要逆向载荷加密:
在这里插入图片描述

# Aes加密  Utf
def aesEncrypt(text):
    cipher = AES.new('YnV0dGVycz3MzRkw'.encode('utf-8'), AES.MODE_ECB)
    pad = 16 - len(text) % 16
    text = text + pad * chr(pad)
    encrypted_text = cipher.encrypt(text.encode('utf-8'))
    return base64.b64encode(encrypted_text).decode('utf-8')
# Aes解密  Utf
def aesDecrypt(text):
    unpad = lambda s: s[:-ord(s[len(s) - 1:])]
    cipher = AES.new('YnV0dGVycz3MzRkw'.encode('utf-8'), AES.MODE_ECB)
    decrypted_text = unpad(cipher.decrypt(base64.b64decode(text))).decode('utf-8')
    return decrypted_text

在这里插入图片描述

3、查询酒店:phantom-token之前的文章有说过怎么逆向,这个也差不多,跟着那个补环境就🆗了

在这里插入图片描述

4、最后

在这里插入图片描述

技术名词解释

提示:细节一点,结果返回error 400表示加密都是错的哦,注意

风控问题:设备ID问题,然后dimensions里面的参数随机,user-agent,IP随机

小结

提示:学习交流+v看主页

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐