🗒️OGNL表达式
2023-3-10
| 2023-4-17
0  |  0 分钟
type
status
date
slug
summary
tags
category
icon
password

OGNL

OGNL是一个功能强大的表达式语言,用来获取和设置 java 对象的属性 ,它旨在提供一个更高抽象度语法来对 java 对象图进行导航。
OGNL具有三要素: 表达式、ROOT对象、上下文环境
表达式: 显然,这肯定是其中最重要的部分,通过表达式来告诉OGNL需要执行什么操作。
ROOT对象: 也就是OGNL操作的的对象,也就是说这个表达式针对谁进行操作。
上下文环境: 有了前两个条件,OGNL就能进行执行了,但是表达式有需要执行一系列操作,所以会限定这些操作在一个环境下,这个环境就是上下文环境,这个环境是个MAP结构。

场景

  1. 对象方法调用,如:×××.doSomeSpecial();
  1. 类静态的方法调用和值访问 @[类全名(包括包路径)]@[方法名 | 值名]或@tutorial.MyConstant@APP_NAME;
  1. 访问OGNL上下文(OGNL context)和ActionContext;
  1. 操作(创建)集合对象。

OGNL使用

引入
使用
标签获取取值,取值的时候要注意根元素(全局变量)不用#号,其他的都用#号

审计

OGNL注入漏洞影响Struts2的多个版本,审计时可以查看是否使用了Struts2框架.
查找ClassResolver方法,ClassResolver是有关类的寻址以及调用的,也就是常说的所谓的执行
查找OgnlUtil,setOgnlUtil添加黑名单功能
struts-defult.xml中的黑名单
com.opensymphony.xwork2.ognl.SecurityMemberAccess
查看memberAccess的属性
除了struts2大量的OGNl表达式漏洞以外, Confluence Server 和 Data Center 也被爆出OGNL 表达式注入漏洞(CVE-2021-26084)(CVE-2022-26134)

Confluence Server OGNL 表达式注入漏洞

Atlassian Confluence Server and Data Center 澳大利亚软件公司 Atlassian 开发的基于网络的企业 wiki系统。 漏洞原理 namespace参数通过 ServletDispatcher#getNameSpace 函数获取namespace 取值为请求 servletPath 最后一个 / 之前的部分。 根据正则表达式规则,构造出相应的 URL,URI被作为OGNL(java中常用的表达式语言)解析,造成表达式注入。 修复:升级到Atlassian Confluence Server and Data Center至安全版本。

防御和修复

升级Struts2框架和Atlassian Confluence Server and Data Center版本,对用户的输入参数合法性进行过滤
OGNL注入漏洞影响Struts2的多个版本,在多个版本中黑名单也是经过很多次的变动.Struts2随着其不断地发展,减少了原来框架的一部分灵活性而大大的增强了其安全性.
漏洞
  • 表达式
  • 漏洞
  • OWASP ZAP使用log4j远程执行漏洞代码审计(netcat/JNDI)
    目录