免责声明
文章中所有内容仅供学习交流使用,不用于其他任何目的,抓包内容、敏感网址、数据接口均已做脱敏处理,严禁用于商业和非法用途,否则由此产生的一切后果与作者无关。若有侵权,请在公众号【爬虫逆向小林哥】联系作者
01
—
逆向目标
aHR0cHM6Ly92ZXJpZnkucWNjLmNvbS9jYXB0Y2hhP21hdGNoS2V5PVUyRnNkR1ZrWDElMkI0R3prYmFpTnQ3JTJGajNWYzdFUXpDeEdpSGM4eTE5Qk9uOFVOMkhtdjBtczNwMTZFNjJBbmdyaTJrSWxiWGZiTDJxb3Y5ajRvcWhVZyUzRCUzRA==
02
—
分析
好久没看继极验了,然后发现它不检验轨迹了,真是离谱啊,更离谱的是极验4官网的案例可以过,qcc的过不了?
为了排除识别距离问题,甚至用了手动识别
然后还是一直forbidden
神奇的是极验4官网可以正常通过,非常困惑
先说结论
qcc
官网
获取滑块信息里面的pow有个bit会影响后续随机字符串的生成
下面就是排除故障了
首先就是验证加密w的问题,做法就是把随机值写死然后复制浏览器的明文与本地对比发现没啥问题,这里就不详细讲了
接着就是明文的问题了
我的做法是在浏览器断住一个正常通过的滑块,然后拿明文信息下来使用
然后神奇的是这里滑块居然通过了
定位到问题了 就是这里的eee
eee = {
"setLeft": 199,
"passtime": 1871,
"userresponse": 199.8236089388437,
"device_id": "",
"lot_number": "d4a32c3e58f341f8a99d1282e49a4cc9",
"pow_msg": "1|10|md5|2024-04-10T10:32:40.298399+08:00|8daf8b2d78f74aea6a77c0d10da77d41|d4a32c3e58f341f8a99d1282e49a4cc9||8da6a5998ab93592",
"pow_sign": "0031dcc79a1739c5d80f0ce6164932e4",
"geetest": "captcha",
"lang": "zh",
"ep": "123",
"biht": "1426265548",
"Sqk5": "qXYv",
"em": {
"ph": 0,
"cp": 0,
"ek": "11",
"wd": 1,
"nt": 0,
"si": 0,
"sc": 0
}
}
然后接着排除问题,发现再距离正常的情况下(返回的result 不是 fail),保证
captcha_id lot_number pow_msg pow_sign保证和页面上一致就可以通过,前三者又是返回的,因此问题只能出在pow_msg和pow_sign问题上
往前找它们的生成,可以直接搜下面
"u0070u006fu0077u005fu006du0073u0067"
有下面两处
在函数开头下断刷新
然后单步发现它进入了后一个,并且后一个是在一个while循环里面的
这里的h是前文章分析的随机字符
看上去它检验了生成的pow_sign,然后判断了一些逻辑,直到符合才跳出循环,因此可以得出结论这里的随机字符串不能随意写死
函数里面u的生成就依赖我们上面说的结论pow的bit
极验4官网的这里的u是"",所以l.indexOf("") 始终为0,无论随机字符串是啥。
这也就是为什么极验4官网不校验这个字符串的原因
// 大体的流程就是根据cattcha_id、lot_number、pow拼接好后的字符串c
let c = 拼接字符串
let a = bit % 4,
_ = parseInt(bit / 4, 10),
let u = new Array(_ + 1)['join']('0');
while(1)
{
let h = 随机字符串
let l = md5(c + h)
判断 l.indexOf(u) === 0
判断 l的第3个字符是否小于等于3
两个都是true 生成的随机字符和pow_msg pow_sign才是有效的
}
代码如下:
const md5 = require("md5")
function t() {
return (65536 * (1 + Math['random']()) | 0)['toString'](16)['substring'](1);
}
function get_key() {
return t() + t() + t() + t();
}
function pow(captcha_id, lot_number, detail, bit) {
let a = bit % 4,
_ = parseInt(bit / 4, 10);
let u = new Array(_ + 1)['join']('0');
let c = `1|10|md5|${detail}|${captcha_id}|${lot_number}||`
let num = 1
while (1) {
let h = get_key()
let l = md5(c + h)
console.log(num)
if (l.indexOf(u) === 0) {
let d = l[_],
f = 3;
if (d <= f) {
return {
"u0070u006fu0077u005fu006du0073u0067": c + h,
"u0070u006fu0077u005fu0073u0069u0067u006e": l
};
}
}
num = num + 1
}
}
添加好友回复:交流群
原文始发于微信公众号(爬虫逆向小林哥):【逆向案例】qcc极验4 bit字符校验问题
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论