CTF-Web学习笔记:服务端请求伪造(SSRF)篇
目录
引言
一、SSRF的核心原理
1. 什么是SSRF?
2. 漏洞成因
二、CTF中最常见的5类SSRF题型
1. 基础SSRF:读取本地文件
2. 内网探测:扫描内网服务
3. 云服务SSRF:窃取云厂商元数据
4. 协议绕过:利用特殊协议访问内网
5. 结合其他漏洞:SSRF+文件上传/命令执行
三、CTF实战:SSRF的“绕过与利用”技巧
技巧1:判断SSRF是否存在
技巧2:绕过URL过滤
技巧3:利用协议特性扩展攻击
技巧4:对抗WAF与入侵检测
四、CTF实战案例:一道SSRF+Redis高阶题
题目背景
解题步骤
五、总结与防御建议
对CTF选手的建议
对开发者的防御建议
引言
在CTF(Capture The Flag,夺旗赛)的Web安全赛道中,服务端请求伪造(Server-Side Request Forgery, SSRF) 是一类“低调但致命”的漏洞。它利用服务器对用户输入的URL未严格校验的缺陷,诱导服务器向内部网络(如内网IP、私有服务)发起请求,从而窃取敏感信息(如云服务器元数据、数据库密码)、攻击内网服务(如Redis、MySQL),甚至控制整个内网。
本文将结合CTF实战场景,从原理到高阶技巧,带你彻底掌握SSRF的“攻防密码”。
一、SSRF的核心原理
1. 什么是SSRF?
SSRF(Server-Side Request Forgery,服务端请求伪造)是攻击者通过构造恶意URL,诱导服务器向本地或内网资源发起HTTP/HTTPS请求,最终实现以下目标的攻击:
- 读取本地文件(如
/etc/passwd
); - 访问内网服务(如
http://192.168.1.100:3306
); - 触发内网漏洞(如Redis未授权访问、FastCGI RCE)。
2. 漏洞成因
应用程序未对用户输入的外部URL参数做严格校验,直接将其作为请求目标发送给服务器。例如,一个“图片下载”接口可能接收用户提供的url
参数,并通过服务器发起请求下载图片:
# 危险代码示例(Python Flask)
@app.route('/download')
def download():url = request.args.get('url')response = requests.get(url) # 服务器直接发起用户指定的请求return response.content
若用户传入url=http://169.254.169.254/latest/meta-data
(AWS元数据服务),服务器会返回内网敏感数据。
二、CTF中最常见的5类SSRF题型
1. 基础SSRF:读取本地文件
攻击者通过构造file://
协议的URL,诱导服务器读取本地文件(如/etc/passwd
、/flag
)。
CTF考察方式:
题目提供一个下载接口(如http://target.com/download?url=file:///etc/passwd
),用户输入url
参数后,服务器返回文件内容。
关键Payload:
http://target.com/download?url=file:///etc/passwd # Linux本地文件
http://target.com/download?url=file:///C:/Windows/win.ini # Windows本地文件
2. 内网探测:扫描内网服务
攻击者通过构造指向内网IP的URL(如http://192.168.1.1:8080
),探测内网存活主机和服务端口,为后续攻击铺路。
CTF考察方式:
题目提供一个“网络检测”接口(如http://target.com/probe?url=http://192.168.1.%d
),需通过修改IP最后一位(如192.168.1.1
→192.168.1.2
)扫描内网。
关键技巧:
- 内网IP范围:
10.0.0.0/8
(10.x.x.x
)、172.16.0.0/12
(172.16.x.x
~172.31.x.x
)、192.168.0.0/16
(192.168.x.x
); - 常见内网服务端口:
80
(HTTP)、3306
(MySQL)、6379
(Redis)、22
(SSH)。
3. 云服务SSRF:窃取云厂商元数据
云服务器(如AWS、阿里云、腾讯云)提供元数据服务(Metadata Service),通过特定IP(如169.254.169.254
)暴露实例信息(如密钥、标签、安全组)。攻击者可利用SSRF触发服务器访问这些接口,窃取云凭证。
CTF考察方式:
题目提供一个“云监控”接口(如http://target.com/monitor?url=http://169.254.169.254/latest/meta-data
),服务器会返回元数据内容。
关键元数据路径