Java代码审计中的SSRF漏洞深度解析
LYL
- 关注
一、SSRF漏洞原理与危害
SSRF(Server-Side Request Forgery)服务端请求伪造漏洞,攻击者通过构造恶意请求使服务端发起非预期的网络请求,可能导致以下风险:
访问内部敏感系统(如数据库、管理后台)
端口扫描探测内网服务
文件协议读取本地文件(file://)
与其他漏洞形成链式攻击(如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();
}
}
漏洞执行流程分析
攻击入口:攻击者访问
/request?url=http://attacker.com
端点参数注入:
urlString
参数直接接收用户输入(如http://192.168.1.1:8080
)建立连接:
new URL(urlString)
未做任何校验即实例化URL对象url.openConnection()
根据协议创建实际连接(支持HTTP/HTTPS/FTP等)
发起请求:
conn.getInputStream()
触发网络请求数据泄露:读取响应内容并返回给攻击者
漏洞利用场景
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());
}
}
}
漏洞触发路径
请求构造:
HttpGet
直接使用未过滤的URL参数协议支持:默认支持
http
/https
/ftp
/file
等协议攻击示例:
// 探测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();
}
}
漏洞利用特征
协议处理:支持
http
/https
/ftp
/file
/jar
等协议绕过技巧:
// 使用302跳转绕过白名单检测
.url("http://safe.com/redirect?target=http://internal")
// 使用非标准端口
.url
可试读前30%内容
¥ 19.9 全文查看
9.9元开通FVIP会员
畅读付费文章
畅读付费文章
最低0.3元/天
免责声明
1.一般免责声明:本文所提供的技术信息仅供参考,不构成任何专业建议。读者应根据自身情况谨慎使用且应遵守《中华人民共和国网络安全法》,作者及发布平台不对因使用本文信息而导致的任何直接或间接责任或损失负责。
2. 适用性声明:文中技术内容可能不适用于所有情况或系统,在实际应用前请充分测试和评估。若因使用不当造成的任何问题,相关方不承担责任。
3. 更新声明:技术发展迅速,文章内容可能存在滞后性。读者需自行判断信息的时效性,因依据过时内容产生的后果,作者及发布平台不承担责任。
本文为 LYL 独立观点,未经授权禁止转载。
如需授权、对文章有疑问或需删除稿件,请联系 FreeBuf 客服小蜜蜂(微信:freebee1024)
如需授权、对文章有疑问或需删除稿件,请联系 FreeBuf 客服小蜜蜂(微信:freebee1024)
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
相关推荐
企业云安全中的Kubernetes攻击手法及防御策略
2025-03-06
XSS 漏洞深度解析:攻防对抗与高阶利用
2025-03-05
JWT 原理与漏洞深度解析及攻防实战
2025-03-04
文章目录