Next.js中的一些ssrf漏洞

Posted

原文来自:

https://www.intigriti.com/researchers/blog/hacking-tools/ssrf-vulnerabilities-in-nextjs-targets

为了记录学习,以下文章为翻译过的

Next.js 是一个功能强大的开源 React 框架,可帮助开发者构建快速、交互性强且对搜索引擎友好的 Web 应用程序。且其本身结构较为复杂,这使其成为了恶意入侵者的首要目标。

在本文中,我们将深入探讨在大量使用 Next.js 的目标系统中最为常见的服务器端请求伪造漏洞(SSRF)。

Next.js 图片组件中的 SSRF 漏洞

图像优化是 Web 应用程序开发中必不可少的一环。在网站的任何位置加载未优化的大尺寸图像资源,往往会对 SEO 产生负面影响。因此,Next.js 建议使用 Next.js Image 组件——这是一个服务器端组件,能够为您完成所有的优化和缓存工作。

要使该组件正常工作,所有优化和图片处理都必须在服务器端完成。每当你在 Next.js 项目中包含图片组件(通常默认包含),你就会暴露一个位于/_next/image 的额外 API 端点。下次当你包含一张图片时,图片的位置将被转发到该 API 端点,执行所有优化工作,并最终返回优化后的图片

image-20260518003532078

如上图所示, url 参数看起来是测试服务器端请求伪造漏洞的完美位置。尤其是 Next.js 支持通配符范围配置选项:

/** @type {import('next').NextConfig} */
const nextConfig = {
  images: {
    remotePatterns: [
      {
        protocol: 'https',
        hostname: '**',
      },
      {
        protocol: 'http',
        hostname: '**',
      }
    ],
  },
}

module.exports = nextConfig

开发人员这样做是为了允许从任何主机加载图片,却不知不觉中引入了一个新的攻击途径。由于这种安全配置错误,使我们能够冒充受影响的服务器发起HTTP请求,因此这属于典型的(盲式)服务器端请求伪造漏洞。

如果未指定通配符,您仍应尝试检测潜在的白名单主机(例如 CDN),因为负责拉取镜像初始版本的底层 Image 组件默认会跟随重定向。实际上,一个简单的开放 URL 重定向漏洞可能会为访问任意主机打开一条通道。

Next.js 中间件中的 SSRF 漏洞 (CVE-2025-57822)

Next.js 中间件允许开发者在响应返回给客户端之前执行代码。这在基于应用程序逻辑实现服务器端重定向、身份验证和授权检查时非常有用。然而,在某些情况下,开发者可能会因无意中将未经清理的用户输入传递给中间件方法进行处理,从而在不知不觉中引入服务器端请求伪造漏洞。

为了进一步理解这一根本问题,并解释为何它也是一种常见问题,我们需要通过一个简单的示例来看看存在漏洞的实现方式。以下是我们之前在 Intigriti CTF 挑战赛中发布的一个示例,展示了 Next.js 中一个存在漏洞的中间件实现,该实现用于追踪 UTM 参数:

image-20260518003851376

当你仔细观察时,开发者似乎将整个对象,包括未清理的请求头,传递给了 next() 方法。这将导致 next() 方法在返回响应前评估所有头信息,包括检查由 Location 头可能触发的内部重定向。例如,如果我们向有漏洞的应用发送一个随机的 Location 头,实际上会使 Next.js 加载我们在 Location 头中指定的请求资源。

image-20260518003950034

这项未公开的漏洞在供应商承认并分配 CVE-2025-57822 之前被忽视了好几年。多亏了安全研究员 Dominik Prodinger 的研究,我们通过他的研究得知,互联网上已识别出超过 5,000 个可能受影响的设备。在测试 Next.js 应用程序时,建议包含针对此特定 CVE 的检查。

通过 Next.js 服务器动作的 SSRF 漏洞(CVE-2024-34351)

Next.js 服务器操作允许开发者定义在服务器端运行的异步函数,并可直接从 React 组件中调用这些函数,从而实现无缝的服务器端数据获取、数据修改和表单处理,而无需自定义 API 路由或额外的后端模板代码。

该漏洞最初由Assetnote的研究人员发现,若“服务器操作”(Server Actions)实现不当,可能会导致服务器端请求伪造(SSRF)。要使目标系统存在此漏洞,必须满足以下条件:

  • Next.js(版本 14.1.1 或更低)必须在自托管环境中运行
  • 您的 Next.js 目标需要使用服务器端操作
  • 服务器操作必须将请求重定向到一个相对路径

最后一项要求至关重要,因为 Next.js v14.1.1 及更早版本会通过特定的验证流程将响应流式传输回客户端。该框架首先向传入请求的 Host 头中指定的主机发送请求HEAD,验证响应的 Content-Type,然后继续执行请求GET以获取实际内容:

利用阶段需要配置一个自定义的OAST服务器,该服务器应返回适当的content-type头部信息以绕过初始验证检查

当服务器随后收到该GET请求时,我们会返回一个302包含目标资源(例如 AWS 元数据端点 URI)的 HTTP 重定向响应,该资源位于请求Location头中。

image-20260518004653909