JS逆向入门案例-x程滑块、点选验证码+登录+phantom-token -17
JS逆向入门案例-x程滑块、点选验证码+登录+phantom-token -17
文章目录
-
- 概要
- 整体架构流程
- 技术名词解释
- 小结
概要
提示:仅供学习,不得用做商业交易,如有侵权请及时联系
逆向: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看主页
更多推荐
所有评论(0)