OGNL 表达式注入分析 _
OGNL 基础
依赖
OGNL 三要素
Expression 表达式
root 根对象、即操作对象
context 上下文,用于保存对象运行的属性及值,有点类似运行环境的意思,保存了环境变量
看个例子
运行以上代码就是获取org.example.Tester.user.name
的值,上述我们是创建了一个 tester,并且让他的 user 属性为一个 User 对象,且 tester 设置为 root,表达式为user.name
也就是获取 root 即 tester 的 user 属性的 name 属性。
OGNL 语法
.
操作符
一个例子,(#a=new java.lang.String("calc")).(@java.lang.Runtime@getRuntime().exec(#a))
,也可以这样(#a=new java.lang.String("calc")),(@java.lang.Runtime@getRuntime().exec(#a))
,中间的点换成逗号。可以发现它执行的方式有点类似递归,他把.前面的表达式当做结果给后面的表达式执行了这里需要注意一下#
前我们用括号包裹起来了,这是为了符合语法,假如去掉那一层包裹会报错
#
操作符
用于调用非 root 对象
用于创建 Map#{"name": "f12", "level": "noob"}
用于定义变量如一开始的例子#a=new java.lang.String("calc")
,定义了一个字符串常量
@
操作符
用于调用静态属性、静态方法、静态变量,如上述的@java.lang.Runtime@getRuntime().exec
OGNL 版本限制
在 OGNL>=3.1.25 版本中设置了黑名单
投影与选择
OGNL 支持类似数据库当中的选择与投影功能。
投影:选出集合当中的相同属性组合成一个新的集合。语法为 collection.{XXX},XXX 就是集合中每个元素的公共属性。
选择:选择就是选择出集合当中符合条件的元素组合成新的集合。语法为 collection.{Y XXX},其中 Y 是一个选择操作符,XXX 是选择用的逻辑表达式。选择操作符有 3 种:? :选择满足条件的所有元素^:选择满足条件的第一个元素 $:选择满足条件的最后一个元素
OGNL Expression 解析流程
getValue
处打个断点,跟进,注意这个 node 的类型ASTchain
在 OGNL 表达式中,解析和执行就是通过ASTXXXX
这些方法去解析执行的,一共有ASTChain、ASTConst、ASTCtor、ASTInstanceof、ASTList、ASTMethod、ASTStaticField、ASTStaticMethod.....等多种方法,其中最根本的就是 chain
进入 chain 的 getValue 方法
进入evaluateGetValueBody
方法,这里判断 context 是不是 const,这里并不是
往下走进入 getValueBody,获取子节点,并进入子节点的 getValue 方法,然后就这样一直循环
最后进入OgnlRuntime.callMethod
一直往下走,这里 invoke,弹出计算器
文章转载自:F12~
评论