Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >漏洞挖掘-记某次众测的加解密对抗

漏洞挖掘-记某次众测的加解密对抗

原创
作者头像
亿人安全
发布于 2024-03-04 13:37:39
发布于 2024-03-04 13:37:39
40700
代码可运行
举报
文章被收录于专栏:红蓝对抗红蓝对抗
运行总次数:0
代码可运行

朋友们现在只对常读和星标的公众号才展示大图推送,建议大家把“亿人安全设为星标”,否则可能就看不到了啦

原文链接:

https://xz.aliyun.com/t/14015

前言

起源于某次众测中,遇到请求包响应包全密文的情况,最终实现burp中加解密。

用到的工具有

  • sekiro(rpc转发)
  • flask(autodecoder自定义接口)
  • autodecoder(burp插件转发)

debug部分

开局搜索框,随意输入字符。

图片
图片

从burp查看后端请求,发现请求包响应包均为密文

图片
图片

猜测应该是前端进行了加密操作,接着尝试debug出加密逻辑。

图片
图片

先从启动器中寻找接口触发的函数,这里通过定位getData函数

图片
图片

然后通过F10跳过函数,最终到加密处如下

图片
图片

发现加密函数为Object(r["b"]),通过控制台打印它,双击即可跟进函数

图片
图片

具体定义如下。

图片
图片

观察be35包,当调用b的时候,返回了s,及AES加密。当调用a的时候,返回了o,及AES解密。分析这个AES的加解密,key和iv均不为硬编码,这也是后续RPC的最难点。

对于RPC来说,这一步需要我们将加解密函数添加到全局,也就是

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
window.enc=Object(r["b"]) //加密
window.dec=Object(r["a"]) //解密

添加完之后,还有key和iv需要解决。

这里当时临时解决办法是通过debug当时的key和iv,通过硬编码的形式来进行加解密。

js注入部分

首先需要在sekiro中新建group,不然匿名分组会慢很多。

图片
图片

由于这里使用的是sekiro的浏览器js环境,可参考官方文档,注入浏览器js代码

图片
图片

这里由于我进行的本地rpc,需要将wss协议更换为ws

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var client = new SekiroClient("ws://localhost:端口号/business/register?group=分组名&clientId=" + Math.random());

在完成cleint创建后,还需要具体注册加解密的Action

下面是针对debug的函数做出的加解密方法注册。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
client.registerAction("aes_enc", function (request, resolve, reject) {//加密
    resolve(enc(request["enc_par"],request["key"],request["iv"]); 
});

client.registerAction("aes_dec", function (request, resolve, reject) {//解密
    resolve(enc(request["dec_par"],request["key"],request["iv"]); 
});

其中 enc 调用的是debug时注册的全局加密函数,request["xxx"]为调用 sekiro http接口的参数名,其他用法可参考使用文档。

burp上游代理部分

这里使用的autodecoder这款burp插件的接口加解密来作为上游代理,这里通过python的flask框架来编写二层接口加解密。以下是加密接口实现,解密同理。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@app.route('/aes_encode', methods=["POST"])
def encrypt():
    param = request.form.get('dataBody')  # 获取  post 参数
    data = {
        "group": "分组名",
        "sekiro_token": "xxxxx", #在sekiro的管理页面
        "action": "aes_enc", #注册的action名字
        "enc_par": param,
        "bind_client": "设备名",
        "key": key,
        "iv": iv
    }
    res = requests.post(url, data)
    enc = json.loads(res.text)['data']
    return enc

需要注意的是bind_client参数为设备ID,这个参数需要加上,不然会导致多设备转发出错,参考官方文档。

图片
图片

bind_client参数位置如下。

图片
图片

做完这些部分之后,即可在burp的拦截、重放功能中对密文解密。

key和iv随机问题解决

由于当时临时解决办法为,将key和iv通过debug出来后,硬编码赋值给上游代理的flask,但后续刷新页面,key和iv却发生了变化。于是重新debug出key和iv的生成逻辑。

debug回到之前的加密处

图片
图片

带着之前的思路,加密处为

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Object(r["b"])(e.data, b.dfg, b.cvb)

其中key、iv对应的b.dfg、b.cvb。而对象b的定义如下

图片
图片

也就是由 Object(h["o"])("randomRequest", !0) 生成。同样通过控制台跟进Object(h["o"])

图片
图片

来到 f(t,e) 函数,如下

图片
图片

具体代码如下

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
function f(e, t) {
            e = "bqzt_" + e;
            var a = "sessionStorage";
            if (/mqqbrowser/i.test(window.navigator.userAgent) && (a = "localStorage"),
            window[a]) {
                var i = window[a][e] || "";
                return t && i && (i = JSON.parse(i)),
                i
            }
            console.log("当前浏览器不支持sessionStorage")
        }

分析这段代码,发现是正则匹配是否是QQ浏览器的user-agent来判断存储位置,如果正则匹配满足 /mqqbrowser/i ,则存储e到localStorage,如果不满足,则e存储到sessionStorage

而这里的f(e,t)函数中,e是什么呢,这里我们直接查看sessionStorage,也就是会话储存,发现e就是AES加解密的key和iv。

图片
图片

debug到这一步,问题解决的关键就在于sessionStoragelocalStorage

当页面刷新时sessionStorage会发生变化,导致key和iv发生变化,我们设置的硬编码就失效了。而localStorage并不会随着页面刷新而重置,它存储于浏览器当前状态。

所以我们只需要将user-agent更换为QQ浏览器即可将bqzt_randomRequest存储进localStorage。 这里解释一下为什么改为localStorage就能动态获取key和iv,因为在js注入后,存储的也是sessionStorage,刷新就会消失。而存储为localStorage之后,只要保持jsrpc注入的页面和具体渗透测试的页面处于同一浏览器即可。

最后一步,我们需要修改注册的action,将key和iv分别利用 localStorage 来获取。具体代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
client.registerAction("aes_enc", function (request, resolve, reject) {
    resolve(enc(request["enc_par"],JSON.parse(localStorage.getItem("bqzt_randomRequest")).dfg,JSON.parse(localStorage.getItem("bqzt_randomRequest")).cvb));
});

到这问题基本解决了,autoDecoder中效果图如下。

图片
图片

后续笔者也成功通过此加解密技巧,成功挖掘出高危漏洞。

参考

https://sekiro.iinti.cn/sekiro-doc/ https://github.com/f0ng/autoDecoder

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
作者已关闭评论
暂无评论
推荐阅读
编辑精选文章
换一批
Src挖掘-某众测前端解密学习记录
某次大型金融公司众测,抓包发现都是加密数据,经过Jsrpc与autoDecoder学习调试后,最后也是成功还原数据包,挖掘出高危漏洞。分享经验,希望对大家有所帮助。
亿人安全
2024/04/19
3620
Src挖掘-某众测前端解密学习记录
js前端加密绕过-Jsrpc
JSRPC(JavaScript Remote Procedure Call)是一种基于 JavaScript 的远程过程调用协议,用于实现客户端和服务器之间的通信和函数调用。它允许开发人员在客户端 JavaScript 代码中调用远程服务器上的函数,以便获取数据、执行操作或获取服务。
Elapse
2023/07/11
1.5K0
js前端加密绕过-Jsrpc
RPC 技术及其框架 Sekiro 在爬虫逆向中的应用,加密数据一把梭!
RPC,英文 RangPaCong,中文让爬虫,旨在为爬虫开路,秒杀一切,让爬虫畅通无阻!
K哥爬虫
2022/02/25
3.6K0
RPC 技术及其框架 Sekiro 在爬虫逆向中的应用,加密数据一把梭!
H5页面漏洞挖掘之路(加密篇)
前言 H5移动应用作为个人生活、办公和业务支撑的重要部分,也面临着来自移动平台的安全风险,不仅仅来自于病毒,更多的是恶意的攻击行为、篡改行为和钓鱼攻击。关于H5页面的安全测试,业务逻辑功能测试基本和WEB渗透测试是通用的。 从业务安全角度考虑,一般客户端与服务端通信会进行加密,防止被刷单、薅羊毛等攻击,需要对数据加密加密处理。所以我们必须了解各种加密方式。开发者常会用到AES(Advanced Encryption Standard)加密算法,在此对H5页面的漏洞挖掘案例分享给大家。 前置知识 AES加密模
FB客服
2023/04/26
1.9K0
H5页面漏洞挖掘之路(加密篇)
玩转 JS 逆向:RPC 加持,爬虫效率飙升
一些复杂的网站针对参数是层层加密,如果选择硬刚,去扣代码、补环境,耗时耗力的同时,不一定能获取完整的加密逻辑
AirPython
2023/08/22
1.1K0
玩转 JS 逆向:RPC 加持,爬虫效率飙升
PHP AES加解密:用代码为数据加上保护的盾牌
在网络世界里,数据的传输和存储是一个敏感而重要的问题。为了保护数据的安全性,加密算法是一项不可或缺的技术。而在PHP中,AES(Advanced Encryption Standard)加解密算法是一种常用的选择。本篇博客将深入解析PHP中的AES加解密,让我们一起为数据加上一层坚固的保护盾牌。
繁依Fanyi
2024/01/28
5090
ASP.NET Core 数据加解密的一些坑
ASP.NET Core 给我们提供了自带的Data Protection机制,用于敏感数据加解密,带来方便的同时也有一些限制可能引发问题,这几天我就被狠狠爆了一把
Edi Wang
2019/07/08
1.7K0
ASP.NET Core 数据加解密的一些坑
永强教你加解密:对称篇(一)
大家好,我是永强,就是老李之前经常给你们说的区块链大神、大学肄业却依然大公司iOS主程一波儿流、只生活在老李口中尚未真实露面的混工资高手、老王的左膀右臂 ——— 赵永强。我和尼古拉斯赵四之间并没有什么强关联,我只是单方面认识他而已。
老李秀
2019/11/12
1.1K0
高效处理流量加解密——Burpy
先来地址:Github: https://github.com/mr-m0nst3r/Burpy
黑伞安全
2021/01/04
2.5K0
高效处理流量加解密——Burpy
漏洞挖掘|遇到APP数据加密如何解密测试
https://www.freebuf.com/articles/mobile/413935.html
亿人安全
2024/11/26
2700
漏洞挖掘|遇到APP数据加密如何解密测试
使用 Nginx NJS 实现高性能的 RSA 加解密服务
在之前的文章《编写 Nginx 模块进行 RSA 加解密》中,我提到了如何编写 Nginx 模块,并借助 Nginx 实现相对高性能的加解密。正巧 Nginx 新版本发布,初步具备了原生“RSA加解密”能力。
soulteary
2021/11/25
2.3K0
使用 Nginx NJS 实现高性能的 RSA 加解密服务
python笔记43-加解密AES/CBC/pkcs7padding
有些公司对接口的安全要求比较高,传参数的时候,不会明文的传输,先对接口加密,返回的数据也加密返回。
上海-悠悠
2019/10/24
3.6K0
前后端请求AES加解密
AES前后端加解密 前端 安装依赖 npm install --save crypto-js 工具类 const CryptoJS = require("crypto-js"); exports.aes = { // 加密 encrypt: function (str, key) { return CryptoJS.AES.encrypt(str, key).toString(); }, //解密 decrypt: function (str, key) { let b
码客说
2021/05/13
6.1K0
crypto-js aes 加解密
前段时间公司做项目,该项目涉及到的敏感数据比较多,经过的一波讨论之后,决定前后端进行接口加密处理,采用的是 AES + BASE64 算法加密~
江一铭
2022/06/17
7.7K0
渗透|记一次不存在的加解密实战渗透
2.当我们作为一个毫无办法的新手时,我们需要做的第一件事就是“搜”。 3.搜什么呢?如上图数据包,哪里加密搜哪里。这里搜frameUrlSecretParam与frameBodySecretParam。 4.我们的frameUrlSecretParam搜出来存在与一段混淆加密的js里。
亿人安全
2023/09/25
4980
渗透|记一次不存在的加解密实战渗透
极简加解密库--使数据传输更加安全
AES加密标准又称为高级加密标准Rijndael加密法,是美国国家标准技术研究所NIST旨在取代DES的21世纪的加密标准。AES的基本要求是,采用对称分组密码体制,密钥长度可以为128、192或256位,分组长度128位。AES算法是最为常见的额对称加密算法之一。
Rice加饭
2023/03/03
6320
极简加解密库--使数据传输更加安全
python3下常用编解码与加解密
Python3相对于Python2的一大改变就是,对默认字符类型进行了修改。Python2中定义字符串默认为二进制字符串,强制加前缀u的才是unicode字符串;而Python3中字符串默认为unicode,强制加前缀b的才是二进制字符串。(也就是刚好反过来了)
上帝De助手
2019/09/18
1.6K0
前端 实战项目·图片加解密二三事
近来公司新项目管理后台需要做图片上传并加解密功能,加密在服务端进行,加密成功后返回加密后图片地址,后台负责解密在线图片然后预览,折腾一天,此中曲折,闲做记录。
数媒派
2022/12/01
2.1K0
OpenSSL 使用AES对文件加解密
AES(Advanced Encryption Standard)是一种对称加密算法,它是目前广泛使用的加密算法之一。AES算法是由美国国家标准与技术研究院(NIST)于2001年发布的,它取代了原先的DES(Data Encryption Standard)算法,成为新的标准。AES是一种对称加密算法,意味着加密和解密使用相同的密钥。这就要求密钥的安全性非常重要,因为任何拥有密钥的人都能进行加密和解密操作。其密钥长度,包括128位、192位和256位。不同长度的密钥提供了不同级别的安全性,通常更长的密钥长度意味着更高的安全性。
王 瑞
2023/11/29
1.8K0
OpenSSL 使用AES对文件加解密
京东h5st4.7逆向分析
本文章中所有内容仅供学习交流使用,不用于其他任何目的,不提供完整代码,抓包内容、敏感网址、数据接口等均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关!
K哥爬虫
2024/05/13
1.7K1
相关推荐
Src挖掘-某众测前端解密学习记录
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档