# 知识点:sojson解密,headers检测,动态cookie ## 解题思路 控制台查看发现cookie中存在`m`的变量,值是加密的 ![请求](./img/1.png) 经过几次的请求尝试,发现变量`m`是通过`https://www.python-spider.com/challenge/3`地址请求过后生成的 ![请求](./img/2.png) 接下来事件断点 ![请求](./img/3.png) 老规矩下一步,下一步,下一步,到`https://www.python-spider.com/challenge/3`停下来,可以看到js代码存在混淆 ![请求](./img/4.png) 利用google插件v_jstools进行解混淆 ![请求](./img/5.png) 复制解混淆后的js代码,尝试运行,去除头尾的匿名函数运行 ![请求](./img/6.png) 这里的报错的原因是一段`eval(L(qz))`代码,尝试打印`console.log(L(qz));` ![请求](./img/7.png) 打印结果是 console = new Object() console.log = function (s) { while (1){ for(i=0;i<1100000;i++){ history.pushState(0,0,i) } } } console.toString = '[object Object]' console.log.toString = 'ƒ toString() { [native code] }' 我的操作简单粗暴,直接注释不执行 再看接下来的代码,返回的是`navigator.vendorSub;`,这里就是空 try { if (global) { console.log("人生苦短,何必python?"); } else { while (1) { console.log("人生苦短,何必python?"); debugger; } } } catch (a5) { console.log(a5); return navigator.vendorSub; } 改写成 return ''; 代码最后,这些也同样注释掉 function W(Y, Z) { document.cookie = "m" + M() + "=" + V(Y) + "|" + Y + "; path=/"; location.reload(); } function X(Y, Z) { return Date.parse(new Date()); } W(X()); 替换成 m = V(1678168607000); console.log(m); 得到了`m`值,就可以模拟请求, def challenge3(page, m, timestamp): url = "https://www.python-spider.com/api/challenge3" payload = f"page={page}" headers = { 'cookie': f'm={m}|{timestamp}' } response = requests.request("POST", url, headers=headers, data=payload) return response.text 但发现返回的数据是不变的,为什么? 用charles代理拦截,对比查看请求体,最后猜测是`header`问题 ![请求](./img/8.png) 复制`header`请求成功