文章总结: 本文档描述了一次小程序渗透测试,针对加密、防篡改和防重放机制进行分析。作者发现加密使用非标准SM4算法,通过AI复现并实现Python自动化加解密。HASH校验基于MD5,时间戳校验结合时间戳和随机数。WX.login获取的一次性code可通过修改字段绕过。最终实现了自动化测试流程,建议使用mitm脚本和hook方法处理类似问题。
综合评分: 95
文章分类: 渗透测试,移动安全,逆向分析,安全工具,漏洞分析
【小程序】记一次加密+防篡改+防重放的渗透测试(重发)
原创
十月的进阶之路
十月的进阶之路
2025年12月6日 10:06
甘肃
0x01、背景
开局一个小程序,过程全靠“抠”。通过分析发现该小程序采用国密算法加密请求响应,同时采用了时间戳防重放,HASH校验防篡改,同时采用WX.login接口获取临时code,该code使用一次即失效。
0x02、分析
加解密:
首先解决加密算法,通过多次请求对比加密数据如下:
多次请求加密数据不一致,说明加密算法中存在动态变化的部分。分析js中的加密算法,通过搜索SM4、encrypt等参数快速定位。
断点加密函数,多次请求观察函数参数的变化:
密钥一致,不存在动态密钥,而是待加密数据每次都会变化,因此这就好办了,将完整的加密算法抠出来即可。为什么要抠出来了?不是SM4加密吗?不幸的是这里似乎不是标准的SM4算法,因为我使用标准库去实现的时候失败了。
通过AI可以快速复现该算法,并将其转换为python实现。这里我使用mitm脚本来实现自动化加解密,为什么不用了burp+Galaxy插件了?还不是因为burp插件Galaxy的jython脚本太难改了,改半天各种字符编码问题。有一个项目还挺好的,地址:
https://github.com/yinsel/BurpGuard.git
使用mitm代理在burp的两侧实现自动加解密,但是正当我高高兴兴开搞时,发现不能重放。依旧是抓两个正常的请求进行对比,一看待加密的数据中有三个参数每次都会变化,分别是code、yhb_stamp、origin_stamp。于是自然是继续分析代码,寻找这三个参数的来源。
{
"requestData": {
"mobile_no": "13200000000",
"pwd_type": "2",
"merchant_code": "*****",
"group_merchant_code": "*****************",
"code": "*****************",
"app_id": "*****************",
"appid": "*****************",
"version": "*****************",
"entry": "wx-app",
"platform": "wx,",
"open_id": "*****************",
"union_id": "*****************",
"product_code": "*****************",
"production_code": "*****************",
"yhb_stamp": "cb2ccb1b1a3daed695fac64a1ddc82c6",
"origin_stamp": "0c6886ebf16717785159da86bd280485"
},
"cryptoType": "wx",
"is_crypto_open": true,
"secretId": "v1"
}
HASH效验:
依旧是全局搜索origin_stamp,发现数量不多,全部打上断点。
由此发现origin_stamp来源于待加密数据除开origin_stamp自身的md5值。
时间戳效验:
全局搜索yhb_stamp,数量不多全部打上断点:
重新发送数据,并跟踪分析代码调用堆栈,发现时间戳获取代码如下:
跟踪发现a()函数依旧是那个md5函数。
于是乎yhb_stamp生成算法粗略总结如下:
function generateYHBStamp() {
const timestamp = Date.now().toString();
const nonce = randomString(8);
return md5(timestamp + nonce);
}
关于WX.login获取一次性code
此处无法通过搜索定位,通过函数调用栈逐步追踪得到获取该code的算法如下:
分析getLoginCodeInfo的具体逻辑:
通过查询资料和代码分析,这个code是通过微信官方登录接口wx.login()获取的,并且是一次性的使用即失效,似乎没有什么好的办法来批量获取。(不过似乎修改某些字段即可过掉,登录接口不走微信效验接口
)
能否通过hook手段,通过主动调用获取了?这个留到下次在再说,毕竟仅仅只有登录功能需要验证这个code,不影响其他功能的测试,不过欢迎佬们指教如何解决这个问题。
最终效果
整个加解密流程如图所示:
最终实现效果:
现在就可以愉快的开始正常的测试了。byby~~~,下次再见。
免责声明:
本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。
任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。
本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我。
本文转载自:十月的进阶之路 十月的进阶之路《【小程序】记一次加密+防篡改+防重放的渗透测试(重发)》