SpEL 注入


免责声明

本文档仅供学习和研究使用,请勿使用文中的技术源码用于非法用途,任何人造成的任何负面影响,与本人无关.


相关文章


什么是 SpEL 注入

Spring Expression Language(简称SpEL)是一种强大的表达式语言,支持在运行时查询和操作对象图。

语言语法类似于 Unified EL,但提供了额外的功能,特别是方法调用和基本的字符串模板功能。同时因为 SpEL 是以 API 接口的形式创建的,所以允许将其集成到其他应用程序和框架中。

当使用 SpelExpressionParser 解析 spel 表达式,且表达式可被外部控制,则可能导致 SPel 表达式注入从而造成 RCE.


漏洞代码示例

示例1

@RequestMapping(path = "/elinjection")
public class SPelInjectionController {
    @RequestMapping(value="/spel.html",method= RequestMethod.GET)
    public String SPelInjection(ModelMap modelMap, HttpServletRequest request, HttpServletResponse response) throws IOException {
        String el=request.getParameter("el");
        //el="T(java.lang.Runtime).getRuntime().exec(\"open /Applications/Calculator.app\")";
        ExpressionParser PARSER = new SpelExpressionParser();
        Expression exp = PARSER.parseExpression(el);
        return (String)exp.getValue();
    }
}

示例2

@GetMapping("/vul")
public String spelVul(String ex) {
    ExpressionParser parser = new SpelExpressionParser();
    String result = parser.parseExpression(ex).getValue().toString();
    System.out.println(result);
    return result;
}

直接将用户的输入当作表达式内容进行解析。

以示例2为例,是 Hello-Java-Sec 中的示例代码

输入一个简单的乘法运算 9*9,可以看到返回的值是经过解析后的 81

执行下系统命令

/vul?ex=T(java.lang.Runtime).getRuntime().exec("open -a Calculator")

T(Type): 使用“T(Type)”来表示java.lang.Class实例,同样,只有 java.lang 下的类才可以省略包名


这个漏洞类型的案例


修复方案

  • 解析 el 表达式时,参数不要由外部用户输入