JS逆向1: 有道翻译sign参数还原以及api返回数据解密

发现有道翻译的api返回结果现在改成密文了,来试试看

1. 目标

目标API: https://dict.youdao.com/webtranslate

请求方式为POST方式,表单提交的内容中字段sign为签名,并且接口返回内容为密文,看起来是base64。

2. 还原SIGN

老规矩,还是先全局搜索sign,在文件app.f59abb30.js中发现可疑的地方。

image-20230218170601348

调试一下,b函数接受的参数中t为毫秒时间戳、e的值固定:fsdsogkndfokasodnasob内部对et进行了拼接,后由p函数进行计算得出最终sign值。

p函数中拼接的字符串为:client=fanyideskweb&mysticTime=1676711201946&product=webfanyi&key=fsdsogkndfokasodnaso

然后对p函数传一个空值得出d41d8cd98f00b204e9800998ecf8427e,明显p函数是直接调用了md5算法。

image-20230218171024579

小总结:sign的结果由当前的毫秒时间戳与一些固定字符串拼接后进行md5得出。

3. 解密接口返回结果

3.1 Hook javascript的json相关函数:

1
2
3
4
5
6
7
8
9
10
11
const my_stringify= JSON.stringify;
JSON.stringify = function (params){
console.log("xxx",params);
return my_stringify(params);
};

const my_parse = JSON.parse;
JSON.parse = function (params){
console.log("xxx",params);
return my_parse(params);
};

console语句上打debugger查看调用栈后找到解密位置:

image-20230218171547008

这里注意关键函数createDecipheriv这是nodejs中用于对称加密算法解密相关的,其中第一个参数为加密算法类型,第二值参数为加密的key,因为这里是aescbc模式所以第三个值应该为iv值。

3.2 用python还原:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
from Crypto.Cipher import AES
from Crypto.Hash import MD5
import base64
from Crypto.Util.Padding import pad, unpad
def test_decrypt(decrypt_str):
key = "key"
iv = "iv"

key = MD5.new(key.encode('utf8')).digest()
iv = MD5.new(iv.encode('utf8')).digest()

aes = AES.new(key, mode=AES.MODE_CBC, iv=iv)
# decrypt_res = pad(decrypt_str.encode('utf8'), 16)
# c = aes.decrypt(base64.b64decode(decrypt_str))
c = aes.decrypt(base64.urlsafe_b64decode(decrypt_str))
return unpad(c, AES.block_size).decode('utf8')


if __name__ == "__main__":
decrypt_str = "_jsUyA02rwkOJ4enKX7c4dhd7CjvGkcKfbRx0BjNGW_hwjE_2PiqPiM3vVr4Y05h0zY-PcyS28K16rKbb8q0Ma-qFiwk4jcdmZC34DcQsRF7kehjfLzArYdnCq-e09t-zhPi6UAlDgqVJeO_JGDg1veCbE-PBw_YawOjiZ7AEEcXJ9HvpazfDznmVv2cGhEUzn6npkrdLdHpe23yeNiUTOmUIsZVmmBQmv4vEoY_N3c="
c = test_decrypt(decrypt_str)
print(c)

3.3 小细节

这里有一个小细节,接口返回的base64值并不是一个标准的base64值,而是一个变种:将Base64中的+/改为了在url中不会被编码的_/。在python解码base64时需要用urlsafe_b64decode函数。

4. 总结

这个网站还是很简单的,只是base64解码那需要注意一下,作者在这卡了好久。

JS逆向1: 有道翻译sign参数还原以及api返回数据解密

https://www.huihuidehui.com/posts/78f06c31.html

作者

辉辉的辉

发布于

2023-02-18

更新于

2023-02-18

许可协议

评论