java代码学习(六)——ssrf漏洞

SSRF介绍

SSRF(Server-Side Request Forgery:服务器端请求伪造) 是一种由攻击者构造形成由服务端发起请求的一个安全漏洞。一般情况下,SSRF攻击的目标是从外网无法访问的内部系统。(正是因为它是由服务端发起的,所以它能够请求到与它相连而与外网隔离的内部系统)。SSRF 形成的原因大都是由于服务端提供了从其他服务器应用获取数据的功能且没有对目标地址做过滤与限制。

SSRF作用

对外网服务器所在的内网、本地进行端口扫描,获取一些服务的banner信息 。

攻击运行在内网或者本地的应用程序。

对内网web应用进行指纹识别,通过访问默认文件实现 。

攻击内外网的web应用。sql注入、struct2、redis等。

利用file协议读取本地文件等。

 

SSRF产生

在该案例中,profilepics参数从请求中获取输入数据,并没有进行任何的过滤和处理,所以可以直接构造payload:http://xxx.com/profilepics?url=file:///etc/passwd.进行读取文件内容的操作。

@GetMapping("/profilepics")

public void openStream(@RequestParam String url, HttpServletResponse response)

throws IOException {

 

  InputStream inputStream = null;

  OutputStream outputStream = null;

 

  String downLoadImgFileName =

  WebUtils.getNameWithoutExtension(url) + "." + WebUtils.getFileExtension(url);

  // download

  response.setHeader(

  "content-disposition",

  "attachment;fileName=" + downLoadImgFileName);

 

  URL u = new URL(url);

  int length;

  byte[] bytes = new byte[1024];

  inputStream = u.openStream(); // send request

  outputStream = response.getOutputStream();

  while ((length = inputStream.read(bytes)) > 0) {

  outputStream.write(bytes, 0, length);

  }

}

 

SSRF防御

 

RASP技术

RASP(Runtime Application Self Protection)是一种现代应用程序安全技术,可以用来防止sql注入、xss、ssrf、反序列化等漏洞的攻击。waf的防御基于流量规则,而RASP技术防御是根据请求上下文进行拦截的。

Java是通过Java Agent方式进行实现,Java Agent有三种机制,分别是Agent_OnLoad、Agent_OnAttach、Agent_OnUnload。

参考:https://docs.oracle.com/javase/8/docs/platform/jvmti/jvmti.html#startup

https://www.iteye.com/blog/nijiaben-1847212

 

后端代码进行限制

  • 限制协议为HTTP、HTTPS协议。例如使用HttpURLConnection强制转换协议为http或https。
  • 禁止URL传入内网IP或者设置URL白名单。例如设置百度,谷歌等域名。
  • 不用限制302重定向。

CVE-2017-3164

  Apache Solrssrf漏洞,没有经过任何过滤就直接把url代入执行了。让我们来跟进下漏洞的细节。

  http://127.0.0.1:8983/solr/db/replication?command=fetchindex&masterUrl=http://f422cd57.y7z.xyz/xxxx&wt=json&httpBasicAuthUser=aaa&httpBasicAuthPassword=bbb

  从漏洞的poc中可以看出,入口点在replication。在这里是org/apache/solr/handler/ReplicationHandler.javahandleRequestBody方法的run方法

 

跟进doFetch方法

 

可以看到,该方法设置了一个masterUrl变量,该变量在后续的代码中没有进行任何的过滤,最终导致了ssrf的产生。让我们接着看fetchLastestIndex方法。

返回两个参数的fetchLastestIndex方法。

 

在这里的重点是getLatestVersion方法。

 

把我们传入的masterUrl变量没经过过滤就执行了,导致漏洞产生。

 

 

https://blog.csdn.net/qq_30135181/article/details/52734225

https://www.cnblogs.com/nice0e3/p/13682434.html

https://xz.aliyun.com/t/4290

https://hdivsecurity.com/bornsecure/what-is-rasp-runtime-application-self-protection/

posted @ 2022-01-06 15:32  Cold灬  阅读(907)  评论(0编辑  收藏  举报