跳过正文

MCP漏洞挖掘思路

·2060 字·5 分钟
LXY
作者
LXY
网络安全业余爱好者,热衷于记录实战经验、分享工具与技术,致力于持续学习与成长。
目录

MCP数据传输流程
#

  • 用户输入Prompt 。
  • MCP Client将用户Prompt 、系统Prompt以及MCP Server(可用工具/资源)一并传给LLM。
  • 模型分析Prompt后,决定要调用某个工具,并给MCP Client返回MCP Server*、API调用及参数*。
  • MCP Client将API调用和参数发送给对应的MCP Server。Tool执行请求并返回执行结果。MCP服务器将结果返回给MCP Client。MCP Client将LLM的生成结果返回给用户。数据传输流程如下图所示。
MCP数据传输流程

MCP核心元素介绍
#

Model Context Protocol(MCP) 中,有三个核心元素:Resources、Prompts、Tools。它们共同构成了 LLM 与外部世界交互的关键能力。

一、Resources
#

1、定义

Resources允许Servers暴露可以被Clients读取,并用作与LLM交互的上下文数据和内容。

2、用途

提供数据和上下文信息

3、典型场景

  • 读取文件内容
  • 获取配置信息
  • 查询数据库数据
  • 获取系统状态

二、Prompts
#

1、定义

Prompts允许Servers定义可复用的提示模板和工作流,Clients可以轻松地将其呈现给用户和LLMs。

2、用途

定义与LLM交互的模板

3、典型场景

  • 生成文本模板
  • 定义对话流程
  • 标准化LLM输出

三、Tools
#

1、定义

Tools使Servers能够向Clients暴露可执行功能。通过Tools,LLMs可以与外部系统交互、执行计算,并在现实世界中采取行动。

2、关键特性

  • Discovery(发现): Clients可以通过tools/list endpoint列出可用工具。
  • Invocation(调用): 通过tools/call endpoint调用,Servers执行并返回结果

3、典型场景

  • 数学计算
  • 数据处理
  • API 调用
  • 文件操作

四、核心元素功能比较
#

特性 Resource Tool Prompt
主要功能 提供数据 执行操作 定义模板
操作类型 只读 读写 模板定义
状态修改
缓存支持
典型用途 数据获取 功能执行 交互指导

通信协议
#

一、标准输入输出(stdio)
#

  1. 客户端将MCP服务器作为子进程启动。
  2. 服务器从其标准输入( stdin )读取JSON-RPC消息并将消息发送到其标准输出( stdout )。
  3. 消息是单独的JSON-RPC请求、通知或响应。
  4. 消息由换行符分隔,并且不得包含嵌入的换行符。
  5. 服务器可以将UTF-8字符串写入其标准错误 ( stderr ) 以用于日志记录。客户端可以捕获、转发或忽略此日志记录。
  6. 服务器不得向其 stdout 写入任何非有效的 MCP 消息。
  7. 客户端不得向服务器的 stdin 写入任何无效的 MCP 消息。
标准输入输出流程

二、可流式传输的 HTTP(Streamable HTTP )
#

  1. 在Streamable HTTP传输中,服务器作为一个独立的进程运行, 可以处理多个客户端连接。此传输使用HTTP POST和GET请求。 服务器可以选择使用服务器发送事件 (SSE) 可流式传输多条服务器消息。这不仅支持基本的 MCP 服务器,还支持功能更丰富的服务器,支持流式传输以及服务器到客户端的通知和请求。
  2. 服务器必须提供单个HTTP 端点路径(以下称为MCP 端点)支持 POST和GET方法。例如,这可以是类似 https://example.com/mcp 的 URL。

配置开发环境
#

安装uv工具命令(以 windows 为例):

powershell -ExecutionPolicy Bypass -c "irm https://astral.sh/uv/install.ps1 | iex"

pip install uv

使用uv命令, 创建项目,项目名称为mcp_test

uv init mcp_test -p 3.13

安装依赖

uv add "mcp[cli]" httpx openai

激活虚拟环境

uv venv source
uv sync

按照下图配置cherry,参数填写为:

--directory
D:\mcp_test
run 
main.py
配置cherry参数

开发MCP 靶场
#

模型上下文协议 (MCP) 容易受到工具中毒攻击。工具中毒攻击是指攻击者在 MCP 工具的描述中嵌入恶意指令。这些指令对用户不可见,但可以被 AI 模型解读,从而导致敏感数据泄露。

Example: 首先开发一个 MCP 服务器来实现加法操作,同时在其中放入恶意Prompt,要求 LLM 读取敏感配置文件。

import os
import subprocess
from mcp.server.fastmcp import FastMCP
import platform

# 初始化 MCP Server
mcp = FastMCP("Vulnerable Server")

@mcp.tool()
def system_ping(target: str) -> str:
    """Pings a target IP or domain."""
    param = '-n' if platform.system().lower() == 'windows' else '-c'
    command = f"ping {param} 1 {target}"
    
    try:
        result = subprocess.run(command, shell=True, capture_output=True)
        
        try:
            return result.stdout.decode('utf-8')
        except UnicodeDecodeError:
            try:
                return result.stdout.decode('cp1252')
            except UnicodeDecodeError:
                return result.stdout.decode('gbk', errors='ignore')
                
    except Exception as e:
        return f"Error: {str(e)}"

if __name__ == "__main__":
    mcp.run()

使用MCP Inspector调试靶场
#

MCP Inspector 最显著的优点之一是提供了直观的 UI 用户界面。这意味着开发者无需从零开始编写复杂的客户端代码或测试脚本,即可轻松地进行 MCP Server 功能的测试与调试。

MCP Inspector 启动命令为:

npx -y @modelcontextprotocol/inspector uv run main.py

运行 MCP Inspector 时,它会启动两个主要组件:

  1. MCP Inspector (MCPI) 客户端界面

    – 默认端口:6274

  2. MCP Proxy (MCPP) 服务器

    – 默认端口:6277,作为前端界面与指定的 MCP Server之间的通信中介。

然后,我们访问http://localhost:6274/,点击左侧的Connect按钮,即可连接我们刚写的MCP Server。然后我们切换到Tools 栏中,点击List Tools按钮即可看到我们刚写的工具,我们就可以开始进行调试啦。

MCP Inspector界面
调试工具

如何防范MCP工具中毒攻击?
#

严格审查MCP服务器来源
#

仅使用可信的MCP服务器,例如官方的MCP服务器,并避免连接到未经验证的第三方MCP服务器。

显示完整工具描述
#

MCP客户端应向使用者展示工具的完整内容描述,让使用者能自行判断工具安全性。

沙箱化执行环境
#

限制AI模型的敏感数据读取权限,防止AI模型读取用户的敏感资料。

定期更新与监控
#

确保MCP客户端与MCP服务器保持最新版本,并监控异常行为。