加入收藏 | 设为首页 | 会员中心 | 我要投稿 PHP编程网 - 湛江站长网 (https://www.0759zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 建站 > 正文

Java代码审计之SpEL表达式注入

发布时间:2019-03-20 11:27:20 所属栏目:建站 来源:Lateink
导读:副标题#e# 一、SpEL 表达式注入 Spring Expression Language(简称 SpEL)是一种功能强大的表达式语言、用于在运行时查询和操作对象图;语法上类似于 Unified EL,但提供了更多的特性,特别是方法调用和基本字符串模板函数。SpEL 的诞生是为了给 Spring 社区提

类类型表达式:使用”T(Type)”来表示 java.lang.Class 实例,”Type”必须是类全限定名,”java.lang”包除外,即该包下的类可以不指定包名;使用类类型表达式还可以进行访问类静态方法及类静态字段。

具体使用方法:

  1. ExpressionParser parser = new SpelExpressionParser(); 
  2.         // java.lang 包类访问 
  3. Class<String> result1 = parser.parseExpression("T(String)").getValue(Class.class); 
  4. System.out.println(result1); 
  5.         //其他包类访问 
  6. String expression2 = "T(java.lang.Runtime).getRuntime().exec('open /Applications/Calculator.app')"; 
  7. Class<Object> result2 = parser.parseExpression(expression2).getValue(Class.class); 
  8. System.out.println(result2); 
  9.         //类静态字段访问 
  10. int result3 = parser.parseExpression("T(Integer).MAX_VALUE").getValue(int.class); 
  11. System.out.println(result3); 
  12.         //类静态方法调用 
  13. int result4 = parser.parseExpression("T(Integer).parseInt('1')").getValue(int.class); 
  14. System.out.println(result4); 
  • 类实例化:类实例化同样使用 java 关键字「new」,类名必须是全限定名,但 java.lang 包内的类型除外,如 String、Integer。
  • instanceof 表达式:SpEL 支持 instanceof 运算符,跟 Java 内使用同义;如”‘haha’ instanceof T(String)”将返回 true。
  • 变量定义以及引用:变量定义通过 EvaluationContext 接口的 setVariable(variableName, value) 方法定义;在表达式中使用”#variableName”引用;除了引用自定义变量,SpE 还允许引用根对象及当前上下文对象,使用”#root”引用根对象,使用”#this”引用当前上下文对象;
  • 自定义函数:目前只支持类静态方法注册为自定义函数;SpEL 使用 StandardEvaluationContext 的 registerFunction 方法进行注册自定义函数,其实完全可以使用 setVariable 代替,两者其实本质是一样的

四、审计过程

这里拿 Spring Message 远程命令执行漏洞来作为例子

1. 环境搭建

  1. git clone https://github.com/spring-guides/gs-messaging-stomp-websocket 
  2. git checkout 6958af0b02bf05282673826b73cd7a85e84c12d3 

(编辑:PHP编程网 - 湛江站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!