struts2漏洞_Struts2 S2061漏洞分析(CVE202017530)

Smi1e@卫兵实验室

漏洞描述

Struts2 会对某些标签属性(比如 `id`,其他属性有待寻找) 的属性值进行二次表达式解析,因此当这些标签属性中使用了 `%{x}` 且 `x` 的值用户可控时,用户再传入一个 `%{payload}` 即可造成OGNL表达式执行。S2-061是对S2-059沙盒进行的绕过。

影响范围

Struts 2.0.0 - Struts 2.5.25

漏洞分析

S2-061和S2-059的OGNL表达执行触发方式一样,详情可见公众号之前的文章:Struts2 S2-059 漏洞分析。S2-059的修复方式为只修复了沙盒绕过并没有修复OGNL表达式执行点,因为这个表达式执行触发条件过于苛刻,而S2-061再次绕过了S2-059的沙盒。

diff一下沙盒,可以看到把很多中间件的包添加到了黑名单中。

a7777d93c9e97ea6dd98fd3117a8d7cf.png

已知的OGNL沙盒限制为:

  • 无法new一个对象

  • 无法调用黑名单类和包的方法、属性

  • 无法使用反射

  • 无法调用静态方法

另外,最新的struts2在 ognl.OgnlRuntime#invokeMethod 中ban掉了常用的class,意味着即使绕过了沙盒依然不能直接调用这些类。

public static Object invokeMethod(Object target, Method method, Object[] argsArray) throws InvocationTargetException, IllegalAccessException {

if (_useStricterInvocation) {

Class methodDeclaringClass = method.getDeclaringClass();

if (AO_SETACCESSIBLE_REF != null && AO_SETACCESSIBLE_REF.equals(method) || AO_SETACCESSIBLE_ARR_REF != null && AO_SETACCESSIBLE_ARR_REF.equals(method) || SYS_EXIT_REF != null && SYS_EXIT_REF.equals(method) || SYS_CONSOLE_REF != null && SYS_CONSOLE_REF.equals(method) || AccessibleObjectHandler.class.isAssignableFrom(methodDeclaringClass) || ClassResolver.class.isAssignableFrom(methodDeclaringClass) || MethodAccessor.class.isAssignableFrom(methodDeclaringClass) || MemberAccess.class.isAssignableFrom(methodDeclaringClass) || OgnlContext.class.isAssignableFrom(methodDeclaringClass) || Runtime.class.isAssignableFrom(methodDeclaringClass) || ClassLoader.class.isAssignableFrom(methodDeclaringClass) || ProcessBuilder.class.isAssignableFrom(methodDeclaringClass) || AccessibleObjectHandlerJDK9Plus.unsafeOrDescendant(methodDeclaringClass)) {

throw new IllegalAccessException("Method [" + method + "] cannot be called from within OGNL invokeMethod() " + "under stricter invocation mode.");

}

}

再看一下OGNL沙盒未限制的操作为:

  • 对象属性 setter/getter(public) 赋/取值,可以访问静态属性。

  • 已实例类的方法调用( OgnlContext 中的对象),不允许调用静态方法

可以看到目前我们只能在 OgnlContext 中寻找可利用的对象。

590273d5cd60edeb4f390ca809e74401.png

看一下 #application 中的 org.apache.tomcat.InstanceManager ,他的键值为类 org.apache.catalina.core.DefaultInstanceManager 的实例化对象,该类为tomcat中的类,其他中间件还未分析,有兴趣可以自己找找看。

8de439db9aa0e734ccc3a4cb92465d58.png

他有一个 newInstance 方法,className 我们可控,最终可以实例化任意无参构造方法的类并返回。

bc849d345176c76af48e5a9fe9a190e2.png

9d6097b8674f9084b7a7d9a9f7918d4d.png

也就是说我们现在绕过了无法new一个对象的限制,不过这个对象必须存在 public 的无参构造方法。

ognl3.1.15中, OgnlContext 又删掉了 CONTEXT_CONTEEXT_KEY 也就是 context 这个key,禁止使用 #context 对 OgnlContext 进行访问。

1eeb4905028049104b1b28e077fea55e.png

而S2-057通过 #attr 、#request 等map对象中的 struts.valueStack 间接获取到了 OgnlContext ,但是补丁把包 com.opensymphony.xwork2.ognl. 加入到了黑名单中,不能调用 OgnlValueStack 的 getContext 方法了,因此这种方法也行不通了。

不过我们可以利用前文的实例化任意无参构造方法条件调用一些方法,间接的帮我们获取到 OgnlContext 。

看一下 org.apache.commons.collections.BeanMap

184c8e9addcb8b5ceff9ffd6d24ebecf.png

跟进 this.initialise(),他会把我传入对象对应class当做bean,提取 get 和 set 方法以及 name 赋值进 readMethods 和 writeMethods 。

614513018dc7ef40dd88e97f4f94cdcd.png

看一下其 get 方法,根据我们传入的 name 调用 readMethods 中对应的 getXxx 方法

8962fe9d769b25c285ad336262638cc1.png

652e4397c056a5e4e43dda00f6993d30.png

而 com.opensymphony.xwork2.ognl.OgnlValueStack 中存在 getContext 方法,因此我们可以拿到 OgnlValueStack 后,利用 BeanMap 间接获取到 OgnlContext

f627e6e6d75d757caeb43df750993303.png

同理我们可以获取到 com.opensymphony.xwork2.ognl.SecurityMemberAccess 对象

e67784089512fc850e91dc36b28b737f.png

并利用 put 方法调用 setExcludedClasses 和 setExcludedPackageNames 覆盖掉黑名单。

821042f672bd0435a69ea8c6cde49e44.png

前面提到了最新的 struts2 即使绕过了沙盒依然不能直接调用常用的类来进行利用,但是我们清空了黑名单之后可以实例化任意黑名单中的类。

看下黑明单包中的类 freemarker.template.utility.Execute,存在无参构造方法 Execute() ,exec 方法可以直接执行命令。

020a3171dbc24eed316cf6cd0e27cccb.png

漏洞证明

23d1537822c1f8e759970954197499b2.png

关于我们

6dac69cdda926ea15b9527b5f537db8a.png

人才招聘

二进制安全研究员(Windows内核方向)

工作地点:

1.杭州;

岗位职责:

1、负责研究Window内核相关漏洞利用技术;

2、负责分析Window内核漏洞的原理及缓解措施;

任职要求:

1、2年以上windows逆向工作经验。

2、熟悉windows底层架构、运行机制,熟悉汇编语言 C/C++语言,熟悉win32/64开发,并有相关开发经验;

3、熟悉windows驱动开发、熟悉windows平台内核架构;能熟练运用Windows平台下的软件调试方法。

4、熟练使用ida、windbg等调试软件工具调试分析漏洞。

5、有CVE编号、内核研究成果者优先;

6、具备良好的团队沟通、协作能力、良好的职业道德。

二进制安全研究员(Linux内核方向)

工作地点:

1.杭州;

岗位职责:

1、负责研究Linux内核相关漏洞利用技术;

2、负责分析Linux内核漏洞的原理及缓解措施;

任职要求:

1、2年以上Linux逆向工作经验。

2、熟悉Linux底层架构、运行机制,熟悉汇编语言 C/C++语言,熟悉x86/64开发,并有相关开发经验;

3、熟悉Linux驱动开发、熟悉Linux平台内核架构;能熟练运用Linux平台下的软件调试方法。

4、熟练使用ida、gdb、lldb等调试软件工具调试分析漏洞。

5、有CVE编号、内核研究成果者优先;

6、具备良好的团队沟通、协作能力、良好的职业道德。

二进制安全研究员(系统应用方向)

工作地点:

1.杭州;

岗位职责:

1、负责安全技术研究,跟踪国内外最新的安全技术以及安全漏洞的追踪;

2、负责进行二进制漏洞挖掘,包括不限于浏览器、chakara引擎、js引擎、office、pdf等等各种二进制类应用;

任职要求:

1、能主动关注国内外最新安全攻防技术,并在自己擅长和兴趣的领域能够进行深入的学习、研究;

2、熟练掌握windbg、ida、gdb等调试工具;

3、熟悉各类二进制安全漏洞原理(堆溢出、栈溢出、整数溢出、类型混淆等等)以及各种利用技术;

4、能够无障碍阅读英文技术文档;

5、具备良好的团队沟通、协作能力、良好的职业道德。

Web安全研究员

工作地点:

1.杭州;

岗位职责:

1、安全攻防技术研究,最新web应用及中间件(tomcat、jetty、jboss等等)、框架(struts、spring、guice、shiro等等) 组件(freemarker、sitemesh等等)漏洞挖掘研究;

2、跟踪分析国内外的安全动态,对重大安全事件进行快速响应;

任职要求:

1、了解常见的网络协议(TCP/IP,HTTP,FTP等);

2、熟练使用Wireshark等抓包工具,熟悉正则表达式;

3、掌握常见漏洞原理,有一定的漏洞分析能力;

4、具备php、python、java或其他相关语言编码能力;

5、对常见waf绕过有一定的基础经验;

6、具备一定的文档编写能力,具备良好的团队共同能力;

7、对安全有浓厚的兴趣,工作细致耐心。

感兴趣的小伙伴请联系Nike,或将简历投送至下方邮箱。(请注明来源“研究院公众号”,并附带求职岗位名称)

联系人:Nike
邮箱:nike.zheng@dbappsecurity.com.cn

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值