寻找请求条件与参数
准备爬虫的时候,我们要知道什么?我们必须知道API请求的参数,请求的方法、请求的头是哪些。入下图:
请求头里面有JWT和一个token,可能是我们必须要求的。我们也没有在cookies中找到他,那可能是JS里面发起的请求。
我们就必须知道他是由什么请求生成的JWT。开启浏览器抓包,刷新页面,我们要注意是否有数据包返回值为token:qgemv4jr1y38jyq6vhvi和JWT密文。找了所有返回包,仅仅发现有JWT的返回包,如下图:
并无返回结果为token:qgemv4jr1y38jyq6vhvi的返回包,那么有可能这个token是在JS中有浏览器的id加密成的也有可能就是在JS中的硬编码。直接在浏览器中搜索JS文件是否存在qgemv4jr1y38jyq6vhvi。如下图所示:
他是存在JS中的硬编码,那么就可以不管它,直接拿来用即可。对https://api.interpreter.caiyunai.com/v1/user/jwt/generate以JSON格式发起POST请求,并附带上参数{browser_id: “cba5c021d7ef12a51be1f97fb0d1dc5e”}即可得到JWT
这样一来我们就有了token和JWt那么就可以对翻译接口发起请求结果返回图下图。Emmmm这结果居然被加密的如下图所示:
API返回的结果是H3SfVBnmdBJScD==,从头到尾的的返回包,就没有见到“Sql
注入”的影子,那么结果只有一个。这个是加密过后的数据,那么并没有其他请求已H3SfVBnmdBJScD==作为参数向服务器发送请求解密,所以他只能用JS进行解密。
JS调试
JS如何调试?在没有一切反调之前,他是如下图所示:
在粘贴待翻译的文本在文本框的同时快速点击箭头指向的⏸按钮,即可进入调试模式。在调试模式中,我们可以一直按
直到出现加密结果,接下来JS肯定是解密,要不然做其他没意义的事情,只会影响用户体验。现在我可以使用步入一个一个看,很快就能找到解密处,入下图:
不会解密的也没关系,我们只要复制这一段代码。放到Python中用python执行JS代码即可。
function le(t) {
var e;
return function(t) {
return Zt.decode(t)
}((e = function(t) {
return "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz".indexOf(t)
}
,
t.split("").map(function(t) {
return e(t) > -1 ? "NOPQRSTUVWXYZABCDEFGHIJKLMnopqrstuvwxyzabcdefghijklm"[e(t)] : t
}).join("")))
}
import execjs
#最终return的是这个是根据最后解密后的变量的名称,这里是t
decode=execjs.compile(
"""
function le(t) {
var e;
return function(t) {
return t
}((e = function(t) {
return "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz".indexOf(t)
}
,
t.split("").map(function(t) {
return e(t) > -1 ? "NOPQRSTUVWXYZABCDEFGHIJKLMnopqrstuvwxyzabcdefghijklm"[e(t)] : t
}).join("")))
}
"""
)
t="H3SfVBnmdBJScD=="
result=decode.call('le',t)
print(result)
注意这个注释。如下图:
python执行的结果,和JS调试的结果一样,但是得到这个解密后的字符串好像也不是我们要的答案,最后t会进入Zt.decode()由于我调试了之后,是base64解码我就不详细讲解。
回到JS刚刚解密方式,如果用python来那么我也不算是逆向了,其实玩了几年的CTF我真的是一眼看出来他是凯撒密码。
写个凯撒解密跑一下偏移,得到偏移位为13。
在很多很多爬虫中经常会遇到我们想要的结果被加密,可以尝试用JS逆向