文章总结: 本文详细记录了Web应用加密数据包的解密过程,通过逆向分析JavaScript代码发现TripleDES-ECB-PKCS7加密机制,使用固定密钥进行离线解密,并编写Python脚本成功还原Base64编码密码。关键步骤包括追踪加密函数、识别硬编码密钥、验证解密结果,并提出安全建议如避免密钥硬编码和使用更安全的加密模式。 综合评分: 85 文章分类: WEB安全,渗透测试,漏洞分析,逆向分析,实战经验
记一次简单Web加密数据包的解密过程与思路
原创
tangkaixing
开心网安
2025年12月15日 09:06 重庆
免责声明
由于传播、利用本公众号开心网安所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,公众号开心网安及作者不为此承担任何责任,一旦造成后果请自行承担!如需要转载等,请标注文章来源。如有侵权烦请告知,我们会立即删除并致歉,谢谢!
#
0x1概述
本文记录了对某Web应用加密数据包的完整解密过程,从分析加密参数生成机制到成功解密请求。通过逆向分析JavaScript代码、追踪加密函数调用链,最终实现了对TripleDES加密参数的离线解密以及配合burp插件实时解密,并成功还原了Base64编码的密码字段。
#
0x2正文
一、加密数据包分析
初始加密数据包内容:
{"params":"wvL9g2jC5D4DUZkRhBIbL5Ktmit4ubK5uXmzIK4S80P73va51hVVReRhjDkP85cWXfU9Dnv53EiymfxlekwfYA=="}
该数据包包含三个关键参数:
- timestamp: 时间戳参数,用于防重放攻击
- nonce: 随机数参数,增强请求唯一性
- Sign: 签名参数,基于RSA加密的请求验证
二、JS代码分析
通过对app.98e14b30.js文件的下断点追踪分析,发现了完整的加密解密体系:
1. 固定密钥配置
VUE_APP_FIXED_DECRYPTION_KEY: "密钥1", #响应密钥VUE_APP_FIXED_ENCRYPTION_KEY: "密钥2", #请求密钥VUE_APP_FIXED_SIGN_PUBLIC_KEY: "密钥3"
2. TripleDES加密函数
function y() { var t = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : {}, e = arguments.length > 1 ? arguments[1] : void 0; if (b(t)) return ""; var n, r = JSON.stringify(t), i = c.a.enc.Utf8.parse(e); return n = c.a.TripleDES.encrypt(r, i, { mode: c.a.mode.ECB, padding: c.a.pad.Pkcs7 }).toString(), n}
3. TripleDES解密函数
function v() { var t = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : "", e = arguments.length > 1 ? arguments[1] : void 0; if (t) { var n = c.a.enc.Utf8.parse(e), r = c.a.TripleDES.decrypt(t, n, { mode: c.a.mode.ECB, padding: c.a.pad.Pkcs7 }), i = r.toString(c.a.enc.Utf8); return JSON.parse(i) } return {}}
4. 请求拦截器加密逻辑[分析如下]:
关键加密流程:
- 根据URL路径判断是否需要进行参数加密
- 使用固定密钥
VUE_APP_FIXED_ENCRYPTION_KEY进行TripleDES加密 - 加密模式:ECB模式,PKCS7填充
- 生成timestamp和nonce参数
- 使用RSA公钥生成Sign签名
三、加密算法确认与追踪
通过搜索encrypt(函数调用,确认了加密算法为TripleDES-ECB-PKCS7。关键发现:
- 使用CryptoJS库进行加密操作
- 密钥为固定值,硬编码在环境变量中
- 加密前对JSON对象进行字符串化处理
四、Python解密脚本实现
基于分析结果,编写了离线解密脚本params-jm.py:
import sysimport jsonfrom base64 import b64decodefrom Cryptodome.Cipher import DES3from Cryptodome.Util.Padding import unpad
def decrypt_params(params_b64: str, key_str: str) -> str: key_bytes = key_str.encode('utf-8') key_bytes = DES3.adjust_key_parity(key_bytes) cipher = DES3.new(key_bytes, DES3.MODE_ECB) plaintext = unpad(cipher.decrypt(b64decode(params_b64)), 8) return plaintext.decode('utf-8')
if __name__ == "__main__": params_b64 = sys.argv[1] key_str = sys.argv[2] if len(sys.argv) > 2 else "VUE_APP_FIXED_ENCRYPTION_KEY" plaintext = decrypt_params(params_b64, key_str) print(plaintext) try: obj = json.loads(plaintext) pwd_b64 = obj.get("pwd") if isinstance(pwd_b64, str): pwd = b64decode(pwd_b64).decode("utf-8") print(pwd) except Exception: pass
五、成功解密验证
使用解密脚本对加密参数进行解密,成功还原原始数据请求:
【!!!又可以愉快进行st测试啦!!!】
#
0x3总结
- 逆向分析优先:从前端JS代码入手,比盲目猜测加密算法更高效
- 关键词搜索:使用
encrypt(、decrypt(等关键词快速定位加密函数 - 环境变量检查:固定密钥往往存储在环境配置中
- 算法特征识别:TripleDES的ECB模式特征明显,易于识别
- 离线验证:编写独立解密脚本验证分析结果
0x4安全建议
- 避免硬编码密钥:密钥应该动态生成或从服务端获取
- 使用更安全的模式:ECB模式安全性较差,建议使用CBC等模式
- 增加密钥轮换:定期更换加密密钥,降低密钥泄露风险
- 强化代码混淆:对关键加密逻辑进行更好的代码保护
查看原文:《记一次简单Web加密数据包的解密过程与思路》
版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。










评论