Web安全 - 服务端请求伪造SSRF(Server-Side Request Forgery)

news2024/12/26 13:39:08

文章目录

  • OWASP 2023 TOP 10
  • SSRF 导图
  • SSRF 概念
  • SSRF的工作原理
  • SSRF攻击场景
  • SSRF防御策略
    • 1. 严格验证用户输入
    • 2. 禁用或限制对内部网络的访问
    • 3. 强制使用外部API代理
    • 4. 禁止直接访问敏感资源
    • 5. 输入内容长度限制
    • 6. 检测和监控
    • 7. 确保对HTTP请求的处理安全
  • SSRF防御实现方案
    • 1. 白名单限制实现
    • 2. 阻止私有IP地址的请求
    • 3. 代理服务器中转外部请求
  • 应用场景分析
  • 测试方案:动态生成的URL安全性监控
    • 1. 输入验证与限制
    • 2. DNS解析监控与测试
    • 3. 限速与黑名单
  • 测试方案:代理请求监控
    • 1. 代理安全性监控
    • 2. 代理验证与认证

在这里插入图片描述

OWASP 2023 TOP 10

在这里插入图片描述

OWASP Top 10 概述

OWASP (Open Web Application Security Project) Top 10 是一份最常见和最危险的Web应用安全风险列表,由安全专家定期更新。 旨在提高开发人员、测试人员以及组织的安全意识并帮助他们预防这些漏洞。

2023年OWASP Top 10 列表

在这里插入图片描述

主流防范措施

  1. Broken Access Control

    • 描述:未能正确执行访问控制,允许用户访问他们不应该拥有的权限或资源。这可能导致数据泄露、数据篡改等问题。
    • 防御措施:严格实施基于角色的访问控制(RBAC),并确保敏感操作具有足够的授权检查。
  2. Cryptographic Failures

    • 描述:不当的加密实践或加密算法的使用不当,可能导致敏感数据(如密码、信用卡信息)被暴露或窃取。
    • 防御措施:使用最新的加密标准(如AES-256-GCM、RSA-2048),并避免使用弱或过时的加密算法。
  3. A03:2023 - Injection

    • 描述:应用未能对用户输入进行有效的验证或转义,导致恶意代码注入(如SQL注入、命令注入)并执行在服务器上。
    • 防御措施:使用参数化查询、输入验证、输出转义技术,避免拼接SQL或动态代码。
  4. ** Insecure Design**

    • 描述:系统在设计阶段未考虑安全问题,导致应用架构中的基本安全漏洞。
    • 防御措施:在开发生命周期中引入威胁建模、攻击面分析等设计阶段的安全审查。
  5. Security Misconfiguration

    • 描述:错误的配置(如不安全的默认设置、过时的软件或未配置的安全功能),可能使应用程序面临攻击。
    • 防御措施:定期审计和测试系统配置,使用自动化工具识别和修复配置问题。
  6. Vulnerable and Outdated Components

    • 描述:使用了具有已知漏洞或未及时更新的第三方库和组件,可能被攻击者利用。
    • 防御措施:确保使用依赖管理工具(如Maven、npm),并定期更新组件,避免使用过时的版本。
  7. Identification and Authentication Failures

    • 描述:认证和身份验证流程中的缺陷,可能导致用户冒充、会话劫持等问题。
    • 防御措施:实施强密码策略、使用多因素认证(MFA)和加固会话管理机制。
  8. Software and Data Integrity Failures

    • 描述:未能保证软件更新和数据的完整性,可能使攻击者篡改关键数据或上传恶意更新。
    • 防御措施:使用签名机制来验证更新包的完整性,确保数据在传输和存储过程中的可靠性。
  9. Security Logging and Monitoring Failures

    • 描述:缺乏适当的日志记录和监控,无法有效检测、响应或追踪安全事件。
    • 防御措施:实施集中化的日志记录、主动的监控和告警系统,确保能够及时发现并响应异常行为。
  10. Server-Side Request Forgery (SSRF)

    • 描述:攻击者通过伪造服务器端的请求来获取未授权的内部资源或数据,通常利用未受限制的服务器端请求机制。
    • 防御措施:限制服务器端可以发起的请求范围,避免允许用户输入直接控制服务器端的请求参数。

重点风险与防御措施建议

  1. Broken Access Control:最重要的防御措施是定期审查权限设计,确保每个用户只能访问必要的资源。建议结合应用的访问控制系统与自动化测试工具,确保权限配置不被篡改。

  2. Cryptographic Failures:确保敏感数据加密和密钥管理机制符合行业标准,如使用硬件安全模块(HSM)来保护密钥。避免明文传输或存储敏感数据。

  3. Injection:对于Web应用来说,防止注入攻击的最佳实践是始终使用参数化查询和预编译的语句。严禁直接拼接用户输入构建SQL或命令。

  4. Security Misconfiguration:安全配置管理应作为持续改进的一部分,尤其是在引入新服务或更新系统时,保持自动化的安全配置审计机制至关重要。

  5. SSRF:严格限制后端服务器能够访问的网络和资源,禁止对内部资源(如metadata或本地IP)发起请求。


SSRF 导图

在这里插入图片描述

SSRF 概念

SSRF(服务端请求伪造)是一种攻击类型,攻击者通过伪造服务器端请求来访问本不应该暴露的内部资源或外部资源。SSRF攻击的本质是利用服务器作为代理,发送请求到攻击者指定的目标(如内部网络资源、外部服务等),从而绕过客户端的防火墙、访问控制或认证机制。


SSRF的工作原理

  1. 输入控制不当:应用程序允许用户输入一个URL,然后服务器使用该URL发起请求。若未对该URL进行严格的验证,攻击者可以提供恶意的URL来访问内部或敏感资源。

  2. 目标资源访问:通常攻击者通过SSRF尝试访问的目标包括:

    • 内部网络服务:如数据库、缓存系统(Redis、Memcached)、内部管理服务等。
    • 本地主机:利用127.0.0.1localhost访问本地管理接口。
    • 云服务元数据:如AWS、GCP等云服务的实例元数据服务(可通过访问http://169.254.169.254获取云实例的敏感信息,如访问凭证)。

SSRF攻击场景

  1. 内部资源扫描:攻击者可能利用SSRF对目标服务器的内部网络进行端口扫描,识别内部服务。

  2. 访问云服务元数据:在云环境下,SSRF攻击常用于获取云实例元数据,进而获取敏感信息,如访问凭证或配置文件。

  3. 强制认证服务:某些Web应用将对外服务作为身份验证的依赖(例如OAuth),SSRF攻击可以伪造服务器请求,以获取未授权的访问。

  4. 攻击内部应用程序:攻击者通过伪造请求访问内部管理应用(如Kubernetes管理端口、API网关等),进一步扩大攻击面。


SSRF防御策略

1. 严格验证用户输入

  • 限制可访问的URL范围:对允许用户输入的URL或IP地址进行严格限制,仅允许服务器访问白名单中的域名或IP地址。
  • DNS解析验证:禁止解析本地IP(如127.0.0.1localhost)或私有IP地址(如10.0.0.0/8192.168.0.0/16169.254.169.254)。
  • URL验证:解析用户输入的URL,确保其不指向内部网络或敏感资源。

2. 禁用或限制对内部网络的访问

  • 防火墙规则:使用网络防火墙或安全组策略,限制服务器发出不必要的外部或内部请求。特别是禁止访问私有IP地址空间。
  • 隔离内部网络服务:将关键服务(如数据库、缓存系统、管理接口等)置于隔离网络中,避免被SSRF攻击访问。

3. 强制使用外部API代理

  • 如果应用程序需要访问外部服务,可以通过安全代理中转,而不是直接发起请求。代理可以集中控制、过滤和监控所有外部请求,并检测潜在的SSRF行为。

4. 禁止直接访问敏感资源

  • 云实例元数据服务:在云环境下,禁用或限制实例对元数据服务的访问。AWS、GCP等云平台提供了防止元数据滥用的安全配置,如IAM角色权限限制。

5. 输入内容长度限制

  • 限制用户输入的最大URL长度,并通过正则表达式过滤恶意的输入字符,确保URL中的协议、主机名等部分合法。

6. 检测和监控

  • 日志记录:记录所有发出的外部请求,特别是那些通过用户输入生成的请求,帮助识别潜在的SSRF攻击。
  • 异常行为检测:使用监控工具检测来自服务器的异常请求行为(如访问内部IP地址或未预期的URL模式)。

7. 确保对HTTP请求的处理安全

  • 使用GET/POST参数处理库:确保处理URL时不允许恶意协议(如file://ftp://等)通过,从而限制URL的可能性。
  • 第三方库安全审查:确保应用程序使用的HTTP请求库是安全的,且没有已知的漏洞,如HTTP协议走私攻击。

SSRF防御实现方案

基于Spring Boot的实现例子:

1. 白名单限制实现

可以通过自定义的URL验证器来限制URL的访问范围:

public boolean isValidURL(String url) {
    // 允许访问的域名白名单
    List<String> allowedDomains = Arrays.asList("https://trusted-domain.com");
    
    try {
        URL parsedUrl = new URL(url);
        String host = parsedUrl.getHost();
        return allowedDomains.contains(host);
    } catch (MalformedURLException e) {
        return false;
    }
}

2. 阻止私有IP地址的请求

阻止访问私有IP地址,如127.0.0.1192.168.x.x等:

public boolean isPublicIP(String ip) {
    // 禁止访问私有IP
    if (ip.startsWith("10.") || ip.startsWith("192.168.") || ip.startsWith("127.") || ip.equals("localhost")) {
        return false;
    }
    return true;
}

3. 代理服务器中转外部请求

使用代理服务器来控制所有外部请求,防止直接暴露内部资源:

public String fetchContentThroughProxy(String url) {
    String proxyUrl = "https://proxy-server.com/api?url=" + url;
    RestTemplate restTemplate = new RestTemplate();
    return restTemplate.getForObject(proxyUrl, String.class);
}


应用场景分析

  1. 动态URL生成场景
    在许多Web应用中,URL是动态生成的。例如,用户可以提交外部资源URL进行抓取或使用,或者应用从数据库或外部服务获取并展示内容。这种场景下,攻击者可能通过伪造的URL引发SSRF攻击,进而访问服务器的内部资源。

  2. 代理请求场景
    代理通常用于中转应用发出的HTTP请求。若代理未能正确过滤和验证请求内容,攻击者可能通过代理访问不受控制的资源,或借助代理规避安全限制。

测试方案:动态生成的URL安全性监控

1. 输入验证与限制

在接受用户提供的URL时,应严格限制输入源,并进行测试以确保任何伪造或恶意URL都被拒绝。

  • 白名单测试:对应用允许的外部服务地址进行白名单配置,并测试仅允许白名单域名访问。例如,提交一个不在白名单中的域名,验证是否正确拒绝请求。

  • 本地IP阻止测试:提交目标为本地IP地址(如127.0.0.1localhost)的URL,确保此类请求被阻止。例如:

    // 测试使用本地 IP
    assertFalse(isPublicIP("127.0.0.1"));
    assertFalse(isPublicIP("localhost"));
    assertFalse(isPublicIP("192.168.1.1"));
    
  • 协议限制测试:确保仅允许HTTP和HTTPS协议,测试提交不支持的协议(如file://ftp://等),并验证这些请求是否被阻止。

    public boolean isValidProtocol(String url) {
        try {
            URL parsedUrl = new URL(url);
            String protocol = parsedUrl.getProtocol();
            return protocol.equals("http") || protocol.equals("https");
        } catch (MalformedURLException e) {
            return false;
        }
    }
    // 测试
    assertTrue(isValidProtocol("https://example.com"));
    assertFalse(isValidProtocol("ftp://example.com"));
    

2. DNS解析监控与测试

确保应用程序在DNS解析时不允许私有地址返回,尤其是针对URL中可能解析到私有IP地址的情况。通过自动化测试工具模拟恶意DNS解析,以确保即使攻击者尝试使用恶意DNS服务器,私有IP的请求也会被阻断。

3. 限速与黑名单

针对多次重复请求或高频请求,可以设置限速机制,并监控是否有过多的失败访问行为。比如当某个IP地址频繁访问被禁止的URL或敏感资源时,自动将其列入黑名单。

  • 限速测试:设置每个IP的请求频率,并测试超过阈值时,是否阻止进一步的请求。
  • 黑名单测试:向系统提交恶意的IP地址,验证其能否自动加入黑名单。

测试方案:代理请求监控

1. 代理安全性监控

通过代理的外部请求必须经过严格验证,确保代理仅处理来自可信来源的请求。

  • 代理URL验证:确保代理在处理请求前会对URL进行再次验证,包括协议、域名及IP地址等。针对URL中可能包含的恶意子域或重定向行为进行测试,确保代理正确过滤恶意请求。

  • 代理限速测试:在代理服务器上,测试其是否能够在高负载或异常请求量的情况下,识别并阻止恶意用户。可以模拟大量伪造请求,监控代理的表现。

  • 代理的日志与告警系统:在代理服务器上实施日志记录,测试日志是否能正确记录每次请求的详细信息,特别是失败请求的原因。同时,确保系统在发生异常行为时发出告警。例如,代理在处理本地IP请求时,触发安全告警。

2. 代理验证与认证

确保所有通过代理发起的请求都有验证机制。代理不仅仅是一个简单的中转站,它应该对客户端的每个请求进行身份认证。

  • 身份认证测试:确保代理只允许认证用户访问外部资源,未认证的请求会被拒绝或跳转至认证页面。可以设计测试场景,模拟未认证的用户发起请求并检查代理行为。

  • 密钥与令牌管理:对所有代理请求使用安全令牌或密钥验证,并模拟攻击者尝试绕过验证过程,确保代理可以识别并阻止非法请求。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2181684.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【鸿蒙开发】05 登录Demo解析

文章目录 一、功能介绍 在鸿蒙开发中&#xff0c;一个完善的登录功能是许多应用程序的基础需求。本文将详细介绍一个鸿蒙 App 登录 Demo&#xff0c;包括其功能介绍、代码解析以及代码 demo 的下载地址。 本文初始代码从华为开发者网站下载&#xff0c;根据该Demo进行内容调整。…

【Fast-LIO系列】Fast-LIO、Fast-LIO2、Faster-LIO系列特点分析

【FAST-LIO】Fast-LIO系列特点分析 1. FAST-LIO核心贡献1.将IMU和Lidar特征点紧耦合在一起2.使用反向传播考虑到了运动补偿3. 基于IESKF中的 卡尔曼增益更新 K 2. FAST-LIO2核心贡献(2021年)1. 不用线&#xff0c;面特征点而使用全局点云2. 使用ikd-tree存储点云3. ikd-Tree 3.…

P3131 [USACO16JAN] Subsequences Summing to Sevens S Python题解

[USACO16JAN] Subsequences Summing to Sevens S 题目描述 Farmer John’s N N N cows are standing in a row, as they have a tendency to do from time to time. Each cow is labeled with a distinct integer ID number so FJ can tell them apart. FJ would like to ta…

C语言 | Leetcode C语言题解之第448题找到所有数组中消失的数字

题目&#xff1a; 题解&#xff1a; int* findDisappearedNumbers(int* nums, int numsSize, int* returnSize) {for (int i 0; i < numsSize; i) {int x (nums[i] - 1) % numsSize;nums[x] numsSize;}int* ret malloc(sizeof(int) * numsSize);*returnSize 0;for (in…

特征工程——一门提高机器学习性能的艺术

当前围绕人工智能(AI)和机器学习(ML)展开的许多讨论以模型为中心&#xff0c;聚焦于 ML和深度学习(DL)的最新进展。这种模型优先的方法往往对用于训练这些模型的数据关注不足&#xff0c;甚至完全忽视。类似MLOps的领域正迅速发展&#xff0c;通过系统性地训练和利用ML模型&…

ZYNQ: GPIO 之 MIO 控制 LED 实验

GPIO 之 MIO 控制 LED 实验目的 使用 GPIO 通过两个 MIO 引脚控制 PS 端两个 LED 的亮灭&#xff0c;实现底板上 PS_LED0、PS_LED1 两个 LED 灯同亮同灭的效果。 简介 ZYNQ PS 中的外设&#xff08;如 USB 控制器、UART 控制器、I2C 控制器以及 GPIO 等等&#xff09;可以通…

亲测无限坐席在线客服系统源码/二开版/基于ThinkPHP+搭建教程

源码简介&#xff1a; 亲测了一款实用的无限坐席在线客服系统源码&#xff0c;这可是基于ThinkPHP框架开发的二开版哦&#xff01;里面还附带了一份超详细的搭建教程。 安装过程简直不能更简单&#xff0c;只需一键操作&#xff0c;启动两个端口就搞定了。而且&#xff0c;它…

动态库的加载全过程

区分一组概念&#xff1a;逻辑地址&#xff0c;虚拟地址&#xff0c;物理地址。 逻辑地址&#xff1a;是我们的代码在编译过程&#xff0c;编译器帮对每一条代码所生成的指令所编写的地址。 物理地址&#xff1a;当程序被放入到内存中时&#xff0c;内存与每一条指令所对应的…

回执单识别-银行回单识别API-文字识别OCR API

银行回单是一种由银行提供的交易凭证&#xff0c;记录了账户资金的交易明细。它通常包括存款、取款、转账、汇款、支付等各种类型的资金往来信息。银行回单可以是纸质的&#xff0c;也可以是电子版的&#xff0c;内容详尽记录了交易的相关信息&#xff0c;具有法律效力&#xf…

CSS 效果:实现动态展示双箭头

最近写了一段 CSS 样式&#xff0c;虽然不难&#xff0c;但实现过程比较繁琐。这个效果结合了两个箭头&#xff0c;一个突出&#xff0c;一个内缩&#xff0c;非常适合用于步骤导航或选项卡切换等场景。样式不仅仅是静态的&#xff0c;还可以通过点击 click 或者 hover 事件&am…

【机器学习(五)】分类和回归任务-AdaBoost算法

文章目录 一、算法概念一、算法原理&#xff08;一&#xff09;分类算法基本思路1、训练集和权重初始化2、弱分类器的加权误差3、弱分类器的权重4、Adaboost 分类损失函数5、样本权重更新6、AdaBoost 的强分类器 &#xff08;二&#xff09;回归算法基本思路1、最大误差的计算2…

JavaSE——面向对象2:方法的调用机制、传参机制、方法递归、方法重载、可变参数、作用域

目录 一、成员方法 (一)方法的快速入门 (二)方法的调用机制(重要) (三)方法的定义 (四)注意事项和使用细节 1.访问修饰符(作用是控制方法的使用范围) 2.返回的数据类型 3.方法名 4.形参列表 5.方法体 6.方法调用细节说明 (五)传参机制 1.基本数据类型的传参机制 …

C++模拟实现vector容器【万字模拟✨】

更多精彩内容..... &#x1f389;❤️播主の主页✨&#x1f618; Stark、-CSDN博客 本文所在专栏&#xff1a; 学习专栏C语言_Stark、的博客-CSDN博客 项目实战C系列_Stark、的博客-CSDN博客 数据结构与算法_Stark、的博客-CSDN博客 座右铭&#xff1a;梦想是一盏明灯&#xff…

idea2023-快速搭建一个本地tomcat的javaWeb项目(从0到1保姆教学)

前言 如何在新版idea中搭建一个javaWeb项目&#xff0c;并且应用在物理的tomcat中&#xff0c;本文将进行从零到一&#xff0c;完成搭建步骤&#xff0c;以及相关注意事项的讲解。 为什么需要配置tomcat&#xff1f; 我们开发的javaWeb项目&#xff0c;最后都需要打包部署到真正…

了解华为计算产品线,昇腾的业务都有哪些?

&#x1f349; CSDN 叶庭云&#xff1a;https://yetingyun.blog.csdn.net/ 随着 ChatGPT 的现象级爆红&#xff0c;它引领了 AI 大模型时代的深刻变革&#xff0c;进而造成 AI 算力资源日益紧缺。与此同时&#xff0c;中美贸易战的持续也使得 AI 算力国产化适配成为必然趋势。 …

Flet介绍:平替PyQt的好用跨平台Python UI框架

随着Python在各个领域的广泛应用&#xff0c;特别是在数据科学和Web开发领域&#xff0c;对于一个简单易用且功能强大的用户界面&#xff08;UI&#xff09;开发工具的需求日益增长。传统的Python GUI库如Tkinter、PyQt虽然功能强大&#xff0c;但在易用性和现代感方面略显不足…

ZYNQ:Hello World 实验-PS-串口打印“Hello World”

Hello World 实验目的 PS-串口打印“Hello World” 创建 Vivado 工程 设置工程名为“hello_world” 使用 IP Integrator 创建 Processing System 搜索栏中键入“zynq”&#xff0c;找到并双击“ZYNQ7 Processing System” 串口配置 配置完成后的 ZYNQ7 Processing Sys…

微信小程序 图片的上传

错误示范 /*从相册中选择文件 微信小程序*/chooseImage(){wx.chooseMedia({count: 9,mediaType: [image],sourceType: [album],success(res) {wx.request({url:"发送的端口占位符",data:res.tempFiles[0].tempFilePath,method:POST,success(res){//请求成功后应该返…

【C++】 vector 迭代器失效问题

【C】 vector 迭代器失效问题 一. 迭代器失效问题分析二. 对于vector可能会导致其迭代器失效的操作有&#xff1a;1. 会引起其底层空间改变的操作&#xff0c;都有可能是迭代器失效2. 指定位置元素的删除操作--erase3. Linux下&#xff0c;g编译器对迭代器失效的检测并不是非常…

Python从入门到高手3.5节-程序实战之最小值算法

目录 3.5.1 算法思路 3.5.2 构造随机数 3.5.3 条件控制语句 3.5.4 完整的代码实现 3.5.5 大神薯条老师 3.5.1 算法思路 算法原理很简单&#xff0c;先任取两个数进行比较&#xff0c;以计算两个数中的最小值&#xff1a; 假设得到的最小值为min_&#xff0c;再用这两个数…