Astro安全漏洞分析:通过头部URL操纵绕过中间件保护

本文详细分析了Astro框架中存在的安全漏洞CVE-2025-64525,攻击者可通过操纵x-forwarded-proto和x-forwarded-port头部实现中间件绕过、SSRF攻击、缓存投毒等多种攻击向量,影响版本为2.16.0至5.15.4。

漏洞详情

包信息

  • 包管理器: npm
  • 包名称: astro
  • 受影响版本: >= 2.16.0, < 5.15.5
  • 已修复版本: 5.15.5

漏洞概述

在使用按需渲染的受影响Astro版本中,请求头x-forwarded-protox-forwarded-port在构建URL时未经安全处理就被使用。这导致多种严重后果:

  • 中间件保护的路径被绕过(仅通过x-forwarded-proto
  • 通过缓存投毒导致拒绝服务(如果存在CDN)
  • 服务器端请求伪造(SSRF,仅通过x-forwarded-proto
  • URL污染(潜在的存储型XSS,如果存在CDN)
  • WAF绕过

技术细节

x-forwarded-protox-forwarded-port头部在Astro服务器代码的两个部分未经处理就被使用。最重要的是在createRequest()函数中。包括默认配置在内的所有配置都会受到影响:

1
2
3
// 相关代码位置
https://github.com/withastro/astro/blob/970ac0f51172e1e6bff4440516a851e725ac3097/packages/astro/src/core/app/node.ts#L97
https://github.com/withastro/astro/blob/970ac0f51172e1e6bff4440516a851e725ac3097/packages/astro/src/core/app/node.ts#L121

这些头部值随后被直接用于构建URL。通过在URL创建期间在协议级别注入有效载荷(通过x-forwarded-proto头部),可以重写整个URL,包括主机、端口和路径,然后将URL的其余部分(真实的主机名和路径)作为查询传递,这样就不会影响(重新)路由。

如果请求路径/ssr时注入以下头部值:

1
x-forwarded-proto: https://www.malicious-url.com/?tank=

创建的完整URL将是:https://www.malicious-url.com/?tank=://localhost/ssr

URL的创建方式如下:

1
url = new URL(`${protocol}://${hostnamePort}${req.url}`);

该值在字符串开头注入(${protocol}),并以查询?tank=结束,其值是字符串的其余部分://${hostnamePort}${req.url}

概念验证

中间件保护的路径绕过 - 仅通过x-forwarded-proto

配置了保护/admin路由的中间件:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
// src/middleware.ts
import { defineMiddleware } from "astro/middleware";

export const onRequest = defineMiddleware(async (context, next) => {
  const isAuthed = false; // 认证逻辑
  if (context.url.pathname === "/admin" && !isAuthed) {
    return context.redirect("/");
  }
  return next();
});

攻击者可以使用恶意头部值绕过中间件路径检查:

1
curl -i -H "x-forwarded-proto: x:admin?" http://localhost:4321/admin

SSRF攻击

如果URL随后被用于执行外部网络调用(例如API),攻击者可以提供恶意URL,服务器将获取该URL,导致服务器端请求伪造。

通过缓存投毒导致拒绝服务

如果存在CDN,可以强制缓存错误的页面/资源或应用程序路由上的404页面,使应用程序无法使用。

URL污染

如果request.url的值用于在页面内创建链接,使用以下值可能导致存储型XSS:

1
x-forwarded-proto: javascript:alert(document.cookie)//

WAF绕过

Astro建议用户阅读之前关于React-Router/Remix框架的研究,该研究涉及类似情况。

CVE-2025-61925完全绕过

通过发送值为空的x-forwarded-host,可以完全绕过与X-Forwarded-Host头部相关的漏洞补丁。

安全评分

  • 严重程度: 中等
  • CVSS评分: 6.5/10
  • 攻击向量: 网络
  • 攻击复杂度: 低
  • 所需权限: 无
  • 用户交互: 无

弱点分类

  • CWE-918: 服务器端请求伪造(SSRF)

参考链接

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计