某医院小程序逆向签名加解密之泄露百万数据
原创
private null
private null
轩公子谈技术
2026年5月31日 12:23
江苏
在小说阅读器读本章
去阅读
首先登录小程序,发现数据是密文,还有签名,这就很头大啊
再大也要干,反编译小程序,格式化 js 代码,全局搜索签名字段,发现了疑似代码实现
source: n.source,
version: n.version
这俩个是固定的,在上面代码中的硬编码内容
nonce: p 是 function u 函数中p=s(6) 传入一个 6 ,通过下面的代码实现出来的,随机生成的字符串
function s(t){
if(t >21)returnnull;
var e =newRegExp(\"(\\d{\"+ t +\"})(\\.|$)\");
return(Array(t -1).join(0)+Math.pow(10, t)\*Math.random()).match(e)[1]
token: g, 很明显是获取的登录的 token 值,然后转为 json 格式
timestamp: d,这个不用看代码就知道什么意思,时间戳
完了就是调用encrypt 函数进行加密,在最上面引用了var t = require(\"./aes256Util.js\"),,说明是 aes 加密方式
完事了搜索了 aes 加密方式
e 是 aes 的 key,r 是 iv,截取 key 的 16 个字符。cbc 模式,填充 pkcs7
最终转为 json
{\"source\":\"aaaa\",\"version\":\"1.0.1\",\"nonce\":\"123456\",\"timestamp\":\"1683881234567\"}
就生成签名信息了
由于小程序的请求参数和返回包都是加密的,所以还存在另一种加密方式,即 rsa
这是就是对应的公钥和私钥了
整体流程如下
请求流程:
1.构造业务参数对象 params
2.入参加密: RSA公钥加密(JSON.stringify(params)) -> encryptedData
3.生成 nonce = 6位随机数
4.生成 timestamp = 当前毫秒时间戳
5.获取 token = wx.getStorageSync(\"LOGIN\_TOKEN\")
6.生成 signature = AES-256-CBC-Encrypt(JSON.stringify({
source: \"xxxxxxx\",
version: \"1.0.1\",
nonce: nonce,
timestamp: timestamp,
token: token // 可选
}))
7.发送请求: header 中携带 source/version/timestamp/nonce/token/signature
body 中携带 RSA加密后的数据
响应流程:
1.接收响应
2.如果 status=1102: 刷新 token 并重试
3.出参解密: RSA私钥解密(response.data) -> JSON.parse -> 业务数据
把找到的内容和代码 发给 ai,这样就不用自己写脚本,一键验签,加解密。
成功了,那么就开始测试最常见的点,报告查询,在很久很久之前,医院小程序,报告查询的功能,几乎都存在越权,现在亦是如此,解密我的报告查询参数
这是注册的账号,身份证号随机生成的,
发现,竟然是传入的 userid,那么id - 1 看看获取的数据
可见是成功的查询到了其他人的手机号,姓名,身份证号
也能搜到微信号,userid 是六位数,刚好是 9 开头的,99w+条三要素
但是这样也很麻烦,搞一次手动验签一次,于是让 ai 写一个代理中转,自动加解密,自动验签,这样就可以在 bp 爆破模块中遍历 id 了
简单试一下,可以进行解密
简单遍历 100 条数据
完美。
版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。









评论