翻译自:https://lgtm.com/blog/apache_struts_CVE-2018-11776-exploit
翻译:聂心明

这篇文章我将介绍如何去构建CVE-2018-11776的利用链。首先我将介绍各种缓解措施,这些措施是Struts 安全团队为了限制OGNL 的能力而设置的,并且我也会介绍绕过这些措施的技术。我将重点介绍SecurityMemberAccess 类的一般改进,这个类就像一个安全管理系统,它决定OGNL 能做什么,也会限制OGNL 的执行环境。我将忽略很多特殊组件的特殊的措施,例如ParametersInterceptor类中改进了白名单机制。

在Struts中利用OGNL 的简短历史

在介绍CVE-2018-11776之前,我先说明一些背景并且介绍一些概念以帮助理解OGNL利用过程。我将利用TextArea中的 double evaluation bug说明利用过程,因为TextArea 可以更方便的显示OGNL(可能这是一种特性)。首先我来介绍一些OGNL的基本概念。

OGNL 执行环境

在Struts的中,OGNL可以使用#符号访问全局对象。这个文档 主要介绍那些可以被访问的对象。那里会有一个对象列表,其中有两个对象对于构建exp非常关键。首先是 _memberAccess,这个对象在SecurityMemberAccess对象中被用来控制OGNL 行为,并且另一些是context,这些context map可用访问更多的其他的对象。这对于漏洞的利用非常有用。你可以通过 _memberAccess非常容易的修改SecurityMemberAccess 的安全设置。比如,许多容易的利用开始于:

#_memberAccess['allowStaticMethodAccess']=true

通过_memberAccess修改完设置后,就可以执行下面代码

@java.lang.Runtime@getRuntime().exec('xcalc')

弹出了计算器

SecurityMemberAccess

上面那一节已经解释过,Struts 通过_memberAccess去控制OGNL所能执行的东西。最初,使用一个Boolean 变量(allowPrivateAccess, allowProtectedAccess, allowPackageProtectedAccess and allowStaticMethodAccess)去控制OGNL所能访问的方法和Java类成员对象。默认情况下,所有的设置都是false。在最近的版本中,有三个黑名单(excludedClasses, excludedPackageNames 和 excludedPackageNamePatterns)被用来禁用一些特殊的类和包。

没有静态函数,但是允许使用构造函数(在2.3.20之前)

但是默认情况下,_memberAccess被配置用来阻止访问静态,私有和保护函数。可是,在2.3.14.1之前,它可以更容易通过 #_memberAccess绕过并且改变这些设置。许多exp就是用到了这一点,比如 :

(#_memberAccess['allowStaticMethodAccess']=true).(@java.lang.Runtime@getRuntime().exec('xcalc'))


在2.3.14.1和更新的版本,allowStaticMethodAccess已经没有用了并且已经没法再修改了。可是,依然可以通过_memberAccess使用类的构造函数并且访问公共函数,实际上没有必要改变_memberAccess中的任何设置来执行任意代码

(#p=new java.lang.ProcessBuilder('xcalc')).(#p.start())

这个方法一直到2.3.20这个版本为止

没有静态方法,没有构造函数,但是允许直接访问类 ( 2.3.20-2.3.29 )

点击收藏 | 5 关注 | 2
登录 后跟帖