SSRF(Server-Side Request Forgery)
SSRF(服务器端请求伪造)是一种由攻击者构造形成由服务器端发起请求的安全漏洞。攻击者能够利用受影响的应用程序,发送伪造的 HTTP 请求,使其伪装成服务器内部发起的请求,从而能够直接或间接地访问或控制应用程序无意中暴露的受保护资源。
Web 应用程序往往会提供一些能够从远程获取图片或是文件的接口,在这些接口上用户使用指定的 URL 便能完成远程获取图片、下载文件等操作。攻击者可以通过使用 file 协议来读取服务器本地 /etc/passwd 和 /proc/self/cmdline 等敏感文件,同时攻击者也可以利用被攻击的服务器绕过防火墙直接对处于内网的机器发起进一步的攻击。
原理
SSRF 漏洞的本质是服务端提供了从其他应用服务器获取数据的功能,但没有对目标地址做过滤与限制。攻击者通过向应用程序发送特定的请求,传入一个用户可控的参数作为目标 URL 或者 IP 地址,进行实现对受害系统内部任意资源的访问。
支持的协议
在 Java(JDK21)中,SSRF 支持 sun.net.www.protocol 下所有的协议:file、ftp、http、https、jar、jmod、jrt 及 mailto 协议。这些是 JDK 内置的、通过 URL 类直接支持的标准协议,但在生产代码中应始终使用标准的 java.net API,避免直接依赖 sun.* 包。
由于上述协议的限制,以及传入的 URL 协议必须和重定向后的 URL 协议一致的原因,使得 Java 中的 SSRF 并不能像 PHP 中一样使用 gopher 协议来拓展攻击面。
- file - 本地文件系统协议
- URL 示例:
file:///etc/passwd - 作用:用于访问本地文件系统中的文件。
- URL 示例:
- ftp - 文件传输协议
- URL 示例:
ftp://user:[email protected]/pub/file.txt - 作用:通过 FTP 协议下载或上传文件。
- URL 示例:
- http - 超文本传输协议
- URL 示例:
http://example.com/index.html - 作用:获取 Web 资源。
- URL 示例:
- https - 安全超文本传输协议
- URL 示例:
https://example.com/api/user - 作用:获取 Web 资源。
- URL 示例:
- jar - JAR 文件协议
- URL 示例:
jar:file:///app/lib/utils.jar!/config.properties - 作用:访问 JAR 包内部的资源文件。
- URL 示例:
- jmod - JMOD 文件协议(JDK 9+)
- URL 示例:
jmod:/path/to/module.jmod!/resources/file.txt - 作用:用于访问 .jmod 文件中的内容。
- URL 示例:
- jrt - 运行时镜像协议(JDK 9+)
- URL 示例:
jrt:/java.base/java/lang/Object.class - 作用:访问运行时模块镜像(Run-Time Image)中的类和资源。
- URL 示例:
- mailto - 邮件协议
- URL 示例:
mailto:[email protected]?subject=Hello&body=Hi!
- URL 示例:

