朋友们现在只对常读和星标的公众号才展示大图推送,建议大家把“亿人安全“设为星标”,否则可能就看不到了啦
原文首发在先知社区
https://xz.aliyun.com/t/15031
介绍:又一次公司的测内网系统项目的出现了流量加密,于是进行前端调试js逆向后对其流量反解密进行渗透(一次简单记录分享,大佬勿喷)
登录系统后,查看了历史数据包,基本上都是/api/xxx/xxx?params=加密数据
这样的接口,所以就怀疑系统对流量做了加密,于是在前端调试开始找加密代码。
# 其中一个数据包展示
GET /api/foidisplay/mzhyxyhhxjbxx/getBqCountBy?params=+krOw/izxq2qXvIYnwWiEoShthvEcp/+rera6frw9lbc9k8B4aEDqui9BIDQLuR5I3zAOCIaIykTiQmZxaGjXA== HTTP/1.1
Host: target.com
Authorization: Bearer 7c28172e-e9a9-404d-899a-e5b720f3a90e
首先F12
在下图处(当时的图找不到了)添加一个接口为断点,当系统访问到这个接口时就会触发断点,这时我们就可以开始进行断点调试开始找加密代码
还有2种方法是:
1、找加密关键字,如加密参数为params
这个参数,但是搜索出来很多,一个个排查太多了不现实。
2、直接搜索加密关键字encrypt
,也可以搜索出来js加密代码。
这次比较幸运直接搜关键字encrypt
就直接搜索了出来,知道了是使用了AES加密,但是这时还不知道使用的key
和iv
是哪个,于是在此加密代码下添加断点。断到这段代码后,e是明文参数,n是密钥,c是iv。
这里的key
和iv
就是取数据包中的Authorization
参数后16位字符串对明文进行加密。
# 使用AES加密,通过传入的参数 e(待加密数据),n(密钥),c(初始化向量)来实现加密过程,模式为 CBC,填充方式为 ZeroPadding,最后将加密后的结果以 Base64 编码返回。
function w(e, n, c) {
var t = g, a = y;
n && (t = v.enc.Utf8.parse(n),
a = v.enc.Utf8.parse(c));
var u = v.enc.Utf8.parse(e)
, r = v.AES.encrypt(u, t, {
iv: a,
mode: v.mode.CBC,
padding: v.pad.ZeroPadding
});
return v.enc.Base64.stringify(r.ciphertext)
知道了用得何种加密后,我们就能开始使用python或者其他的语言来进行模拟加密,笔者喜欢用python,上代码
代码语言:javascript复制from Crypto.Cipher import AES
import base64,json
from urllib.parse import unquote,quote,urlencode
# 0填充
def zero_pad(data, block_size):
# 计算需要填充的字节数
padding_length = (block_size - len(data) % block_size) % block_size
# 使用零字节填充
return data b'