深圳罗湖医疗集团网站建设,基金网站建设,科技九洲君,网站建设销售好做嘛1.目标 网址#xff1a;https://y.qq.com/n/ryqq/toplist/26 我们知道了 sign P(n.data)#xff0c;其中n.data是明文的请求参数
2.webpack生成data加密参数 那么 L(n.data)就是密文的请求参数。返回一个Promise {pending}#xff0c;所以L(n.data) 是一个异步函数…1.目标 网址https://y.qq.com/n/ryqq/toplist/26 我们知道了 sign P(n.data)其中n.data是明文的请求参数
2.webpack生成data加密参数 那么 L(n.data)就是密文的请求参数。返回一个Promise {pending}所以L(n.data) 是一个异步函数。
L(n.data).then(result {console.log(结果是:, result);
}).catch(error {console.error(发生错误:, error);
});window.shark(0).cgiEncrypt(data).then(result {console.log(结果是:, result);
}).catch(error {console.error(发生错误:, error);
});运行之后报错
p[r[h]] p[r[h]].call(p[r[h]], p[r[h]]);
TypeError: Cannot read properties of undefined (reading call)因为请求参数是用了AES-GCM加密且使用了随机iv AES-GCM 是一种高级加密标准AES与伽罗瓦 / 计数器模式GCM结合的加密方式 在浏览器环境中window.crypto 对象是 Web Crypto API 的入口用于实现加密相关的功能。window.crypto.subtle 是 SubtleCrypto 接口的实例它提供了更底层、更强大的加密功能。 SubtleCrypto 的所有方法均返回 Promise需通过 then/catch 或 async/await 处理异步结果例如密钥生成、加密解密等操作。
所以我们只需要导入
window globalThis;;
window.crypto require(crypto);就可以正常生成结果
3.逆向还原data加密参数
密钥就是vTBfEND/dLbvVNq4NbXhzw 这样生成的结果长度为448而网页长度是464少了16位而这16位正是iv
AES-GCM 通常需要将 IV 和密文一起传输接收方才能正确解密 这样就没有问题
4.响应数据解密 返回的数据是二进制 数据解密是用j.__cgiDecrypt当然也是AES-GCM解密
搜JSON.parse(N(可快速定位
5.绕过加密验证 我们请求携带了encoding: ag-1正是告诉QQ音乐服务器要采用某种加密方式 请求不要携带这个同时data参数保持明文传输
import requests
import jsonheaders {User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36,Accept: application/octet-stream,accept-language: zh-CN,zh;q0.9,cache-control: no-cache,content-type: text/plain,origin: https://y.qq.com,pragma: no-cache,priority: u1, i,referer: https://y.qq.com/,sec-ch-ua: \Chromium\;v\136\, \Google Chrome\;v\136\, \Not.A/Brand\;v\99\,sec-ch-ua-mobile: ?0,sec-ch-ua-platform: \Windows\,sec-fetch-dest: empty,sec-fetch-mode: cors,sec-fetch-site: same-site
}url https://u6.y.qq.com/cgi-bin/musics.fcg
params {sign: zzc308f0fefeuogbgecps0gpzosg6fnvxujyw0474ee6d
}
data {comm: {cv: 4747474,ct: 24,format: json,inCharset: utf-8,outCharset: utf-8,notice: 0,platform: yqq.json,needNewCode: 1,uin: 0,g_tk_new_20200303: 5381,g_tk: 5381},req_1: {module: musicToplist.ToplistInfoServer,method: GetDetail,param: {topid: 27,offset: 0,num: 20,period: 2025-05-29}}
}
data json.dumps(data, separators(,, :))
response requests.post(url, headersheaders, paramsparams, datadata)print(response)
print(response.text)
也就是说只需要分析sign即可