Skip to content

SpEL表达式注入

en0th edited this page Jul 31, 2024 · 5 revisions

简介

SpEL表达式注入漏洞指的是攻击者通过构造恶意的SpEL(Spring Expression Language)表达式,在Spring应用程序中执行任意的Java代码,从而获取系统权限或者窃取敏感数据。SpEL表达式是Spring框架中用来动态计算表达式的一种机制,允许开发人员在配置文件或注解中使用表达式来动态设置参数值。 SpEL表达式注入漏洞通常是由于开发人员在使用SpEL表达式时,没有对用户输入进行充分的验证和过滤,导致攻击者可以在表达式中注入恶意代码。攻击者可以通过修改请求中的参数或者请求头等信息,来触发SpEL表达式注入漏洞。

攻略

1)动态使用表达式

考察:了解SpEL

参考payload:T(java.lang.Runtime).getRuntime().exec("calc")

PS:这是Windows才有的命令calc,如果你是按照安装文档安装的,请更换成Linux命令,可以是反弹shell、写计划任务。

image-20240726151914543

开发思路

在 SpEL 表达式中可以使用T(Type)来表示java.lang.Class实例。一旦未对用户输入进行处理就直接通过解析引擎对SpEL 表达式进行解析,就会达到 RCE 的目的。 网络上 Payload 的层出不穷,无法利用黑名单进行防御。不过 String 官方推出了SimpleEvaluationContext作为安全类进行防御。 代码来源:com/pika/electricrat/spel/SpelServlet.java

public void spelView(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    String apply = request.getHeader("apply");
//        String spel = "T(java.lang.Runtime).getRuntime().exec("calc")";
    ExpressionParser parser = new SpelExpressionParser();
    Expression expression = parser.parseExpression(apply);
    System.out.println(expression.getValue().toString());
    response.getWriter().append(expression.getValue().toString());
}
Clone this wiki locally