SSRF漏洞
SSRF(Server-side Request Forge, 服务端请求伪造)。 由攻击者构造的攻击链接传给服务端执行造成的漏洞,一般用来在外网探测或攻击内网服务。
利用伪协议读取文件
由于Java没有php的cURL,所以Java SSRF支持的协议,不能像php使用curl -V
查看。
Java网络请求支持的协议可通过下面几种方法检测:
- 代码中遍历协议
- 官方文档中查看
import sun.net.www.protocol
查看
SSRF是由发起网络请求的方法造成。所以先整理Java能发起网络请求的类。
- HttpClient及其派生类Request等
- HttpURLConnection
- URLConnection
- URL
- okhttp
这里只简单分析URLConnection类实现对伪协议的支持。
漏洞代码
@RequestMapping(value = "/urlConnection/vuln", method = {
RequestMethod.POST, RequestMethod.GET})
public String URLConnectionVuln(String url) {
return HttpUtils.URLConnection(url);
}
这里调用了工具类HttpUtils中的URLConnecione方法。
public static String URLConnection(String url) {
try {
URL u = new URL(url);
URLConnection urlConnection = u.openConnection();
BufferedReader in = new BufferedReader(new InputStreamReader(urlConnection.getInputStream())); //send request
// BufferedReader in = new BufferedReader(new InputStreamReader(u.openConnection().getInputStream()));
String inputLine;
StringBuilder html = new StringBuilder();
while ((inputLine = in.readLine()) != null) {
html.append(inputLine);
}
in.close();
return html.toString();
} catch (Exception e) {
logger.error(e.getMessage());