【渗透日记】请求和返回加密环境下的JS逆向解密及垂直越权案例

Mangofang 发布于 2026-03-21 372 次阅读


使用的软件:

  1. BurpSuite
  2. CloudX(BurpSuite插件)
  3. AntiDebug_Breaker(Chrome插件)
  4. VueCrack(Chrome插件)(可选)

前言

懒狗之力又发作了,本来这是一个毫无悬念的拿下的高危越权,但是在我的再三摆烂下目标最终将这个站点屏蔽了外网访问。但是好在这是主包自己学校的站点,接上校园网给各位师傅分享一个这个案例,文章涉及一部分经验技巧分享,略长。

注:目标站点使用Webpack打包,同时开启了Source Map,这一定程度上降低了逆向难度,故该处只对思路和原理进行解析,具体情况可能会更加棘手。

文中所涉及的技术、思路和工具仅供以安全为目的的学习交流使用,任何人不得将其用于非法用途以及盈利等目的,否则后果自行承担!


1、注册接口发现

上来还是一手登录框,发现前端使用的是Vue框架,Vue框架的话可以使用AntiDebug_BreakerVueCrack清除路由守卫,同时解析Vue Router。关于这两个插件,在清除路由守卫和解析路由的功能上几乎是完全一样的,但是AntiDebug_Breaker还有反反调试的功能,后续也会用到

通过插件发现目标站点似乎有多个登录页,其中一个/loginpage的页面下存在一个”校外用户注册“的按钮

没什么好说的,先注册一个张三

2、JS逆向前端加密

登录进来抓包可以发现该系统的请求体存在加密,同时返回Json中的data字段也是加密

这里让AI绘制了一个图,方便第一次接触前端加密的师傅理解。可以看到在这个案例的流程中(非对称加密且不存在密钥交换),请求体是在前端完成的加密,同时后端的消息也是前端负责解密的,那么我们自然可以通过前端的逆向来获悉它的加解密逻辑

在逆向开始之前,我先说明一下逆向是需要拿到什么数据加密方式、密钥

2.1、JS逆向技巧一 —— 关键字搜索

打开开发人员工具,我们可以通过全局搜索(Ctrl+Shift+F)诸如:crypt、cryptojs、jsencrypt、jiami、jiemi、padding等关于加密的关键字定位JS的加解密函数位置

例如此处我通过搜索cryptojs发现目标站点使用的是cryptojs来进行加密的,成功定位到函数位置

需要注意的是,在这个案例当中,目标站点使用了Webpack进行打包,但由于开启了Source Map导致我们可以直接在开发人员工具的Webpack://中看到打包前的源代码,大大方便了我们的逆向。如果目标未开启Source Map,需要自行对打包的代码进行分析,如下所示,可以看到也可以大概看出端倪,建议直接丢给AI

2.2、JS逆向技巧二 —— 断点

我们最开始是无法确定从什么地方开始断点的,同时如果代码存在混淆,也无法很好的找到一个入口点打下第一个端点,我在这边推荐一个我平时使用的比较笨蛋的办法,如果有师傅有更好的办法欢迎分享。

首先我们需要找一个功能相对来说简单的功能点同时此处会进行网络请求(有网络请求意味着该处无论如何都会进入加解密函数进行加解密操作),这个操作实际上是找到一个会执行完整加解密流程的功能点

例如如下这个功能点,当我点击”编辑收藏“后,同时前端会发送一个/subadmin的加密请求,然后后端会返回一个可用的收藏列表的加密数据前端解密后显示

这就是一个会触发完整加解密操作的功能点

那么此处我们可以下一个鼠标点击的事件断点,当我们点击”编辑收藏“后停止程序,进入调试,然后观察点击这个按钮后会发生什么,因为最终浏览器会将密文发送到服务器,所以这个过程一定会进入加解密操作,需要留意这一过程

断下来后,我们可以看到请求的入口函数,此时可以判断params就是未被加密的原始数据,它将params传入data,后续我们需要不断的确定data参数的更改情况

如果是临时测试某些关键功能点,此处可以直接在控制台中设置该处的值然后继续运行程序,这样在后续执行的过程中一样会将我们修改的值进行加密后发送请求

经过多次调试和步进后,最终会发现在某处存在修改data的操作关于加密的。如下所示,此时data还是明文的原始数据

当我们步过这个函数执行后,可以看到data已经被修改成密文了,那么加密就是在刚才的函数调用中执行的。

我们可以在这个位置下一个新的断点,并关闭鼠标的点击事件断点,不然每次都得从头开始断

然后再次调试,来到这个位置后进入函数执行,即可来到加密函数位置

那么接下来就是分析目标位置的加密算法和密钥了。这个案例比较简单,已经写明了是AES+CBC,同时在注释中也拿到了Key

2.3、JS逆向技巧 —— AntiDebug_Breaker插件Hook

这个方案只限于目标站点使用CryptoJs或JSEncrypt这两个JS库来实现的加密的站点

我们可以直接使用插件开启CryptoJs hookJSEncrypt hook这两个选项,如果目标站点使用这两个库加密,插件可以帮我们hook加密算法,并输出密钥

开启后,刷新网站触发一次加解密执行观察控制台输出即可

输出的是Hex,还需要转换一下

3、漏洞发现

在获得站点的加密方式和密钥后,如果是公开算法,比如AES、DES、SM,我推荐使用CloudX插件对请求和返回进行自动加解密。如果是自实现加密算法,目前CloudX还不能编写脚本,推荐使用Galaxy自己根据目标站点编写脚本

在配置完成后,我们就能直接明文查看,明文编辑和重放包了,后续就是常规测试了。具体的使用方式可以参照官方github页面的文档

在主页看到一个”切换角色“的功能点,这种地方如果对权限限制不好,比较容易造成越权

点进去似乎只有一个学生的角色,点击提交抓包看看有什么有用的信息

可以看到传入了一个roleids的数组,数组中有一个元素——21,然后服务器似乎会返回路由。那么可以推测21是就是学生角色的id,如果我们可以找到管理员的id,是否可以获得管理员的路由?运气好也许可以越权。

此处可以通过遍历roleids中的数据,观察返回的data大小,来判断是否为管理员的id。

最终确定16应该是一个高权限角色ID,其路由多次出现管理字样

我们在此前切换角色处抓包,修改roleids为16,拿到角色的路由

但是遗憾的是,只是路由,实际上没有权限。这个在我们通过Vue Router手动打开目标页面一样,目标页面接口存在鉴权

就在这一筹莫展之际,一个小发现打破了僵局

我使用刚刚获取到的高权限角色路由,随缘打开基础设置后停在了这个页面,然后想看看修改密码处会不会有什么逻辑漏洞?但是修改密码居然提示”无此权限“?怎么的草台班子难道没有实现修改密码的功能?

迷茫之下刷新了一些页面,想着可能是有什么小bug吧,刷新之后回到了主页面,再次点击修改密码

嗯?不兑,在反复测试了几遍后发现,在主页面可以修改密码,在其他无权限页面就无法修改。这是怎么回事。

观察一下两遍的请求包,看看有什么不同,就直到是什么导致的一个有权限一个没权限了

想必大家对比上下两图应该可以看出,两个包只有Header中的Router参数不同,也就是说Router参与了鉴权,同时该处可控

Router在这里是Vue的路由,程序员没有对单独的接口进行逐一鉴权,而是通过将Session中的角色与Router进行鉴权

那么我们可以通过BurpSuite的设置,通过设置一个替换将Router中的所有值都替换为/worktable/worktable是所有角色的基本Router,故都是有权限的

在设置中找到HTTP match and replace rules

添加一个正则,匹配Router,然后全部替换固定为Router: /worktable

这样在每次请求的时候,Router就会被固定为/worktable

我们再来测试通过前面获取高权限角色路由来测试一下是否可以越权。

成功越权

此作者没有提供个人介绍。
最后更新于 2026-03-21