服务器端请求伪造(Server-Side Request Forgery, SSRF)
字数 1582 2025-12-11 22:01:15
服务器端请求伪造(Server-Side Request Forgery, SSRF)
-
基础概念:它是一种安全漏洞。 它的核心是攻击者能够欺骗或诱导一个服务器端应用程序,代表攻击者向该应用程序通常无法直接访问的内部或外部的任意网络位置(URL)发起HTTP请求。这里的“服务器端”是关键,意味着请求是从受害者的服务器发出的,而不是从攻击者的浏览器。
-
漏洞成因:不安全的用户输入处理。 当Web应用程序在获取远程资源(如下载图片、读取文件、调用第三方API、转换网页等)时,直接从用户提供的输入(如URL参数、表单字段、请求头)构造目标地址,且没有对这些输入进行严格的验证和过滤,就可能存在SSRF漏洞。例如,一个应用有一个功能是输入一个图片URL,然后服务器会去抓取并显示这个图片。攻击者可能将图片URL替换为一个内部系统的地址。
-
攻击目标与危害:
- 攻击内部系统: 这是SSRF最危险的地方。因为请求来自受信任的内部服务器(例如Web服务器),攻击者可以利用它探测或攻击防火墙后的内部系统,这些系统通常对外网不可见。例如,访问
http://192.168.1.1/admin(内部管理界面)、http://127.0.0.1:3306(数据库)或云服务实例的元数据端点(如AWS的http://169.254.169.254/)。 - 绕过滤或访问控制: 攻击者可以访问一些仅限本地主机(
localhost)访问的服务,或者利用服务器作为代理来访问某些被外部IP限制的资源。 - 发起其他攻击: 通过服务器发起对第三方系统的攻击(如DDoS),或者与存在其他漏洞的内部服务交互,扩大攻击面。
- 读取本地文件: 在某些配置下,使用
file://协议可以直接读取服务器本地的文件内容,例如file:///etc/passwd。
- 攻击内部系统: 这是SSRF最危险的地方。因为请求来自受信任的内部服务器(例如Web服务器),攻击者可以利用它探测或攻击防火墙后的内部系统,这些系统通常对外网不可见。例如,访问
-
攻击手法示例:
- 基本利用: 将参数
url=http://example.com/image.jpg改为url=http://192.168.0.1/admin。 - 使用非常规IP表示法: 利用URL解析器的特性,使用八进制、十六进制、十进制整数或域名指向内部IP。例如,
127.0.0.1可以表示为0177.0.0.1(八进制)、0x7f.0.0.1(十六进制)或2130706433(十进制)。 - 利用重定向: 攻击者控制一个会返回
302重定向到内部地址的网站,绕过一些简单的“不允许访问内网IP”的过滤规则。 - 协议滥用: 除了
http://和https://,还可能尝试dict://、gopher://、file://等协议来与更多服务交互。
- 基本利用: 将参数
-
防御机制:
- 输入验证与白名单: 最有效的方法。不仅验证输入是否为合法URL格式,更重要的是建立目标地址的白名单(只允许访问特定的、已知安全的域名/IP)。如果必须允许用户指定任意URL,应使用严格的正则表达式或解析库来验证。
- 黑名单过滤: 作为辅助手段,但容易绕过。需要过滤私有IP地址段(如
10.0.0.0/8,172.16.0.0/12,192.168.0.0/16)、回环地址(127.0.0.0/8)、链路本地地址(169.254.0.0/16)以及云元数据服务的已知地址。 - 禁用不需要的URL协议: 在应用程序或底层库层面,只允许
http和https协议。 - 隔离请求功能: 将发起远程请求的服务部署在独立的、网络权限受限的服务器或容器中,使其无法访问关键内部网络。
- 认证与权限: 确保后端服务之间的通信也需要认证,不能仅因为请求来自内部就信任。
- 对响应进行净化: 不要将远程请求获取的原始数据直接返回给客户端。