前言

SSRF(Server-Side Request Forgery,服务端请求伪造)是内网渗透最核心高危漏洞,常年位列 OWASP 风险清单、护网资产排查 TOP 漏洞。不同于 XSS、越权作用于应用层,SSRF 的攻击面横跨「公网→服务器本地→内网网段」,攻击者借助服务端身份发起请求,突破防火墙、安全组隔离,实现内网端口扫描、内网应用漏洞探测、Redis/Mongo 未授权访问、RCE 远程命令执行等链式攻击。

本文从底层原理、典型业务场景、分层攻击手段、完整渗透链路、企业落地防御五个维度拆解,内容贴合代码审计、渗透实战、Java 安全面试,全部知识点可直接用于面试背诵与项目安全整改。

一、SSRF 漏洞基础原理

1. 漏洞本质

服务端代码支持从用户可控 URL 地址拉取资源(远程图片下载、URL 预览、第三方内容抓取、文件获取等功能),没有对目标请求地址做内网、本地地址黑名单过滤,攻击者传入恶意地址,由服务器代为发起网络请求

2. 完整攻击链路

攻击者提交恶意 URL → Web 后端使用 curl/HttpClient/OkHttp 等组件发起请求 → 服务端访问内网 / 本地资源 → 返回数据回显至页面 → 攻击者获取内网信息或触发漏洞利用。

3. 容易产生漏洞的开发组件

Java:HttpClient、OkHttp、RestTemplate、URLConnection

PHP:file_get_contents、curl_exec

Python:requests、urllib

凡是代码接收外部传入 url 并自动请求资源,都存在 SSRF 风险。

二、高频出现 SSRF 的业务场景

实战、代码审计优先排查以下五类功能,90% SSRF 漏洞出自这里:

  1. 图片远程下载 / 头像外链:输入图片 URL,后端拉取图片保存到服务器;
  2. 网页预览、链接快照:输入网址,后端抓取页面内容生成预览;
  3. 第三方接口对接:用户自定义第三方 API 地址,服务端主动调用;
  4. 文件远程导入:填写远程文件地址,后端下载解析文件;
  5. 站内爬虫功能:自定义目标链接,系统自动爬取内容。

三、SSRF 分层攻击手段

1. 访问服务器本地资源

  • 探测本地端口:http://127.0.0.1:3306http://127.0.0.1:6379http://127.0.0.1:22
  • 访问本地后台管理系统、内网运维面板;
  • 读取本地部分文件(部分协议支持 file://):file:///etc/passwd(Linux)file://C:/Windows/system.ini(Windows)

2. 内网全网段端口扫描

利用内网私有网段:192.168.0.0/16、172.16.0.0/12、10.0.0.0/8,批量遍历端口,通过页面返回长度、报错差异判断端口开放状态。 Payload 示例:

端口开放:页面返回正常内容;端口关闭:连接超时 / 报错,完成内网资产测绘。

3. 内网高危组件漏洞利用

  1. Redis 未授权访问:http://192.168.x.x:6379,写入 SSH 密钥、反弹 Shell、写入定时任务实现服务器接管;
  2. MongoDB/Elasticsearch 未授权:通过 SSRF 访问对应端口,拖库、写入恶意数据;
  3. Fastjson、Spring4Shell 等内网应用漏洞:调用内网漏洞接口触发 RCE;
  4. 访问内网 Nacos、Consul 配置中心,获取数据库账号密码、密钥。

4. 协议攻击

部分请求组件支持非 HTTP 协议,突破 HTTP 限制:

  • Dict 协议:探测端口、执行 Redis 指令;
  • Gopher 协议:构造 TCP 报文,无回显漏洞变成可利用漏洞,是 SSRF 打通内网 RCE 的关键协议;

5. 绕过 DNS 解析(域名跳转绕过 IP 黑名单)

使用指向内网 IP 的域名、短链接跳转绕过 IP 黑名单校验,后端解析域名后实际访问内网地址。

四、完整内网渗透实战链路

  • 发现 SSRF 漏洞 → 127.0.0.1 端口探测,摸清本机开放服务;
  • 遍历内网 C 段,批量扫描存活主机与开放端口;
  • 筛选内网高危端口(6379、27017、9200、3306);
  • 使用 Gopher/Dict 协议利用未授权组件写入后门;
  • 拿下内网一台服务器,以此为跳板横向渗透整个内网。 护网行动中,大量内网沦陷溯源都是起始于一处 SSRF 漏洞。

五、企业级落地防御方案

1. 白名单优先策略

只允许访问业务可信域名 / IP,不在白名单的地址直接拦截;禁止用户自定义任意 URL。多用于图片预览、第三方对接场景。

2. IP 黑名单拦截

拦截三类高危地址段:

  1. 本地回环:127.0.0.0/8、0.0.0.0
  2. 内网私有网段:10.0.0.0/8、172.16.0.0/12、192.168.0.0/16
  3. 保留特殊地址、组播地址。

Java 校验伪代码

// 获取URL解析后的目标IP,判断是否在内网/本地段,命中直接拒绝
InetAddress addr = InetAddress.getByName(host);
String ip = addr.getHostAddress();
if(isLocalOrInnerIp(ip)){
    return "非法地址,禁止访问";
}

3. 协议黑名单限制

禁用非业务必要协议:file://、gopher://、dict://、ftp://,仅保留http://、https://

4. 请求出站资源限制

  1. 限制请求连接超时时间(500ms 以内),防止攻击者长时间内网扫描;
  2. 限制单次请求资源大小,避免超大文件下载造成 DOS;
  3. 使用独立内网隔离代理机器拉取资源,代理机器无内网访问权限。

5. 服务端环境加固

  1. 禁用危险组件的重定向跟随,关闭 HttpClient 自动 302 跳转(防止跳转绕过 IP 校验);
  2. 内网高危中间件(Redis/Mongo)添加密码认证,关闭未授权访问;
  3. WAF 添加 SSRF 特征规则,拦截内网网段请求。

6. 开发编码规范

  1. 禁止直接使用用户输入 URL 作为资源请求地址;
  2. 接口入参做格式强校验,限制域名格式;
  3. 代码审计全局检索getImage、getUrl、download等关键词定位风险点。

六、面试高频考点

1. 什么是 SSRF?漏洞危害?

SSRF 即服务端请求伪造,攻击者利用服务端主动请求 URL 的功能,操控服务器访问本地或内网资源;危害包含本地信息泄露、内网端口扫描、内网未授权组件利用、远程代码执行、内网横向渗透。

2. SSRF 有哪些利用协议?

常用 HTTP/HTTPS 用于常规探测;Gopher、Dict 用于高阶漏洞利用;file 用于本地文件读取,生产环境必须封禁后三类协议。

3. 防御 SSRF 关键点是什么?

  1. 解析域名获取真实 IP 再做内网黑名单校验,防域名跳转绕过;
  2. 封禁 file/gopher/dict 等危险协议;
  3. 优先可信域名白名单,限制请求超时;
  4. 关闭 HTTP 自动重定向。

4. 如何绕过简单的 IP 黑名单?

短链接跳转、DNS 域名解析指向内网 IP、302 重定向跳转,因此必须解析目标真实 IP 再校验。

七、总结

SSRF 的核心本质:利用服务器的网络位置,借刀入侵内网。防火墙能拦外网,拦不住服务器本机。 安全开发记住三条铁律:

  1. 不信任任何用户传入的 URL;
  2. 校验 IP 必须解析域名真实地址;
  3. 非必要协议一律封禁。

在护网、代码审计场景中,SSRF 是突破内网边界的关键入口,也是 Java 安全、渗透测试岗位面试必考漏洞。

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐