CVE-2019-0233: S2-060 拒绝服务漏洞分析

  • A+
所属分类:安全文章

更多全球网络安全资讯尽在邑安全

CVE-2019-0233: S2-060 拒绝服务漏洞分析

0x01 漏洞简述

2020年8月11日,360CERT监测发现Apache官方发布了S2-060的风险通告,该漏洞编号为CVE-2019-0233,漏洞等级:中危。漏洞评分:6.8

当使用getter对文件上传执行一个暴露文件的操作时,攻击者可能会构造特定请求,从而将上传文件的工作目录设置为只读。因此,对该文件的后续操作将失败并出现错误。还可以将Servlet容器的temp目录设置为只读,这样后续的上载操作就会失败,对业务造成影响。

对此,360CERT建议广大用户及时将 Struts2 升级到最新版。与此同时,请做好资产自查以及预防工作,以免遭受黑客攻击。

 

0x02 风险等级

360CERT对该漏洞的评定结果如下

评定方式 等级
威胁等级 中危
影响面 一般
360CERT评分 6.8分

 

0x03 影响版本

  • Apache Struts2:2.0.0-2.5.20

 

0x04 漏洞详情

ParametersInterceptor拦截器开始看,该拦截器对请求的参数进行处理,前面的过程是ActionInvocation对拦截器进行回调处理。

CVE-2019-0233: S2-060 拒绝服务漏洞分析

ActionContext获取请求中的请求参数, CVE-2019-0233: S2-060 拒绝服务漏洞分析

此时有四个参数(具体Action构造见参考链接):

1. [文件名参数] - 这是用户已上传的实际文件。在Action中被设置为“upload

2. [文件名参数]ContentType - 这是上传的文件的内容类型。在Action中被设置为“uploadContentType

3. [文件名参数]FileName - 这是上传的文件的名称。在Action中被设置为“uploadFileName

4. [文件名参数].parentFile.writable - 构造的利用poc

CVE-2019-0233: S2-060 拒绝服务漏洞分析

这里要注意原始上传的文件类型是一个File类型。然后会调用setParameters方法: CVE-2019-0233: S2-060 拒绝服务漏洞分析

参数校验

然后对所有Parameterskey进行检测,调用isAcceptableParameter方法。 CVE-2019-0233: S2-060 拒绝服务漏洞分析由于自定义Action不是ParameterNameAware的实现类,于是,parameterNameAwarenull, CVE-2019-0233: S2-060 拒绝服务漏洞分析先调用acceptableName方法。 CVE-2019-0233: S2-060 拒绝服务漏洞分析依次调用isWithinLengthLimit,isExcluded,isAccepted

isWithinLengthLimit判断最大长度默认为100

isExcluded进行表达式正则的检测,是否包含_memberAccess等字符。 CVE-2019-0233: S2-060 拒绝服务漏洞分析

可以发现,我们的payload没有包含特殊字符。

继续跟到DefaultExcludedPatternsChecker#isExcluded,初始化了正则表达式的黑名单。 

CVE-2019-0233: S2-060 拒绝服务漏洞分析

CVE-2019-0233: S2-060 拒绝服务漏洞分析

最后调用isAccepted,跟到DefaultExcludedPatternsChecker#isAccepted。 CVE-2019-0233: S2-060 拒绝服务漏洞分析

对一些不可见字符做处理。

三个函数调用完之后,就将其putacceptableParameters Map里。

CVE-2019-0233: S2-060 拒绝服务漏洞分析继续往下走,会根据原有的valueStack,创建一个新的valueStack,叫做newStack,之后把前面的几个对key检测的正则表达式加到这个新的valueStack里面, CVE-2019-0233: S2-060 拒绝服务漏洞分析

ognl表达式执行

接着,调用OgnlValueStack.setParameter,这里会执行setValue操作,而执行的过程中就会造成ognl表达式的执行,这里会将root作为参数传入,而root里保存着Action信息。

CVE-2019-0233: S2-060 拒绝服务漏洞分析

payload是一个ognl表达式,由于访问的是ValueStackroot里的属性,所有不需要加#就能进行访问,而这里的upload是我们自定义上传Action里的File类型。

CVE-2019-0233: S2-060 拒绝服务漏洞分析

首先target值是一开始传入的root里的上传Action,然后会调用target对应的settergetter方法。

CVE-2019-0233: S2-060 拒绝服务漏洞分析

CVE-2019-0233: S2-060 拒绝服务漏洞分析

然后获取返回的upload,类型为File,此时target被赋值为File,经过AST语法解析,getParentFile的调用栈为:

CVE-2019-0233: S2-060 拒绝服务漏洞分析

中间会根据传入的payload调用getGetMethod,获取File对象对应的getter,也就是getParentFile。在调用method之前,会进行黑名单的检测,具体是在com.opensymphony.xwork2.ognl.SecurityMemberAccess#isAccessible方法里进行黑名单检测,黑名单来自struts- 然后getParentFile的返回值被return, CVE-2019-0233: S2-060 拒绝服务漏洞分析

依然替换作为target,值还是File,继续调用setter。 CVE-2019-0233: S2-060 拒绝服务漏洞分析

setWriteable的调用栈为:

CVE-2019-0233: S2-060 拒绝服务漏洞分析

执行结果: CVE-2019-0233: S2-060 拒绝服务漏洞分析接着,后续的上传都会失效。

版本修复

升级到Struts 2.5.22版本,默认情况下将java.iojava.nio中的类加入黑名单。 CVE-2019-0233: S2-060 拒绝服务漏洞分析

总结

该漏洞总体来说,危害不是很大,但是能够造成服务器功能失效,对于业务来说,还是具有一定的影响力,该漏洞主要是通过Actiongetter方法,获取到上传的File类型的filename,再通过ognl执行流,去配合执行Filegetter/setter,最终造成文件无法后续上传,由于我们的ognl表达式不涉及黑名单也不涉及特殊字符,所以不受沙箱的影响。

转自安全客

欢迎收藏并分享朋友圈,让五邑人网络更安全

CVE-2019-0233: S2-060 拒绝服务漏洞分析

欢迎扫描关注我们,及时了解最新安全动态、学习最潮流的安全姿势!


推荐文章

1

新永恒之蓝?微软SMBv3高危漏洞(CVE-2020-0796)分析复现

2

重大漏洞预警:ubuntu最新版本存在本地提权漏洞(已有EXP) 




发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: