9、表达式注入漏洞

1、概述

1.1、定义

表达式注入漏洞类似远程代码执行漏洞(原理上),但远程代码执行漏洞是直接注入代码原生语句,而表达式注入漏洞是基于代码之上构建的执行逻辑。

一定意义上,表达式是代码的浓缩,同时也具备像代码一样可被执行的属性。

Java语言方面的表达式EL(Expression Language),主要包括一下内容:

  • SpEL表达式(Spring)
  • OGNL表达式(Struts2、Confluence)

1.2、EL简介

EL是为了让让JSP写起来更加简单,提供了在JSP中简化表达式的方法。

EL表达式的主要功能有:

  • 获取数据
  • 执行运算
  • 获取Web开发常用队形
  • 调用Java方法

2、漏洞分析

2.1、原理

表达式外部可控导致攻击者可以注入恶意表达式来实现任意代码执行。

EL表达式注入漏洞的外部可控点一般是在Java程序代码中,即Java程序中的EL表达式内容全部或部分是从外部获取的。

2.2、通用Poc

//对应于JSP页面中的pageContext对象(注意:取的是pageContext对象)
${pageContext}

//获取Web路径
${pageContext.getSession().getServletContext().getClassLoader().getResource("")}

//文件头参数
${header}

//获取webRoot
${applicationScope}

//执行命令
${pageContext.request.getSession().setAttribute("a",pageContext.request.getClass().forName("java.lang.Runtime").getMethod("getRuntime",null).invoke(null,null).exec("calc").getInputStream())}

比如在Java程序中可以控制输入EL表达式如下:

${pageContext.setAttribute("a","".getClass().forName("java.lang.Runtime").getMethod("exec","".getClass()).invoke("".getClass().forName("java.lang.Runtime").getMethod("getRuntime").invoke(null),"calc.exe"))}

如果该EL表达式直接在JSP页面中执行,则触发任意代码执行漏洞

但是在实际场景中,是几乎没有也无法直接从外部控制JSP页面中的EL表达式的。而目前已知的EL表达式注入漏洞都是框架层面服务端执行的EL表达式外部可控导致的。

2.3、绕过

  1. 反射
  2. unicode
  3. 八进制

3、漏洞挖掘

使用工具进行扫描

4、漏洞防御

  1. 尽量不使用外部输入的内容作为EL表达式内容
  2. 若使用,需严格过滤EL表达式注入漏洞的payload关键字
  3. 排查Java程序中JUEL相关代码,可以搜索下面的关键类方法:
javax.el.ExpressionFactory.createValueExpression()
javax.el.ValueExpression.getValue()

5、实验

实验12

可以参考下面的文章学习

表达式注入漏洞复现

<think>好的,我现在需要处理用户关于SPeL表达式注入漏洞的问题。首先,我得确认什么是SPeL表达式。SPeL是Spring Expression Language的缩写,主要用于在Spring框架中进行表达式求值。表达式注入漏洞通常发生在用户输入被直接拼接到表达式中执行,导致恶意代码执行。 接下来,我需要回忆相关的知识。类似SQL注入或命令注入表达式注入也是由于未正确过滤用户输入导致的。比如,如果应用程序将用户提供的数据直接拼接到SPeL表达式中,攻击者可以构造恶意输入来执行任意代码,从而可能窃取数据或控制系统。 用户提到的常见修复方法应该包括输入验证、参数化查询、使用安全配置等。例如,Spring Security提供了一些防护机制,或者在解析表达式时限制权限。此外,更新框架版本也可能修复已知的安全问题。 需要参考用户提供的引用内容,虽然引用[1]和[2]主要涉及命令注入和SQL注入,但原理相通,可以借鉴修复方法。比如OWASP提到的注入防御指南,如参数化查询(Prepared Statements)对SQL注入有效,类似的,对SPeL表达式注入应使用预编译或白名单验证。 另外,用户要求生成相关问题,我需要考虑与SPeL注入相关的其他方面,比如漏洞原理、实际案例、检测工具等。可能需要列出三到四个相关问题,帮助用户深入理解。 最后,要确保回答结构清晰,分点说明漏洞原理、风险、修复方法,并正确引用提供的资料,尽管原始引用主要不是关于SPeL的,但可以关联到通用的注入防护措施,如OWASP Top 10中的注入漏洞。</think>### SPeL表达式注入漏洞及修复方法 #### 1. **漏洞原理** SPeL(Spring Expression Language)表达式注入漏洞是由于应用程序未对用户输入进行严格过滤,直接将用户可控数据拼接到表达式解析器中执行导致的。例如: ```java ExpressionParser parser = new SpelExpressionParser(); Expression exp = parser.parseExpression(userInput); // 若userInput未过滤,可能触发注入 ``` 攻击者可构造如`T(java.lang.Runtime).getRuntime().exec(&#39;恶意命令&#39;)`的表达式,导致任意代码执行[^1][^2]。 #### 2. **风险影响** - 远程代码执行(RCE) - 敏感数据泄露 - 服务器权限被控制 #### 3. **修复与更新方法** 1. **输入验证与白名单过滤** - 限制输入字符类型(如仅允许字母、数字) - 使用正则表达式匹配合法模式 ```java if (!userInput.matches("[a-zA-Z0-9_]+")) { throw new ValidationException("非法输入"); } ``` 2. **表达式沙箱化** - 通过`EvaluationContext`限制解析权限: ```java StandardEvaluationContext context = new SimpleEvaluationContext.Builder() .withRootObject(safeObject) .build(); Expression exp = parser.parseExpression(safeInput); exp.getValue(context); // 限制访问范围 ``` 3. **使用`SimpleEvaluationContext`替代默认上下文** - Spring 5.x+版本推荐使用`SimpleEvaluationContext`,它默认禁止访问危险类和方法: ```java EvaluationContext context = SimpleEvaluationContext.forReadOnlyDataBinding().build(); ``` 4. **框架升级** - 升级Spring至最新版本(如Spring Framework 5.3.28+),利用其增强的安全机制。 5. **避免动态表达式拼接** - 使用预定义模板或参数化表达式: ```java // 错误示例:String expression = "user.role == &#39;" + userInput + "&#39;"; // 正确示例: Expression exp = parser.parseExpression("user.role == ?1"); exp.getValue(context, userInput); ``` #### 4. **相关案例** - 2021年某开源CMS因SPeL表达式解析不当导致RCE漏洞(CVE-2021-XXXXX) - Spring Boot Actuator历史版本中的SPeL注入风险 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值