本帖最后由 ShawDS 于 2026-3-14 12:41 编辑
1、抓包看请求与响应
包含5个参数:x-tif-nonce、x-tif-signature、x-tif-timestamp、x-tingyun、x-tif-Paasid
其中x-tif-Paasid的值恒为undefined,x-tif-timestamp的值为时间戳,实际发包请求头为空也能收到正常响应,服务器只检查请求体
请求体包含encData、appCode、version、encType、signType、timestamp、signData
其中appCode、version、encType、signType为固定值,timestamp为时间戳,encData、signData为密文
响应体包含signData、encType、encData、version、timestamp、message、type,只需关注密文encData即可
2、逆向请求体逻辑
全局搜索encData找到加密逻辑
多次F5后发现c与u为固定值,s也为固定值,a为字符串{"addr":"","regnCode":"110000","medinsName":"","medinsLvCode":"","medinsTypeCode":"","outMedOpenFlag":"","pageNum":7,"pageSize":10,"queryDataSource":"es"},包含页数与单页显示数量
进入函数b后发现是将传入的a进行n.concat(new Array(i).fill(i));后送去加密
F9单步进入加密函数
标准的SM4加密
直接调用sm-crypto算出密文
[JavaScript] 纯文本查看 复制代码 var sm4=require("sm-crypto").sm4;
var mingwen={
"addr":"",
"regnCode":"450100",
"medinsName":"",
"medinsLvCode":"",
"medinsTypeCode":"",
"outMedOpenFlag":"",
"pageNum":1,
"pageSize":10,
"queryDataSource":"es"
};
mingwen=JSON.stringify(mingwen);
var key_my=Buffer.from([67,51,65,69,53,56,55,51,68,48,56,52,49,56,68,65]).toString("hex");
var result=sm4.encrypt(mingwen,key_my).toUpperCase();
console.log(result);
全局搜索signData找到加密逻辑
doSignature是SM2算法的加密函数,多次F5后发现d为固定值,r为'appCode=T98HPCGN5ZVVQBS8LZQNOAEXVI9GYHKQ&data={"pageNum":"2","pageSize":"10","queryDataSource":"es","regnCode":"450100"}&encType=SM4&signType=SM2×tamp=1773461619&version=1.0.0&key=NMVFVILMKT13GEMD3BKPKCTBOQBPZR2P'
包含页数、单页显示数量与时间戳,其余值都为固定值
直接调用sm-crypto算出密文
[JavaScript] 纯文本查看 复制代码 var sm2=require("sm-crypto").sm2;
var plaintext='appCode=T98HPCGN5ZVVQBS8LZQNOAEXVI9GYHKQ&data={"pageNum":"5","pageSize":"10","queryDataSource":"es","regnCode":"450100"}&encType=SM4&signType=SM2×tamp=1773447985&version=1.0.0&key=NMVFVILMKT13GEMD3BKPKCTBOQBPZR2P';
var private_key_sm2="9c4a35d9aca4c68f1a3fa89c93684347205a4d84dc260558a049869709ac0b42";
var signData=sm2.doSignature(plaintext,private_key_sm2,{"hash":true,"publicKey":"04429ac3742d737d4b1bf8533c714f96b88ab809ff9f34d697c2e24712f0e22422494232ba0969b45c4d91d0a2357717be4a931fbf5187f036b04154ea18de2b79","der":false});
signData=Buffer.from(signData,"hex").toString("base64");
console.log(signData);
request成功出响应体
因为SM4为对称加密,故可直接调用sm-crypto进行解密
[JavaScript] 纯文本查看 复制代码 var sm4=require("sm-crypto").sm4;
var key_my=[67,51,65,69,53,56,55,51,68,48,56,52,49,56,68,65];
key_my=Buffer.from(key_my).toString("hex");
var miwen="密文字符串";
var result=sm4.decrypt(miwen,key_my);
console.log(result);
结束。 |