关于Apache Struts2(S2-045)漏洞情况的通报

0x00 漏洞公告


请看https://cwiki.apache.org/confluence/display/WW/S2-045

这个漏洞应该后续会有官方详细分析。这里谈谈个人的理解,也分享下重现漏洞的思路。

首先,仔细阅读漏洞描述:

Problem

It is possible to perform a RCE attack with a malicious Content-Type value. If the Content-Type value isn't valid an exception is thrown which is then used to display an error message to a user.

描述中明确了两点:

通过Content-Type这个header头,注入OGNL语言,进而执行命令。

漏洞的点在于,由于Strus2对错误消息处理时,出现了纰漏。

0x01 关于Struts2上传机制


部分网上描述为:基于 Jakarta plugin插件。

这种描述是不对的,Struts2有其插件机制,如之前爆过S2-037漏洞的REST插件。但Struts2上传默认使用的是org.apache.struts2.dispatcher.multipart.JakartaMultiPartRequest类,对上传数据进行解析。不存在插件这个说法,只不过它最终调用了第三方组件common upload完成上传操作。

注:以下Struts2源码版本均是2.3.20。

具体可以看看源码流程,首先进入StrutsPrepareAndExecuteFilter类,这是Struts2默认配置的入口过滤器。在里面可以看到,Struts2首先对输入请求对象request的进行封装:

跟进这条语句,可以看到封装为StrutsRequestWrapper的过程:

上面我注释的两个地方便是关键。

网上流传的POC中有这么一部分:

就是使content_type.contains("multipart/form-data")判断为true。 当然,完全可以在其他地方添加multipart/form-data这个字符串。

这个方法可以继续追踪下去。通过配置struts.multipart.parser属性,可以指定不同的解析类,而默认的就是上面说的org.apache.struts2.dispatcher.multipart.JakartaMultiPartRequest类。

网上可以查阅得到这样的解释:

struts.multipart.parser:该属性指定处理multipart/form-data的MIME类型(文件上传)请求的框架,该属性支持cos、pell和jakarta等属性值,即分别对应使用cos的文件上传框架、pell上传及common-fileupload文件上传框架。该属性的默认值为jakarta。

更进一步的官方说明:https://cwiki.apache.org/confluence/display/WW/File+Upload#FileUpload-AlternateLibraries
Poc已经在t00ls上面有大神放出

aimorc

我还没有学会写个人说明!

Leave a Reply

Your email address will not be published. Required fields are marked *

微信扫一扫,分享到朋友圈

关于Apache Struts2(S2-045)漏洞情况的通报
返回顶部

显示

忘记密码?

显示

显示

获取验证码

Close