目标网址
aHR0cDovLzYwLjI5LjIwMi44Njo4MDkwLyMvVmlld0JzZHRReUpieHhMaXN0
分析
- 进入网站后,captcha/get 获取验证码
- 滑动滑块后,captcha/check 校验验证码,这里返回一个 secondKey
- 请求的时候带上 secondKey 就可以正常访问
加密点
直接请求后,源代码中搜索 pointJson 加密关键词,即可找到加密点
进入加密函数后,找到是一个标准的AES加密
滑块
滑块使用opencv进行识别
import cv2
def get_x(bg_img: str, tp_img: str, save_img=None) -> int:
bg_img = cv2.imread(bg_img) # 背景
tp_img = cv2.imread(tp_img) # 滑块
bg_edge = cv2.Canny(bg_img, 100, 200)
tp_edge = cv2.Canny(tp_img, 100, 200)
res = cv2.matchTemplate(bg_edge, tp_edge, cv2.TM_CCOEFF_NORMED)
min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(res)
print(min_val, max_val, min_loc, max_loc)
if save_img: # 对滑块进行校验,保存到本地查看结果
bg_img = cv2.imread(save_img)
cv2.rectangle(bg_img, (0, 0), (max_loc[0], 200), (0, 0, 255), 1)
cv2.imwrite('3.png', bg_img) # 保存在本地
return max_loc[0]
bg_name = "bg.png" # 背景图片
tp_name = "tp.png" # 滑块
xx = get_x(bg_name, tp_name) # 获取到xx,为滑动的距离
构建加密参数
data = {
"captchaType": "blockPuzzle", # 为固定值
"pointJson": result, # 距离加密后的参数
"token": token, # 验证码返回的token
}
使用这个参数进行正常访问
js加密部分
// js 加密库中,直接用填充方式就行了
CryptoJS = require("crypto-js")
function run(text,secretKey) {
k = CryptoJS.enc.Utf8.parse(secretKey)
srcs = CryptoJS.enc.Utf8.parse(text)
var en = CryptoJS.AES.encrypt(srcs, k, {
mode: CryptoJS.mode.ECB,
padding: CryptoJS.pad.Pkcs7
});
console.log(en.toString())
return en.toString()
}
text = '{"x":114.7,"y":5}'
secretKey = "JnVdVHxGJgxFz4EI"
run(text,secretKey)
end