freeBuf
主站

分类

漏洞 工具 极客 Web安全 系统安全 网络安全 无线安全 设备/客户端安全 数据安全 安全管理 企业安全 工控安全

特色

头条 人物志 活动 视频 观点 招聘 报告 资讯 区块链安全 标准与合规 容器安全 公开课

点我创作

试试在FreeBuf发布您的第一篇文章 让安全圈留下您的足迹
我知道了

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

Java代码审计中的SSRF漏洞深度解析
LYL 2025-03-14 11:02:43 812
所属地 广东省

一、SSRF漏洞原理与危害

SSRF(Server-Side Request Forgery)服务端请求伪造漏洞,攻击者通过构造恶意请求使服务端发起非预期的网络请求,可能导致以下风险:

  1. 访问内部敏感系统(如数据库、管理后台)

  2. 端口扫描探测内网服务

  3. 文件协议读取本地文件(file://)

  4. 与其他漏洞形成链式攻击(如XXE+SSRF)

本文从java代码审计的角度去认识ssrf

二、Spring MVC HttpURLConnection 漏洞示例

完整漏洞代码

import org.springframework.web.bind.annotation.*;
import java.net.*;
import java.io.*;

@RestController
public class VulnerableController {

    @GetMapping("/request")
    public String requestUrl(@RequestParam("url") String urlString) throws IOException {
        URL url = new URL(urlString); // 漏洞根源:直接使用未校验的用户输入
        HttpURLConnection conn = (HttpURLConnection) url.openConnection();
        conn.setRequestMethod("GET");

        // 读取响应内容
        StringBuilder response = new StringBuilder();
        try (BufferedReader in = new BufferedReader(
                new InputStreamReader(conn.getInputStream()))) {
            String inputLine;
            while ((inputLine = in.readLine()) != null) {
                response.append(inputLine);
            }
        }
        return response.toString();
    }
}

漏洞执行流程分析

  1. 攻击入口:攻击者访问 /request?url=http://attacker.com端点

  2. 参数注入urlString参数直接接收用户输入(如 http://192.168.1.1:8080

  3. 建立连接

    • new URL(urlString)未做任何校验即实例化URL对象

    • url.openConnection()根据协议创建实际连接(支持HTTP/HTTPS/FTP等)

  4. 发起请求conn.getInputStream()触发网络请求

  5. 数据泄露:读取响应内容并返回给攻击者

漏洞利用场景

GET /request?url=file:///etc/passwd HTTP/1.1
GET /request?url=http://169.254.169.254/latest/meta-data/ HTTP/1.1  # AWS元数据

三、Apache HttpClient 漏洞示例

完整漏洞代码

import org.apache.http.client.methods.*;
import org.apache.http.impl.client.*;

@GetMapping("/apacheRequest")
public String apacheRequest(String url) throws Exception {
    try (CloseableHttpClient client = HttpClients.createDefault()) {
        HttpGet request = new HttpGet(url); // 漏洞点:直接使用用户输入
        try (CloseableHttpResponse response = client.execute(request)) {
            return EntityUtils.toString(response.getEntity());
        }
    }
}

漏洞触发路径

  1. 请求构造HttpGet直接使用未过滤的URL参数

  2. 协议支持:默认支持 http/https/ftp/file等协议

  3. 攻击示例

// 探测Redis服务
client.execute(new HttpGet("http://127.0.0.1:6379"))

// 读取本地文件
client.execute(new HttpGet("file:///C:/Windows/win.ini"))

四、OkHttpClient 漏洞示例

完整漏洞代码

import okhttp3.*;

@GetMapping("/okHttpRequest")
public String okHttpRequest(String inputUrl) throws IOException {
    OkHttpClient client = new OkHttpClient();
    Request request = new Request.Builder()
        .url(inputUrl) // 漏洞核心:未校验的URL输入
        .build();

    try (Response response = client.newCall(request).execute()) {
        return response.body().string();
    }
}

漏洞利用特征

  1. 协议处理:支持 http/https/ftp/file/jar等协议

  2. 绕过技巧

// 使用302跳转绕过白名单检测
.url("http://safe.com/redirect?target=http://internal") 

// 使用非标准端口
.url
可试读前30%内容
¥ 19.9 全文查看
9.9元开通FVIP会员
畅读付费文章
最低0.3元/天
# Java代码审计 # SSRF漏洞
免责声明
1.一般免责声明:本文所提供的技术信息仅供参考,不构成任何专业建议。读者应根据自身情况谨慎使用且应遵守《中华人民共和国网络安全法》,作者及发布平台不对因使用本文信息而导致的任何直接或间接责任或损失负责。
2. 适用性声明:文中技术内容可能不适用于所有情况或系统,在实际应用前请充分测试和评估。若因使用不当造成的任何问题,相关方不承担责任。
3. 更新声明:技术发展迅速,文章内容可能存在滞后性。读者需自行判断信息的时效性,因依据过时内容产生的后果,作者及发布平台不承担责任。
本文为 LYL 独立观点,未经授权禁止转载。
如需授权、对文章有疑问或需删除稿件,请联系 FreeBuf 客服小蜜蜂(微信:freebee1024)
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
LYL LV.4
这家伙太懒了,还未填写个人描述!
  • 22 文章数
  • 9 关注者
企业云安全中的Kubernetes攻击手法及防御策略
2025-03-06
XSS 漏洞深度解析:攻防对抗与高阶利用
2025-03-05
JWT 原理与漏洞深度解析及攻防实战
2025-03-04
文章目录