漏洞详情
包信息
- 包管理器: npm
- 包名称: astro
- 受影响版本: >= 2.16.0, < 5.15.5
- 已修复版本: 5.15.5
漏洞概述
在使用按需渲染的受影响Astro版本中,请求头x-forwarded-proto和x-forwarded-port在构建URL时未经安全处理就被使用。这导致多种严重后果:
- 中间件保护的路径被绕过(仅通过
x-forwarded-proto) - 通过缓存投毒导致拒绝服务(如果存在CDN)
- 服务器端请求伪造(SSRF,仅通过
x-forwarded-proto) - URL污染(潜在的存储型XSS,如果存在CDN)
- WAF绕过
技术细节
x-forwarded-proto和x-forwarded-port头部在Astro服务器代码的两个部分未经处理就被使用。最重要的是在createRequest()函数中。包括默认配置在内的所有配置都会受到影响:
|
|
这些头部值随后被直接用于构建URL。通过在URL创建期间在协议级别注入有效载荷(通过x-forwarded-proto头部),可以重写整个URL,包括主机、端口和路径,然后将URL的其余部分(真实的主机名和路径)作为查询传递,这样就不会影响(重新)路由。
如果请求路径/ssr时注入以下头部值:
|
|
创建的完整URL将是:https://www.malicious-url.com/?tank=://localhost/ssr
URL的创建方式如下:
|
|
该值在字符串开头注入(${protocol}),并以查询?tank=结束,其值是字符串的其余部分://${hostnamePort}${req.url}。
概念验证
中间件保护的路径绕过 - 仅通过x-forwarded-proto
配置了保护/admin路由的中间件:
|
|
攻击者可以使用恶意头部值绕过中间件路径检查:
|
|
SSRF攻击
如果URL随后被用于执行外部网络调用(例如API),攻击者可以提供恶意URL,服务器将获取该URL,导致服务器端请求伪造。
通过缓存投毒导致拒绝服务
如果存在CDN,可以强制缓存错误的页面/资源或应用程序路由上的404页面,使应用程序无法使用。
URL污染
如果request.url的值用于在页面内创建链接,使用以下值可能导致存储型XSS:
|
|
WAF绕过
Astro建议用户阅读之前关于React-Router/Remix框架的研究,该研究涉及类似情况。
CVE-2025-61925完全绕过
通过发送值为空的x-forwarded-host,可以完全绕过与X-Forwarded-Host头部相关的漏洞补丁。
安全评分
- 严重程度: 中等
- CVSS评分: 6.5/10
- 攻击向量: 网络
- 攻击复杂度: 低
- 所需权限: 无
- 用户交互: 无
弱点分类
- CWE-918: 服务器端请求伪造(SSRF)
参考链接
- GHSA-hr2q-hp5q-x767
- https://nvd.nist.gov/vuln/detail/CVE-2025-64525
- withastro/astro@dafbb1b