一、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
4A评测 - 免责申明
本站提供的一切软件、教程和内容信息仅限用于学习和研究目的。
不得将上述内容用于商业或者非法用途,否则一切后果请用户自负。
本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑或手机中彻底删除上述内容。
如果您喜欢该程序,请支持正版,购买注册,得到更好的正版服务。如有侵权请邮件与我们联系处理。敬请谅解!
程序来源网络,不确保不包含木马病毒等危险内容,请在确保安全的情况下或使用虚拟机使用。
侵权违规投诉邮箱:4ablog168#gmail.com(#换成@)