abhayclasher/CVE-2026-33331

GitHub: abhayclasher/CVE-2026-33331

一个演示 oRPC OpenAPI 文档插件存储型 XSS 漏洞(CVE-2026-33331)的本地实验环境,帮助理解 JSON 嵌入 HTML 时的编码缺陷及修复方案。

Stars: 0 | Forks: 0

# CVE-2026-33331 — oRPC OpenAPI Reference Plugin 中的存储型 XSS

CVE GHSA CWE-79 Patched

oRPC OpenAPI 文档生成中存储型 XSS 的概念验证实验环境

## 目的 oRPC 根据 OpenAPI 规范构建 API 文档页面。在 v1.13.9 之前,它使用 `JSON.stringify()` 直接将规范转储到 ` ``` `JSON.stringify()` 生成有效的 JSON,但不会转义 `<` 或 `>`。即使在 `` 视为 HTML 结束标签。 在 `info.description` 中触发执行的载荷: ``` "" ``` 浏览器看到的内容: ``` "}} ``` 第一个 `` 关闭了代码块。其后的所有内容作为内联 JavaScript 执行。 ### 影响 - 通过窃取 cookie 或 token 进行会话劫持 - 冒充查看文档的受害者发起任意 API 调用 - 在受信任的文档域内渲染钓鱼覆盖层 当应用程序根据用户控制的输入构建 OpenAPI 规范时,这种情况就会发生,而这正是 oRPC 通过其路由器定义所实现的功能。 ## 系统要求 - Node.js 18 或更高版本 - Docker(可选,用于容器化实验环境) - 500 MB 可用磁盘空间 ## 设置 ### 选项 1:直接运行 ``` git clone https://github.com/abhayclasher/CVE-2026-33331.git cd CVE-2026-33331/app npm install node server.js ``` ### 选项 2:使用 Docker 运行 ``` git clone https://github.com/abhayclasher/CVE-2026-33331.git cd CVE-2026-33331 docker compose up -d ``` ## 使用方法 服务器启动后,访问以下 URL: | URL | 描述 | |-----|-------------| | `http://localhost:3000/docs` | 易受攻击的文档页面 — XSS 载荷在加载时执行 | | `http://localhost:3000/docs/safe` | 应用了 v1.13.9 修复补丁的同一页面 | | `http://localhost:3000/spec.json` | 原始 OpenAPI 规范 JSON | 易受攻击的版本将在页面加载时触发 `alert()`,确认脚本已执行。修复后的版本会安全地渲染同样的恶意规范 —— 载荷显示为纯文本。 你也可以运行独立的 PoC: ``` cd poc node exploit.js ``` 这将在端口 3000 上启动一个最小服务器,在没有完整应用程序上下文的情况下演示相同的漏洞。 ## 原理解析 ### 检测流程 ``` 1. Attacker controls a field in the OpenAPI spec (e.g. description) 2. oRPC generates the docs HTML with JSON.stringify(spec) 3. The in the payload closes the " │ │ │ │ 2. orpc embeds spec into HTML: │ │ │ │ <-- tag │ │ <-- payload │ │ "}} │ │ │ │ │ │ 3. Browser executes alert('XSS') │ └─────────────────────────────────────────────────────┘ ``` ## 修复方案 版本 1.13.9 引入了 `escapeJsonForHtml()`,在将 JSON 嵌入脚本标签之前,将 HTML 敏感字符替换为 Unicode 转义序列: ``` const escapeJsonForHtml = (obj) => JSON.stringify(obj) .replace(/&/g, '\\u0026') .replace(/'/g, '\\u0027') .replace(//g, '\\u003E') .replace(/\//g, '\\u002F'); ``` Unicode 转义序列之所以有效,是因为它们仍然是有效的 JSON —— `JSON.parse()` 可以重建原始字符串 —— 但在浏览器的解析器看来,它们绝不会像 HTML。 该补丁还从通过 DOM `dataset.config` 属性读取 JSON(当值包含括号时会出错)改为直接将转义后的 JSON 赋值给内联变量。 查看完整提交:[4f0efa8](https://github.com/middleapi/orpc/commit/4f0efa8a1d3fa8e8317a4b03cc3945a5dfd68add) ## 项目结构 ``` CVE-2026-33331/ ├── README.md # This file ├── docker-compose.yml # Docker lab configuration ├── app/ │ ├── Dockerfile # Container build configuration │ ├── package.json # Node.js dependencies │ └── server.js # Vulnerable + patched docs renderer └── poc/ └── exploit.js # Standalone minimal proof-of-concept ``` ## 参考资料 - [NVD — CVE-2026-33331](https://nvd.nist.gov/vuln/detail/CVE-2026-33331) - [GitHub 安全公告](https://github.com/middleapi/orpc/security/advisories/GHSA-7f6v-3gx7-27q8) - [修复提交](https://github.com/middleapi/orpc/commit/4f0efa8a1d3fa8e8317a4b03cc3945a5dfd68add) - [发布 v1.13.9](https://github.com/middleapi/orpc/releases/tag/v1.13.9) - [CWE-79](https://cwe.mitre.org/data/definitions/79.html) 由 [**Abhay Kumar**](https://github.com/abhayclasher) 报告。本仓库仅用于本地教育目的。请勿在公共网络上部署易受攻击的服务器。

仅供教育目的 — 请在隔离环境中使用

标签:API文档安全, CVE-2026-33331, CWE-79, JSON注入, MITM代理, OpenAPI, oRPC, PoC, SDLC, Web安全, 中间件漏洞, 存储型XSS, 安全测试, 攻击性安全, 数据可视化, 暴力破解, 漏洞复现环境, 自定义脚本, 蓝队分析, 请求拦截, 跨站脚本攻击, 输入验证绕过