关注微信公众号获取更多资讯,第一时间学习最新前沿渗透技术!
0x01 前言
还是像往常一样对某个APP进行安全测试,由于是支付软件根据安全合规要求APP发送的请求大多是加密的,这点在测试之前已经想好解决方案。根据以前遇到的加密方式,大多都是AES、DES、RSA、SM3、SM4这种单调的加密,秘钥存储在APP客户端或者存储在JS中,只需要通过APP逆向或者JS断点拿到KEY或者公钥,就可以还原加密算法。但是这次遇到的这个支付APP跟往常加密算法存在着很大不同,下文将逐步分析它的加密流程。
0x02 加密分析
打开APP某个功能点,触发HTTP请求,数据包如下,简单的分析一下该请求的结构
从请求头来看,请求头中带有Referer,说明该请求虽然是从APP发出的,但实际还是由APP嵌入的网页发起的请求,利用这点可以通过搜索请求URL找到相关的WEB页面,相关加密算法肯定存在此WEB页面中。这样就不用逆向APP少走弯路。
从请求数据来看,openId是我的手机号;aesKeySign可能是某种签名、加密算法可能与AES有关;encData可能是请求数据;encType是加密类型。
分析完数据包,就该根据分析结果进行相关操作,先看看该请求的URL是由哪个WEB页面发起的
全局从响应包中搜索personProductInfo
发现相关JS文件
查看JS文件的Referer即可获取发起请求的网页
打开该网页
在该网页中全局搜索encType、aesKeySign相关关键字定位加密算法具体位置
最终在0.d4f14.js文件中发现实现加密的函数
具体代码位置在6755至6815行之间
逐行分析关键代码
- 在6761行调用/gapi/mapi-gateway/auth/getPublicKey接口获取服务端RSA公钥
相关请求如下
- 在6722行调用clientRsaKeyUpload函数,客户端生成一对RSA公钥与秘钥