Skip to content

[安全漏洞] 全局路由存在 CORS 配置缺陷,导致跨站凭据劫持与私有网络边界穿透风险 #167

@recomvery566j

Description

@recomvery566j

问题描述
在审查 自建 站点的网络请求时,发现包括 /admin 管理后台以及 /icons/* 在内的路由存在严重的跨源资源共享(CORS)配置缺陷。服务端逻辑会对任意请求的 Origin 头部进行无条件反射,并同时开启了 Access-Control-Allow-Credentials: true 与 Access-Control-Allow-Private-Network: true。

此配置允许任何第三方恶意站点在用户浏览器的后台发起跨域请求,携带管理员的登录凭据直接读取后台敏感数据。该配置项将内网设备暴露于公网恶意页面的攻击范围之中。

复现步骤

步骤一:验证 Origin 动态反射与凭据允许配置
使用终端执行以下探测命令,伪造外部请求源:

Bash
curl -I -X GET "https://自建域名/admin"
-H "Origin: https://evil.com"
观察服务端的响应头,服务端返回了高危的头部组合:

Plaintext
access-control-allow-origin: https://evil.com
access-control-allow-credentials: true
access-control-allow-private-network: true

步骤二:构造跨站利用脚本(PoC)
在任意外部域名(例如 https://evil.com)的前端页面或控制台中运行以下 JavaScript 代码,模拟已登录管理员被诱导访问恶意网站的场景:

JavaScript
fetch("https://自建域名/admin", {
method: "GET",
credentials: "include"
})
.then(response => response.text())
.then(data => console.log("窃取到的后台数据:", data));
由于 CORS 策略被服务端完全放行且允许携带凭据,浏览器会自动带上目标站点的有效会话(Cookie 或 Authorization Header)。恶意网站能够绕过同源策略,成功读取并窃取 /admin 页面的完整响应内容。

危害评估
管理员会话无感知劫持:高熵密码与防爆破机制在此漏洞前失去防御作用。攻击者无需知晓密码,仅需诱导处于活跃登录状态的管理员访问第三方链接,即可利用其现有会话读取后台结构,进而调用管理 API 执行越权操作。

敏感设备信息泄露:响应头 access-control-allow-headers 显式允许了 X-Device-Identifier、Bitwarden-Client-Name 等涉及密码管理器与设备的敏感字段。攻击者可通过跨站请求窃取用户的设备特征与身份标识。

私有网络边界穿透:access-control-allow-private-network: true 配置允许外部公网页面向用户的局域网环境发起探测。攻击者可利用当前站点的 Worker 代理作为入口,对内网服务发起跨协议攻击。

修复建议
移除动态反射逻辑:管理后台路由必须严格禁止跨域请求,明确将 Access-Control-Allow-Origin 绑定为唯一的业务主域名,严禁提取请求头中的 Origin 变量直接作为允许跨域的依据。

严格隔离凭据配置:对于提供公共图标代理的通用路由(如 /icons/*),必须将 Access-Control-Allow-Credentials 设置为 false,彻底剥离该接口处理用户身份会话的能力。

禁用私有网络访问声明:立即在所有路由的响应头中移除 access-control-allow-private-network: true,阻断外部网页发起本地网络请求的授权路径。

细化边缘节点权限控制:在 Cloudflare Worker 的代码逻辑中,将公共静态资源代理逻辑与后端管理逻辑进行物理拆分。对 /admin 及其子路径强制实施独立的前置身份校验与 IP 白名单过滤机制。

我是通过gemin分析请求时发现的,由于我看到如下请求有返回https://自建域名/icons/www.bilibili.com/icon.png 正常的图标,但是我害怕存在https://自建域名/icons/www.google.com/robots.txt 这种代理构建,实际上会拦截,但是curl构建的请求就出现了问题,正常不应该返回的,但是返回了数据

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions