SpEL 注入 学习笔记

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 表达式时,参数不要由外部用户输入

点击关注,共同学习!安全狗的自我修养

github haidragon

https://github.com/haidragon

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

C-haidragon

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值