我是如何在JavaScript中发现一个隐藏角色,并最终变成永久后门的

admin 2026-03-05 19:28:04 网络安全文章 来源:ZONE.CI 全球网 0 阅读模式

文章总结: 作者在某金融平台渗透测试中通过审计JavaScript文件发现未公开的隐藏角色SALES。利用参数后添加空格的技巧绕过API权限校验,成功将该角色赋予测试账户。该漏洞导致严重的权限提升,且由于系统逻辑缺陷,被赋予该角色的账户无法被任何管理员修改或删除,形成永久后门。建议安全测试人员重视JS文件分析,挖掘隐藏功能与逻辑漏洞。 综合评分: 88 文章分类: WEB安全,渗透测试,代码审计,SRC活动,漏洞分析


cover_image

我是如何在 JavaScript 中发现一个隐藏角色,并最终变成永久后门的

haidragon haidragon

安全狗的自我修养

2026年3月5日 12:45 湖南

官网:http://securitytech.cc


Whoami & 发现过程

我的名字是 Adnane,AKA 0xhun73r,我是一名安全研究员。

在这篇文章中,我将分享我最近在一个漏洞赏金项目中发现的一个有趣问题。

几天前, 我正在 HackerOne 上测试一个私有漏洞赏金项目。 这个项目有点复杂, 所以我花了几天时间测试它的各种功能。

当我感觉自己已经测试完所有功能、准备转向下一个目标时,我决定先停下来重新检查一遍

我心想:

“在离开之前,再看一遍 JavaScript 文件吧。”

我的直觉告诉我:也许那里隐藏着什么东西。

事实证明,我的直觉没有错。


关于目标系统

这个应用允许企业安全访问用户的金融账户,并管理相关金融数据。

系统角色

  • Owner 对整个平台拥有完全控制权
  • Admin 管理控制台、团队成员以及所有客户请求
  • Developer 访问控制台,但只能管理自己的客户请求
  • Agent 只能处理自己的客户请求

漏洞总结

在分析目标应用时,我发现了一个严重的权限提升漏洞

系统中存在两个隐藏角色

SALES
PAYMENTS_AGENT

这些角色:

被嵌入在 JavaScript 文件中,但在 UI 界面中完全不可见。

正常情况下:

API 会阻止分配 SALES 角色

但是通过一个简单的技巧:

在角色值后面加一个空格

"SALES "

就可以绕过限制

这意味着任何拥有 Team Management(团队管理)权限 的用户都可以:

  • 访问整个 Dashboard
  • 管理团队成员(添加 / 删除)
  • 处理所有客户请求
  • 发送邀请

最严重的问题是:

一旦这个角色被赋予:

该账号将变成永久存在。

即使是 Owner 也:

  • 无法修改
  • 无法降级
  • 无法删除

这相当于在系统中创建了一个:

不可检测的永久后门。


漏洞复现步骤


1. 发现隐藏角色

在分析应用的 JavaScript 文件 时,我发现了这些未文档化的角色

"role": "SALES"
"role": "PAYMENTS_AGENT"

这些角色:

在前端完全隐藏,且无法通过正常 UI 分配。


2. 尝试邀请用户为 SALES 角色

我使用一个拥有 “邀请并管理团队成员”权限 的账户。

然后使用 Burp Suite 拦截邀请请求,并把 role 改成:

SALES

请求

POST /api/teams/{team_id}/invite HTTP/2
Host: dashboard-api.redacted.com
Authorization: Bearer <JWT_TOKEN>
Content-Type: application/json

{
&nbsp; "email": "[email protected]",
&nbsp; "role": "SALES"
}

返回

HTTP/2 400 Bad Request

请求被立即拒绝。

说明 API 禁止在创建成员时赋予 SALES 角色


3. 尝试修改已有成员角色

接着,我尝试修改现有团队成员的角色为 SALES

请求

PUT /api/teams/{team_id}/users/{user_id}/roles/default HTTP/2
Host: dashboard-api.redacted.com
Authorization: Bearer <JWT_TOKEN>
Content-Type: application/json

{
&nbsp; "userId": "{user_id}",
&nbsp; "role": "SALES"
}

返回

HTTP/2403&nbsp;Forbidden

{
&nbsp; "code":&nbsp;40304,
&nbsp; "message":&nbsp;"Sales role cannot be granted or revoked"
}

点击或按回车查看完整图片

返回结果明确说明:

系统明确禁止授予或撤销 SALES 角色


4. 绕过限制的方法

我尝试了很多绕过方式都失败了。

然后我想到一个简单的方法:

在角色值后面加一个空格

"SALES "

修改后的请求

PUT /api/teams/e6b10541-d3df-41fe-88a0-00f29a5bee9a/users/dc28f5e9-bbfd-4312-90c9-1c8f8255da53/roles/default HTTP/2
Host: dashboard-api.redacted.com
Accept: application/json, text/plain, */*
Authorization: Bearer (jwt)
Content-Type: application/json

{
"userId":"dc28f5e9-bbfd-4312-90c9-1c8f8255da53",
"role":"SALEs "
}

返回

HTTP/2 204 No Content

点击或按回车查看完整图片

204 No Content 表示请求成功执行。


5. 验证结果

成功请求之后,我检查了该用户的权限。

发现获得了以下权限:

[
&nbsp; {
&nbsp; &nbsp; "name":&nbsp;"DashboardAccess",
&nbsp; &nbsp; "description":&nbsp;"访问整个控制台"
&nbsp; },
&nbsp; {
&nbsp; &nbsp; "name":&nbsp;"SendInvites",
&nbsp; &nbsp; "description":&nbsp;"向客户发送邀请"
&nbsp; },
&nbsp; {
&nbsp; &nbsp; "name":&nbsp;"ManageRequests",
&nbsp; &nbsp; "description":&nbsp;"可以处理任何客户请求"
&nbsp; },
&nbsp; {
&nbsp; &nbsp; "name":&nbsp;"TeamManagement",
&nbsp; &nbsp; "description":&nbsp;"可以邀请和管理团队成员"
&nbsp; },
&nbsp; {
&nbsp; &nbsp; "name":&nbsp;"SalesDemo",
&nbsp; &nbsp; "description":&nbsp;"向客户演示产品"
&nbsp; }
]

点击或按回车查看完整图片

更严重的是:

这个用户变得无法被修改或删除。

我回到团队 Dashboard,尝试删除该用户,但系统不断报错:

Sales role cannot be granted or revoked

点击或按回车查看完整图片

点击或按回车查看完整图片

结果:

  • 任何用户,包括 Owner,都无法修改该用户角色
  • 尝试删除该成员也会失败

漏洞影响

这个漏洞允许任何拥有 TeamManagement 权限 的用户:

将其他成员提升为隐藏角色 SALES。

从而:

  • 绕过系统的权限模型
  • 打破角色层级控制

更严重的是:

一旦赋予 SALES 角色

即使 Owner 也无法撤销。

这意味着:

系统中会存在一个

永久的高权限账号(Persistent Backdoor)。


进一步影响

该账户将获得完整管理能力:

  • 完整 Dashboard 访问
  • 团队成员管理
  • 客户请求处理
  • 发送邀请
  • 使用 SalesDemo 特权功能

而 SalesDemo 权限

普通 Admin 并不具备。

也就是说:

SALES 权限实际上比 Admin 更高。


攻击可扩展性

这个问题还可以规模化利用

攻击者可以:

  • 提升多个用户
  • 建立持久访问
  • 最终接管整个团队


漏洞报告结果

我将该漏洞报告为:

High(高危)

但平台将其评级改为:

Low(低危)

目前我仍在等待他们:

重新评估漏洞严重性。


一个建议

给目标系统足够时间去修复。

一定要仔细检查 JavaScript 文件。

即使你觉得自己已经测试完所有功能。


感谢阅读

  • 公众号:安全狗的自我修养
  • vx:2207344074
  • http://gitee.com/haidragon
  • http://github.com/haidragon
  • bilibili:haidragonx

#

#


免责声明:

本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。

任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。

本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我

本文转载自:安全狗的自我修养 haidragon haidragon《我是如何在 JavaScript 中发现一个隐藏角色,并最终变成永久后门的》

评论:0   参与:  0