0x01 漏洞描述

服务端请求伪造 (Server-Side Request Forgery)。

由攻击者构造带有攻击的请求传给服务器执行造成的漏洞。

一般是使用它在外网探测数据或是攻击内网服务。

0x02 SSRF 漏洞作用

  1. 内网ip/端口扫描
  2. 服务器敏感数据读取
  3. 内网主机应用程序漏洞利用
  4. 内网web站点漏洞利用

    0x03 SSRF漏洞的常见的位置

  5. 社交分享功能:获取超链接的标题等内容进行显示

  6. 图片加载/下载:例如富文本编辑器中的点击下载图片到本地;通过URL地址加载或下载图片
  7. 图片/文章收藏功能:主要其会取URL地址中title以及文本的内容作为显示以求一个好的用具体验
  8. 开发平台接口测试工具:一些公司会把自己的一些接口开放出来,形成第三方接口。这个时候他们通常会开发一个用于测试自己接口是否连通的web,给这些程序员测试接口,如果没有过滤好,就会造成ssrf

0x05 相关类

  1. // 代码审计中想找ssrf
  2. // 有一个简单的方法
  3. // 搜索这个类,或是继承该类的,在或是与该类功能类似的就对了
  4. java.net.URLConnection

0x06 查看谁继承了 URLConnection 的方法

  1. mac下的idea: control + h

image.png
image.png

0x07 Java ssrf 中支持的伪协议

支持的伪协议
file
ftp
http
https
jar
mailto
netdoc

0x08 SSRF 漏洞基本利用例子

  1. URLConnection: 可以走java中支持的各种协议,例如 file
  2. HttpURLConnection: 只能走HTTP或是HTTPS协议

0x08.1 URLConnection-读取文件

  1. import java.net.URL;
  2. import java.net.URLConnection;
  3. import java.io.BufferedReader;
  4. import java.io.InputStreamReader;
  5. public class SsrfTest {
  6. public static void main(String[] args) {
  7. try {
  8. // 漏洞利用点
  9. String url = "https://www.baidu.com";
  10. // 实例化url的对象
  11. URL u = new URL(url);
  12. //打开一个URL连接,并运行客户端访问资源。
  13. URLConnection connection = u.openConnection();
  14. connection.connect();
  15. connection.getInputStream();
  16. StringBuilder response = new StringBuilder();
  17. //获取url中的资源
  18. BufferedReader in = new BufferedReader(
  19. new InputStreamReader(connection.getInputStream(), "UTF-8"));
  20. String line;
  21. while ((line = in.readLine()) != null) {
  22. response.append(line + "\n");
  23. }
  24. in.close();
  25. System.out.print(response.toString());
  26. } catch (Exception e) {
  27. e.printStackTrace();
  28. }
  29. }
  30. }
  1. // 利用方式:
  2. //
  3. // 利用http/https访问站点
  4. // 如果访问成功就会返回数据
  5. // 例如:
  6. // String url = "https://www.baidu.com";
  7. // 利用http/https探测端口
  8. // 开启访问的端口时会返回很快,如果没开启就会延迟一下
  9. // 例如:
  10. // String url = "https://127.0.0.1:8080";
  11. // String url = "https://127.0.0.1:6379";
  12. // 利用file协议查看文件
  13. // 如果访问成功就会返回数据
  14. // 例如:
  15. // String url = "file://C:/Windows/win.ini";
  16. // String url = "file:///etc/passwd";

0x08.2 HttpURLConnection-内网探测

  1. import java.net.URL;
  2. import java.net.URLConnection;
  3. import java.net.HttpURLConnection;
  4. import java.io.BufferedReader;
  5. import java.io.InputStreamReader;
  6. public class SsrfTest {
  7. public static void main(String[] args) {
  8. try {
  9. // 漏洞利用点
  10. String url = "https://www.baidu.com";
  11. //实例化url的对象
  12. URL u = new URL(url);
  13. // 打开一个URL连接,并运行客户端访问资源。
  14. URLConnection urlConnection = u.openConnection();
  15. // 强转为HttpURLConnection
  16. HttpURLConnection httpUrl = (HttpURLConnection) urlConnection;
  17. StringBuilder response = new StringBuilder();
  18. // 获取url中的资源
  19. BufferedReader in = new BufferedReader(
  20. new InputStreamReader(httpUrl.getInputStream(), "UTF-8"));
  21. String line;
  22. while ((line = in.readLine()) != null) {
  23. response.append(line);
  24. }
  25. in.close();
  26. System.out.println(response);
  27. } catch (Exception e) {
  28. e.printStackTrace();
  29. }
  30. }
  31. }
  1. // 利用方式:
  2. //
  3. // 利用http/https访问站点
  4. // 如果访问成功就会返回数据
  5. // 例如:
  6. // String url = "https://www.baidu.com";
  7. // 利用http/https探测端口
  8. // 开启访问的端口时会返回很快,如果没开启就会延迟一下
  9. // 例如:
  10. // String url = "https://127.0.0.1:8080";
  11. // String url = "https://127.0.0.1:6379";

0x09 实战中可以拿来ssrf的类

  1. 想找ssrf的时候可以找找这些类的 输入点 是否外部可控
  1. URL.openStream
  2. URLConnection
  3. HttpURLConnection
  4. HttpURLConnection.connect
  5. HttpURLConnection.getInputStream
  6. HttpClient
  7. HttpClient.execute
  8. HttpClient.executeMethod
  9. HttpRequest
  10. HttpRequest.get
  11. HttpRequest.post
  12. HttpRequest.put
  13. HttpRequest.delete
  14. HttpRequest.head
  15. HttpRequest.options
  16. HttpRequest.trace
  17. okhttp = Request request = new Request.Builder().url([触发点]).build();

0x10 总结

在挖掘的时候,一定请记住,如果可以在未经过验证的情况下发起一个远程请求,那么就有可能存在SSRF漏洞!!!!
只要记住这句话,SSRF漏洞挖掘起来就不难