SpringCloud?Function?SpEL注入漏洞分析及环境搭建
Spring Cloud 是一个开放式软件架构,用于实现基于微服务的应用程序。其中包含很多组件和工具,比如 Spring Cloud Function。Spring Cloud Function 是 Spring Cloud 提供的函数计算框架,可以让开发人员将 Spring 应用程序和函数无缝地集成在一起。但是,近日有研究人员发现了 Spring Cloud Function 中的 SpEL 注入漏洞。本文将分析该漏洞的原理,并介绍如何搭建实验环境进行漏洞测试。
一、漏洞原理
SpEL(Spring Expression Language)是 Spring Framework 中集成的用于表达式计算的语言,类似于 EL 表达式。在 Spring Cloud Function 中,可以使用 SpEL 的方式对函数进行参数注入。例如,在以下代码中,使用 SpEL 将 message 参数注入到 handleRequest 函数中:
@RestController
public class MyController {
@Autowired
private MyService service;
@RequestMapping("/hello")
public String hello(@RequestParam(value="message", defaultValue="Hello World") String message) {
return service.handleRequest(message);
}
}
@Service
public class MyService implements Function<String, String> {
@Override
public String apply(String t) {
return t.toUpperCase();
}
}
在这个例子中,我们可以看到 handleRequest 函数是通过 MyService 来实现的。handleReqest 函数使用了 message 这个参数,它会随着用户传入的参数值而改变。
然而,如果我们在传入 message 参数的时候使用 SpEL,就可以利用 SpEL 注入漏洞来执行一些恶意操作。例如,下面这个例子:
/hello?message=${new String(new byte[]{39,39,44,39,39,59,new java.util.Scanner(T(java.lang.Runtime).getRuntime().exec(%27whoami%27).getInputStream()).useDelimiter(%27\\A%27).next()})}
传入的 message 参数使用 SpEL 将 exec('whoami') 的结果注入到函数中。这样,当请求发起时,恶意代码就会执行,并将返回结果返回到攻击者控制的服务器。
二、漏洞环境搭建
要测试 SpEL 注入漏洞,需要搭建一个漏洞环境。在本例中,我们将使用 Spring Boot 2.0.0.RELEASE 和 Spring Cloud Function 2.0.0.RELEASE 来创建漏洞环境。
1. 创建项目
首先,我们需要在 https://start.spring.io 上创建一个 Spring Boot 2.0.0.RELEASE 项目,并添加相应的依赖:
- Spring Web 配置
- Spring Cloud Function 配置
2. 编写代码
接下来,我们需要编写代码来创建一个示例函数。在这里,我们将创建一个函数计算,对传入的字符串进行加密,并返回加密后的字符串。代码如下:
@Service
public class MyFunction implements Function<String, String> {
@Override
public String apply(String t) {
String encrypted = MD5Util.encrypt(t);
return "Encrypted value is: " + encrypted;
}
}
public class MD5Util {
public static String encrypt(String str) {
try {
MessageDigest md = MessageDigest.getInstance("MD5");
md.update(str.getBytes());
byte[] bytes = md.digest();
StringBuilder sb = new StringBuilder();
for (byte b : bytes) {
sb.append(Integer.toHexString((b & 0xFF) | 0x100).substring(1, 3));
}
return sb.toString();
} catch (NoSuchAlgorithmException e) {
throw new RuntimeException("Error encrypting string: " + e.getMessage());
}
}
}
在这个代码中,我们使用了 Spring Cloud Function 中的 @Service 注解来创建一个 MyFunction 函数。该函数将传入的字符串进行 MD5 加密,并返回加密后的结果。
3. 测试漏洞
在漏洞环境搭建好之后,我们就可以开始测试 SpEL 注入漏洞了。在这里,我们将尝试使用 SpEL 在函数中执行系统命令。我们可以使用以下链接来测试漏洞功能:
http://localhost:8080/function?input=${T(java.lang.Runtime).getRuntime().exec('whoami').getText()}
这个请求将会注入一段恶意代码,利用 SpEL 执行 whoami 命令并返回所执行的命令结果。如果漏洞存在,我们将能够在返回结果中看到当前用户的信息。
三、总结
Spring Cloud Function 是 Spring Cloud 中的一种函数计算框架,可以让开发人员将 Spring 应用程序和函数无缝地集成在一起。然而,近日有研究人员发现了 Spring Cloud Function 中的 SpEL 注入漏洞。在这篇文章中,我们讨论了该漏洞的原理,并介绍了如何搭建实验环境进行漏洞测试。我们希望通过这篇文章的介绍,能够帮助大家更好地理解 SpEL 注入漏洞,并了解如何在 Spring Cloud Function 中防范此类漏洞。
