找回密码
立即注册
搜索
热搜: Java Python Linux Go
发回帖 发新帖

2598

积分

0

好友

362

主题
发表于 3 天前 | 查看: 11| 回复: 0

本文仅用于网络安全研究与学习,请勿用于任何非法活动。

介绍

今天分享一个我在漏洞赏金计划中发现的独特且值得深思的漏洞。这个漏洞来自 Bugcrowd 上一个著名的公开计划。出于保密,我无法透露目标公司的具体名称,这里我们称其为“redacted.com”。

REDACTED 是一个企业级客户互动管理平台,它像是一个中心枢纽,支持团队、销售团队等可以在这里协作、回复客户并跟踪所有对话。

该平台采用了租户模式,每家公司都拥有自己独立的工作空间。在本次测试中,我可以创建租户并分配任意角色,从而测试不同访问级别的安全性。

平台功能繁多,但我们需要重点关注两个核心实体:

对话: 团队成员与客户之间的所有消息记录,包括支持聊天、邮件等任何互动。

联系人: 客户本身,他们可能来自邮件、WhatsApp、Instagram、网站等各种渠道。

团队通过角色和权限管理数据访问,决定谁可以看到什么、处理什么。

理解角色、权限和实际目标

要找到突破口,首先必须理解 REDACTED 的访问控制模型。该平台采用了精细化的权限系统,每个团队成员的权限都被明确定义,控制着其对资源和操作的访问。

例如:

  • can_access_inbox:允许用户访问对话(只读)。
  • can_access_contacts:允许用户访问租户内的所有联系人信息(只读)。

这仅仅是平台上数百个权限中的两个例子。每项权限都会被独立评估,用户必须拥有相应权限才能与数据交互。

我的目标

我的目标很简单:使用一个零权限(或极低权限)的账户,读取租户中所有敏感的对话记录以及每一位客户的完整联系信息。

对于那些觉得功能繁多的应用难以入手的人,这里有一个略显笨拙但有效的方法(我称之为CTF方法):

首先,使用一个高权限账户(如管理员)在你想要测试的低权限账户本不应访问的对话或联系人中“埋下”标记。

例如,向某个对话发送消息 FLAG{TH3_BYP455_W0RK3D} 或 “IF YOU SEE THIS MESSAGE, IT WORKED!!”。

IF YOU SEE THIS MESSAGE, IT WORKED!! 提示图片

对于联系人,我则创建了一个名为 “Jack Bugcrowd” 的新客户联系人作为标记。

联系人 Jack Bugcrowd 的详情界面

接下来,切换到我权限受限的测试账户,尝试通过常规应用界面访问这些标记。

不出所料,访问被拒绝了,我看到了权限不足的提示。这正是典型的 逻辑漏洞 测试场景起点。

权限受限提示框

那么,我的最终目标就明确了:如何绕过这些权限限制,从受限的对话和联系人数据中取回我埋下的标记?

转折点

在目标应用的主界面尝试了各种方法无果后,我开始跳出常规思维。通过深入搜索该公司的信息,我发现了他们最近推出的一个新功能:为租户集成 MCP 服务器

这个功能允许团队成员将 MCP 服务器连接到他们的账户,进而与任何 LLM(如 Claude, Copilot, Cursor 等)集成。有趣的是,其他研究员似乎并未在应用本身找到这个入口,它需要通过官方博客中的指引手动配置。这引起了我的极大兴趣。

什么是 MCP 服务器?

MCP 服务器是基于模型上下文协议 (Model Context Protocol) 的程序,它向 AI 智能体和大语言模型暴露工具和数据源。

Model Context Protocol 标志

简单来说,MCP 服务器就像是连接 AI 模型与外部服务(如数据库、API)的桥梁。在我们的案例中,REDACTED 的 MCP 服务器提供了多种“工具”,让 AI 能够读取和处理平台内部的数据,比如对话联系人。这些工具类似于编程中的函数,接收参数并返回格式化的数据。

设置 MCP 服务器

说实话,这部分是整个过程中最具挑战性的,可能正是因此,尝试此功能的人不多。

我使用了 Appsecco 的 mcp-client-and-proxy 工具,它能在 MCP 客户端和服务器之间代理流量,方便我们使用 Burp Suite 查看原始的 HTTP 请求。

首先,我们需要一个 mcp_config.json 配置文件,其中包含了启动 MCP 客户端的命令:

{
  “mcpServers”: {
    “REDACTED”: {
      “command”: “npx”,
      “args”: [
        “mcp-remote”,
        “https://mcp.redacted.com/mcp”
      ]
    }
  }
}

将此文件放在工具根目录,然后运行:

python3 app.py --start-proxy

运行后,工具会引导你前往 REDACTED 的授权页面,完成 MCP 应用对你租户的访问授权。

攻击构思与逻辑推演

此时,你可能会想:为什么我要费这么大劲设置 MCP?这和漏洞有什么关系?

关键在于一个简单却至关重要的问题:当平台允许我将 MCP 服务器连接到我的低权限账户时,这个 MCP 应用本身到底继承了哪些权限?它是否严格遵守与我账户相同的访问限制,还是作为一个独立的、可能拥有更广泛权限的“可信实体”在运作?

于是,一个清晰的攻击思路形成了:尝试通过 MCP 服务器提供的工具,而非常规应用界面,去访问那些本应被限制的对话和联系人数据。如果 MCP 集成在后台的处理逻辑与前端不同,就很可能暴露出安全问题。

漏洞复现

MCP 应用已经成功连接到我的低权限账户。启动代理工具后,我可以通过交互式命令行调用各种工具。

MCP工具选择菜单截图

根据文档,“search”工具(ID 5)允许我们使用一种 DSL(领域特定语言)查询语法,类似于 ElasticSearch,来搜索数据。基本语法如下:

object_type:conversations

object_type:contacts

我们首先尝试查询所有对话:object_type:conversations,并通过 Burp Suite 捕获请求。

通过MCP工具搜索对话的HTTP请求与响应

令人惊讶的是,响应返回了租户内所有的对话ID!虽然此时还没有返回具体的消息内容,但这已经是一个关键问题,意味着我可以通过 MCP 接口枚举所有资源。

接下来,使用获取到的对话 ID,例如 conversation_2154710087020397,调用 fetch 工具来获取该对话的完整详情。

通过fetch工具获取特定对话详情的HTTP请求与响应

成功了! 我看到了之前由高权限账户埋下的标记消息:“IF YOU SEE THIS MESSAGE, IT WORKED!!”。权限绕过验证成功!

同样,我们可以搜索联系人标记:

object_type:contacts name:Jack

通过MCP搜索联系人Jack的HTTP请求与响应

再次成功!名为 “Jack Bugcrowd” 的联系人详情被完整返回。

至此,我已经能够通过 MCP 服务器,以低权限账户身份访问租户中的所有受限对话和联系人。该漏洞影响了 MCP 服务器提供的每一个查询工具,使得攻击者可以在没有任何常规界面权限的情况下,查询租户内的任何对象。

更令人惊讶的是,即使将攻击者账户从租户中完全移除,这种通过 MCP 应用的权限绕过仍然有效。 这强有力地证明,MCP 应用是一个独立的实体,其访问控制并未与创建它的用户账户进行正确绑定,这暴露出严重的后端 架构 设计缺陷。

一只闭眼享受的棕色狗表情包
当发现漏洞不是重复报告时的感觉。

简而言之,我们利用了 MCP 服务器这一“桥梁”,绕过了平台前端的权限检查。尽管用户账户权限极低,但与之关联的 MCP 集成却能看到本不该看到的内容,这表明其后台权限验证逻辑存在严重缺失。

漏洞利用

为了展示漏洞的危害性,我编写了一个自动化利用脚本,无需人工点击即可从租户中提取所有对话和联系人,并保存到本地文件中。

自动化脚本提取数据的终端输出截图

结论

这篇文章与其说是对一个具体漏洞的技术剖析,不如说是一次完整的安全研究思维过程分享。它展示了如何通过转换视角、深入研究产品新特性,并在看似复杂的设置中坚持测试,最终获得独特的发现。

在提交这份漏洞报告时,我几乎百分之百确定它不是重复的。这并不是因为漏洞本身多么高深莫测,而是因为完成整个 MCP 设置并耐心测试每一个工具,需要极大的毅力和对细节的关注,我相信大多数安全研究员可能会在半途选择放弃。

最终,这个漏洞被确认是唯一报告,我也获得了相应的奖励。这再次证明,在安全研究的道路上,坚持不懈和跳出思维定式往往能带来丰厚的回报。如果你对这类实战中的安全逻辑缺陷挖掘感兴趣,欢迎在 云栈社区 与我们进行更多交流。




上一篇:Java List循环删除元素详解:常见错误与三种正确实现方法
下一篇:Axios企业级封装实战:从拦截器到网络层构建
您需要登录后才可以回帖 登录 | 立即注册

手机版|小黑屋|网站地图|云栈社区 ( 苏ICP备2022046150号-2 )

GMT+8, 2026-1-24 01:46 , Processed in 0.462939 second(s), 41 queries , Gzip On.

Powered by Discuz! X3.5

© 2025-2026 云栈社区.

快速回复 返回顶部 返回列表