什么是服务器端请求伪造 (SSRF),如何防止?

安全资讯 小布 361浏览 0评论

服务器端请求伪造 (SSRF) 是一种攻击,允许攻击者通过易受攻击的 Web 服务器向其他系统发送恶意请求。SSRF 漏洞被列为 OWASP 前 10 名的主要应用程序安全风险,可导致信息暴露并为更危险的攻击开辟道路。这篇文章展示了 SSRF 的工作原理以及如何识别和防止 Web 应用程序中的 SSRF 漏洞。

 

服务器端请求伪造(SSRF)简介

Web 应用程序可以触发 HTTP 服务器之间的请求。这些通常用于获取远程资源,例如软件更新,或从 URL 或其他 Web 应用程序导入元数据。此类服务器间请求通常并不危险,但除非正确实施,否则它们会使服务器容易受到服务器端请求伪造或 SSRF 的攻击。

使用用户可控数据构建目标 URL时,会引入 SSRF 漏洞。为了执行 SSRF 攻击,攻击者可以更改易受攻击的 Web 应用程序中的参数值,以创建或控制来自易受攻击的服务器的请求。

Web 应用程序访问的外部资源可能包括内部服务,例如来自另一个网站的 RSS 提要。一个开发者可以使用以下网址获取远程饲料:

https://example.com/feed.php?url=externalsite.com/feed/to

如果攻击者能够将url参数更改为localhost(环回接口),这可能允许他们查看托管在服务器上的本地资源,使其容易受到服务器端请求伪造的攻击。

如果攻击者可以控制服务器端请求的目的地,这就开启了一系列攻击性活动,可能允许他们:

  • 滥用易受攻击的服务器与其他系统之间的信任关系
  • 绕过 IP 白名单
  • 绕过基于主机的身份验证服务
  • 读取公众无法访问的 Web 资源和其他有用资产,例如 AWS 环境或ASP.NET 中的元数据 APItrace.axd
  • 在服务器连接的内部网络上执行端口扫描
  • 从 Web 服务器读取文件
  • 查看状态页面并作为 Web 服务器与 API 交互
  • 检索敏感信息,例如在反向代理后面运行的 Web 服务器的 IP 地址

OWASP 前 10 名中的 SSRF

服务器端请求伪造是一个众所周知的弱点和经常项目开放Web应用安全项目小号的十大Web应用程序安全风险清单。在2021 年 OWASP 前 10 名中,它甚至(首次)获得了自己的类别A10:2021 – 服务器端请求伪造 (SSRF)。根据社区调查的结果,它被列为一个单独的类别。

随着现代 Web 应用程序变得更加复杂和互连,获取 URI 已成为交付内容和功能的基本操作。随着服务器端请求的增加,SSRF 漏洞也变得更加普遍。与此同时,由于云服务的日益普及和基于云的复杂应用架构,它们的范围和影响正在扩大,这可能允许攻击者通过受感染的服务器访问网络基础设施和云数据源。

服务器端请求伪造漏洞的典型利用

在一个典型的场景SSRF,谁也不愿意外部攻击者访问内部服务器可以 T选用直接请求,因为他们会被防火墙阻止。相反,恶意行为者可以利用 SSRF 漏洞通过易受攻击的 Web 服务器进行攻击:

  1. 攻击者向易受 SSRF 攻击且与目标服务器位于同一内部网络的 Web 服务器发送伪造请求。
  2. 易受攻击的 Web 服务器绕过防火墙将攻击者控制的请求发送到受害者的服务器。
  3. 受害者的服务器用请求的数据响应网络服务器。
  4. 如果特定 SSRF 漏洞允许,则将数据发送回攻击者。在大多数情况下,攻击者需要通过其他方式(带外)窃取或推断此信息。

exploiting_ssrf_vulnerability

为什么服务器端请求伪造很危险?

虽然许多 Web 漏洞直接影响目标系统,但 SSRF 允许攻击者将目标用作将请求传递给第三个系统的中介。因此,虽然 SSRF 攻击本身可能不会造成破坏,但它可以为恶意黑客提供对内部系统的访问权限,而这些内部系统本来不应该从 Internet 访问。这有几个危险的原因。

SSRF 滥用内部系统之间的信任关系

作为安全最佳实践,您应该始终将所有级别的攻击面保持得尽可能小。在内部网络中,这通常意味着对某些端口或操作的访问仅限于特定的白名单机器。为了在仍然能够交换数据和执行管理任务的同时保持安全性,服务器通常与选定的其他机器建立信任关系

在网络级别,这种信任可能意味着防火墙仅允许在请求机器位于同一本地网络上或其 IP 地址明确信任的情况下访问某些端口。在软件级别,您可以隐式信任本地机器,这样只要 IP 为 127.0.0.1 或可能在内部网络内部,某些管理任务就不需要身份验证。这增加了一定程度的物理安全性,因为即使攻击者获得有效的凭据,他们可以牛逼登录无需访问本地网络。

通过利用 SSRF 漏洞,攻击者可以绕过此类限制与信任受影响机器的其他服务器进行交互。这可能意味着发送数据查询或制作恶意请求以与无法从外部网络访问的端口进行交互。通过伪造服务器端请求,外部攻击者可以在目标服务器上执行恶意操作,否则外部无法执行这些操作。

SSRF 允许攻击者扫描本地或外部网络

通过利用服务器端请求伪造漏洞,攻击者可能能够扫描易受攻击的服务器所连接的本地或外部网络。虽然通常无法直接提取数据,但攻击者可以使用他们正在探测的服务的页面加载时间、错误消息或横幅来间接确定目标服务是否正在响应或测试的端口是否打开。

示例:如何通过 SSRF 漏洞扫描网络

假设您有一个提供服务的网站,该服务允许您从远程来源获取 JPEG 图像,以便确定它们的尺寸。作为安全控制,该服务会检查从远程源收到的响应是否Content-Type具有值为的HTTP 标头image/jpeg。如果标题丢失或指定了不同的内容类型,则服务假定提供了不同的图像格式并返回错误消息Please provide JPEG images only。如果连接到远程源时出现问题,该服务将返回No image found!

让我们看看攻击者如何使用影响服务响应的不同输入来确定主机是否启动:

  • 如果我们请求https://victim.com/image.php?url=https://example.com/picture.jpg,我们将获得图像的高度和宽度,这意味着这是一张具有正确Content-Type标题的有效图片。
  • 让我们尝试不同的 HTTP 请求,并通过发送https://victim.com/image.php?url=https://example.com/index.html. 现在服务响应是Please provide JPEG images only,因为提供的页面有错误的Content-Type标题(text/html而不是image/jpeg)。
  • 现在让我们看看无效 URL 会发生什么,例如https://victim.com/image.php?url=https://example.invalid/. 该服务返回Image not found,这意味着获取远程资源时出错。

现在我们知道应用程序对不同输入的行为方式,我们可以尝试滥用它。我们知道,带有缺失或不正确Content-Type标头的有效 URL 会返回错误Please provide jpeg images only让我们使用内部 URL发送以下请求:

https://victim.com/image.php?url=127.0.0.1:3306

如果我们得到错误Image not found,这意味着在端口 3306 上没有来自主机 127.0.0.1 的响应。但是,如果我们得到Please provide jpeg images only,则意味着内部服务器确实响应了,所以有一个服务正在运行在那个港口。这样,我们就可以使用易受攻击的 Web 应用程序探测不同的内部 IP 地址和端口以进行完整扫描。实际上,这种 SSRF 漏洞允许攻击者在不使用实际端口扫描器的情况下执行端口扫描。

SSRF 可以暴露服务器上的文件和内部资源

当远程资源的内容直接渲染到页面时,攻击者就有可能读取文件内容。例如,考虑一个 Web 服务,它从提供的 URL 中删除所有图像,然后很好地格式化文本。为此,它获取给定 URL 的响应正文,然后应用文本格式。

如果该服务容易受到 SSRF 的攻击并允许我们提供file://URL 而不是通常的http://or https://,我们可以使用它从本地文件系统读取文件。例如,如果我们file:///etc/passwd在基于 UNIX 的系统上使用 URL ,我们可以显示passwd文件的内容。可以使用相同的技术查看易受攻击的 Web 应用程序的源代码。

SSRF 攻击的潜在影响是什么?

从上面的例子中可以看出,利用服务器端请求伪造漏洞的直接影响几乎总是信息泄露,因为攻击者获得了大量关于他们应该无法访问的系统和资源的有用信息。然而,间接后果可能是毁灭性的,因为 SSRF 可以允许恶意行为者:

  • 使用易受攻击的服务器作为内部和外部系统的端口和 IP 扫描器
  • 与 Gopher 等协议(如果启用)交互以执行额外的侦察
  • 发现在反向代理后面运行的服务器的 IP 地址
  • 获取远程代码执行

由于 SSRF 主要是用于进一步探测和攻击的访问通道,因此还有许多其他可能性,具体取决于易受攻击的 Web 应用程序如何使用从远程资源接收的响应。结合适当条件下的其他漏洞,SSRF 可能会产生严重后果。

防止服务器端请求伪造

为了防止 Web 应用程序中的 SSRF 漏洞,强烈建议您对 Web 服务器获取的远程资源使用允许的域和协议的白名单。更一般地说,您还应该避免在任何可以代表服务器发出请求的函数中直接使用用户输入。虽然清理和过滤用户输入总是一个好主意,但您不应该依赖它作为唯一的保护措施,因为几乎不可能涵盖所有不同的场景。

攻击者可以使用多种技巧来绕过 URL 过滤:

  • 使用将被转换为内部网络中的 IP 的编码 IP 地址:
    • 1 -> 与本地主机相同
    • 123.123.123 -> 与本地主机相同
  • 提供解析为内部 IP 地址的主机名
  • 通过在主机名末尾应用点来绕过主机黑名单

这只是攻击者在其武器库中绕过的一小部分,因此建议的做法是避免用户在代表服务器发出请求的函数中输入。

识别 Web 应用程序中的 SSRF 漏洞

现代动态应用程序安全测试 ( DAST ) 解决方案为各种 Web 漏洞提供准确的漏洞扫描,包括许多服务器端请求伪造漏洞。对于出带外SSRF和其他二阶漏洞,使用专用的漏洞测试的基础设施,允许其识别和报告安全漏洞,唐 T回流的直接回应。

漏洞分类及严重性表

分类 ID/严重性
PCI v3.2 6.5.6
OWASP 2013 A5
OWASP 2017 A6
OWASP 2021 A10(独立类别)
CWE 918
亚太经合组织 347
WASC 15
HIPAA 164.306(a)、164.308(a)
ISO27001 A.14.2.5
CVSS:3.0
CVSS:3.0: AV:N/AC:H/PR:N/UI:N/S:C/C:N/I:N/A:N
网络火花  危急

转载请注明:布尔云安的博客 » 什么是服务器端请求伪造 (SSRF),如何防止?

头像
发表我的评论
取消评论
表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址