2026/1/11 4:20:35
网站建设
项目流程
怎么弄数据库备份做网站,网站开发主框架一般用什么布局,公司英文网站,上海网站 备案0x0 引言app在请求下单的时候会携带一个sign值#xff0c;这个sign值是通过特定的签名算法生成的加密字符串#xff0c;主要用于接口安全验证和防篡改保护。sign:e24c6676f38d3e97178de0808b931781初步推测可能采用了MD5加密#xff0c;这并非主流大厂的产品。通常的生成流程…0x0 引言app在请求下单的时候会携带一个sign值这个sign值是通过特定的签名算法生成的加密字符串主要用于接口安全验证和防篡改保护。sign:e24c6676f38d3e97178de0808b931781初步推测可能采用了MD5加密这并非主流大厂的产品。通常的生成流程参数排序将所有请求参数除sign本身外按照参数名的ASCII码从小到大排序参数拼接将排序后的参数以参数名参数值的格式用符号连接起来例如amount100order_id123456×tamp1625097600添加密钥在拼接后的字符串末尾加上预先约定的API密钥secret key如amount100order_id123456×tamp1625097600keysecret_key加密计算对最终字符串进行MD5或SHA1等加密运算生成sign直接尝试用 Frida 进行 hook 操作0x1 frida hookmd5参数值PWFSJVAEQYUSNDEFNMHSISJISKHSULDESKM5935JVABS2528909106671L9D2A7M0U5Y2T0C2PPC请求参数{ timeStamp: 1766019098252, nonce: SBAVJ, sign: 903fb31cd87c0990b36728a54e049136, ticketTypeId: 5395, count: 1, purchaserIds: }看到这里心里突然咯噔一下像是被什么东西猛地揪住了。仔细检查了好几遍发现确实没有对应的参数可以匹配这个操作。手心开始微微冒汗脑子里闪过各种可能的解决方案。这时我深吸一口气告诉自己别慌保持冷静。突然想到一个有趣的思路既然正向查找不行那为什么不试试反向操作呢或许将字符串倒序输出就能找到突破口。CPP2C0T2Y5U0M7A2D9L1766019098252SBAVJ5395MKSEDLUSHKSIJSISHMNFEDNSUYQEAVJSFWP0x2 参数分析固定值1: CPP2C0T2Y5U0M7A2D9Ltimestamp: 1766019098252nonce: SBAVJticketTypeId: 5395固定值2MKSEDLUSHKSIJSISHMNFEDNSUYQEAVJSFWP经过多次深入分析包括日志记录、数据比对和单元测试验证发现固定值1和固定值2在整个程序运行周期内始终保持不变由于这两个值表现稳定且不影响核心功能后续有时间的话再进行深入反编译分析nonce是一个随机生成的5位字符串主要用于安全验证和防重放攻击0x3 sign值构造拼接规则详细说明前缀部分reverse(prefix)票种ID处理reverse(ticketTypeId)随机数处理reverse(nonce)时间戳处理reverse(timestamp)后缀部分reverse(suffix)完整示例 输入参数prefix CPP2C0T2Y5U0M7A2D9LticketTypeId 5395nonce SBAVJtimestamp 1766019098252suffix MKSEDLUSHKSIJSISHMNFEDNSUYQEAVJSFWP最终拼接结果 reverse(prefix) reverse(ticketTypeId) reverse(nonce) reverse(timestamp) reverse(suffix)将拼接的结果再进行md5得到sign0x4 sign值还原def _reverse(self, value) - str: 通用倒序方法数字先转字符串再倒序 return str(value)[::-1] def _generate_nonce(self, length: int 5) - str: 生成随机字符串默认长度 5 return .join(random.choices(string.ascii_uppercase, klength)) def _md5(self, text: str) - str: 计算字符串的 MD5 值返回小写十六进制 return hashlib.md5(text.encode(utf-8)).hexdigest() def generate_sign(self, ticket_type_id: int, nonce: str, timestamp: int) - str: 生成 sign 拼接规则prefix reverse(ticketTypeId) reverse(nonce) reverse(timestamp) suffix raw_str f{self.prefix}{self._reverse(ticket_type_id)}{self._reverse(nonce)}{self._reverse(timestamp)}{self.suffix} return self._md5(raw_str)0x5 结论由于MD5加密算法具有单向不可逆的特性无法通过哈希值反推出原始数据因此在服务器端进行签名校验sign值验证时必须要求客户端在请求中提供用于生成签名的原始参数或相关数据。基于此我们尝试对字符串进行倒序处理。