专栏名称: 白帽子左一
零基础也能学渗透!关注我,跟我一启开启渗透测试工程师成长计划.专注分享网络安全知识技能.
目录
相关文章推荐
绝对现场  ·  再次增加500万!大庆市2025“汽车欢购季 ... ·  17 小时前  
绝对现场  ·  再次增加500万!大庆市2025“汽车欢购季 ... ·  17 小时前  
21世纪商业评论  ·  百万骑手上社保,美团跌去800亿 ·  昨天  
FT中文网  ·  年轻人为什么不结婚? ·  2 天前  
内江市市场监督管理局  ·  注意了!企业用工有风险,快来上经营主体入市第一课! ·  2 天前  
谷哥大叔  ·  经典代运营SEO案例分析 ·  5 天前  
51好读  ›  专栏  ›  白帽子左一

某众测前端解密学习记录

白帽子左一  · 公众号  ·  · 2024-04-28 12:00

正文

扫码领资料

获网安教程




某次大型金融公司众测,抓包发现都是加密数据,经过Jsrpc与autoDecoder学习调试后,最后也是成功还原数据包,挖掘出高危漏洞。分享经验,希望对大家有所帮助。

文章来源: https://forum.butian.net/share/2889文章作者:lei_sec如有侵权请您联系我们,我们会进行删除并致歉

0x00 前言

相信不少朋友挖掘src时或金融项目中,遇到数据包加密的目标直接放弃,其实不然,随着时代变迁,此类项目只会越来越多,掌握破解之法才是关键。

0X01 分析前端加密函数

1-1找到加密解密函数位置

开启f12,控制台中找到对应加解密Js位置

打上断点,开始调试

找到相关函数,点击步入


找到关键解密函数

r = JSON.parse(Object(u["a"])(e, window.cxcrmAesKey));

0x02 jsrpc注入

项目地址:https://github.com/jxhczhl/JsRpc

2-1

控制台中注入此项目中resouces/JsEnv_Dev.js

启动项目

// 注入环境后连接通信
var demo = new Hlclient("ws://127.0.0.1:12080/ws?group=zzz&name=hlg");

group与name自行修改

测试是否通信成功

2-2 注入环境变量 (此动作要在页面调试中追踪到相关函数才能执行,不然会报错)

加密:window.enc = Object(u["b"])
解密:window.dec = Object(u["a"])

2-3 多参数调用

demo.regAction("dec", function (resolve,param) {
//这里还是param参数 param里面的key 是先这里写,但到时候传接口就必须对应的上
res=dec(param,window.cxcrmAesKey)
resolve(res);
})

demo.regAction("enc", function (resolve,param) {
//这里还是param参数 param里面的key 是先这里写,但到时候传接口就必须对应的上
res=enc(param,window.cxcrmAesKey)
resolve(res);
})

0x03 联动autoDecoder

jsrpc设置好后,就可以联动f神写的autoDecoder了,先上一张原理图

f神在项目中也提供了flasktest.py,这里要修改一下结合jsrpc提供的接口,代码如下(与前文设置参数要对应)

import requests
import json
from urllib.parse import quote

app = Flask(__name__)
url = "http://localhost:12080/go"
@app.route('/encode',methods=["POST"])
def encrypt():
param = request.form.get('dataBody') # 获取 post 参数
#print(json.dumps(param))
param_headers = request.form.get('dataHeaders') # 获取 post 参数
param_requestorresponse = request.form.get('requestorresponse') # 获取 post 参数
data = {
"group": "zz",
"name": "gg",
"action": "enc",
"param": json.dumps(param)
}
res = requests.post(url, data=data) #这里换get也是可以的
encry_param = json.loads(res.text)['data']
print(encry_param)
if param_requestorresponse == "request":
return param_headers + "\r\n\r\n\r\n\r\n" + encry_param
return encry_param

@app.route('/decode',methods=["POST"])
def decrypt():
param = request.form.get('dataBody') # 获取 post 参数
param_headers = request.form.get('dataHeaders') # 获取 post 参数
param_requestorresponse = request.form.get('requestorresponse') # 获取 post 参数
print(param)
data = {
"group": "zz",
"name": "gg",
"action": "dec",
"param": param
}
res = requests.post(url, data=data) #这里换get也是可以的
decrypt_param = json.loads(res.text)['data']
print(decrypt_param)
if param_requestorresponse == "request":
return param_headers + "\r\n\r\n\r\n\r\n" + decrypt_param
else:
return decrypt_param

if __name__ == '__main__':
app.debug = True # 设置调试模式,生产模式的时候要关掉debug
app.run(host="0.0.0.0",port="8888")


抓包测试下是否调试成功







请到「今天看啥」查看全文