Struts 2 之 S2-045 高危漏洞

Posted 海天起点

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Struts 2 之 S2-045 高危漏洞相关的知识,希望对你有一定的参考价值。

一 漏洞说明


漏洞的全名叫做:基于 Jakarta 插件的插件的 Struts 远程代码执行漏洞。根据官方评价,这个漏洞属于高危漏洞,漏洞编号是:CVE-2017-5638。


恶意用户可以在上传文件时通过修改HTTP请求头中的Content-Type值来触发该漏洞,进而执行系统命令。


这个漏洞的需要通过雅加达文件上传插件实现远程利用该漏洞执行代码。

1.   基于雅加达(Jakarta Multipart parser)插件的文件上传功能

2.   恶意攻击者精心构造 Content-Type 的值


Possible Remote Code Execution when performing file upload based onJakarta Multipart parser.  


Who should read this

All Struts 2 developers and users

Impact of vulnerability

Possible RCE when performing file upload based on Jakarta Multipart parser

Maximum security rating

High

Recommendation

Upgrade to  or 

Affected Software

Struts 2.3.5 - Struts 2.3.31, Struts 2.5 - Struts 2.5.10

Reporter

Nike Zheng <nike dot zheng at dbappsecurity dot com dot cn>

CVE Identifier

CVE-2017-5638


来源官网:


二 影响版本


Struts 2.3.5 - Struts 2.3.31, Struts 2.5 - Struts 2.5.10


三 检查 struts 版本


  • webapp 目录查看


检测方式查看 web 目录下/WEB-INF/lib/目录下的 struts-core.x.x.jar


  •  weblogic 中间件中应用查看


到 Domain home 目录下 servers\Server name\tmp

find / -name struts-core*.jar

find / -name struts*.jar


  • websphere 中间件中应用查看


类似的路径下:


cd /home/IBM/WebSphere/AppServer02/profiles/AppSrv01/temp

find / -name struts-core*.jar

find / -name struts*.jar


如果这个版本在 Struts2.3.5 到 Struts2.3.31 以及 Struts2.5 到 Struts2.5.10 之间则存在漏洞。


四 解决方案


  • 更新版本


更新 Apache Struts version 2.3.32 or 2.5.10.1


更新操作  :


替换 webapp 应用目录/WEB-INF/lib/目录下的 struts-core.x.x.jar


1、如果使用 weblogic 中间件容器


清空 server 缓存:删除 Domain home 目录下 servers\Server name\tmp


2、如果使用 WebSphere 中间件容器


清空 server 缓存:类似路径删除即可 


/opt/IBM/WebSphere/AppServer/profiles/AppSrv01/temp


重启 server 即可


  • 应急方案1


通过判断 Content-Type 头是否为白名单类型,来限制非法 Content-Type的攻击。


加固代码:


<strong><font face="黑体"><font size="4">import java.io.IOException;

import javax.servlet.Filter;

import javax.servlet.FilterChain;

import javax.servlet.FilterConfig;

import javax.servlet.ServletException;

import javax.servlet.ServletRequest;

import javax.servlet.ServletResponse;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;


public class SecurityFilter extends HttpServlet implements Filter {


        /**

         * 

         */

        private static final long serialVersionUID = 1L;

  

        public final String www_url_encode= "application/x-www-form-urlencoded";

        public final String mul_data= "multipart/form-data ";

        public final String txt_pla= "text/plain";


        public void doFilter(ServletRequest arg0, ServletResponse arg1,

                        FilterChain arg2) throws IOException, ServletException {

 

                HttpServletRequest request = (HttpServletRequest) arg0;

                HttpServletResponse response = (HttpServletResponse) arg1;


                String contenType=request.getHeader("conTent-type");

                          if(contenType!=null&&!contenType.equals("")&&!contenType.equalsIgnoreCase(www_url_encode)&&!contenType.equalsIgnoreCase(mul_data)&&!contenType.equalsIgnoreCase(txt_pla)){

                         

                        response.setContentType("text/html;charset=UTF-8");

                        response.getWriter().write("非法请求Content-Type!");

                        return;

                }

                arg2.doFilter(request, response);

        }

 

        public void init(FilterConfig arg0) throws ServletException {

 

        }


}</font></font></strong>


将 Java 编译以后的“SecurityFilter.class”(SecurityFilter.java 是源代码文件)复制到应用的WEB-INF/classes 目录下。


配置 Filter 将下面的代码加入 WEB-INF/web.xml 文件中。


<strong><font face="黑体"><font size="4"><filter>

    <filter-name>SecurityFilter</filter-name>

    <filter-class>SecurityFilter</filter-class>

  </filter>

<filter-mapping>

    <filter-name>SecurityFilter</filter-name>

    <url-pattern>/*</url-pattern>

</filter-mapping></font></font></strong>


/*代表拦截所有请求,进行攻击代码检查,*.action 只检查.action 结尾的请求。
 


示例:



最后重启应用进程


来源:http://bbs.ichunqiu.com/thread-19971-1-1.html


  •  应急方案 2


临时处理方案,可以修改启动虚拟机相关选项,修改 Struts 2 上传文件时的上传解析器为非 Jakarta。


由于 Struts 2 默认用 Jakarta 的 Common-FileUpload 的文件上传解析器, 这是存在漏洞的,默认为以下配置


struts.properties 文件是一个标准的 Properties 文件,该文件包含了系列的 key-value 对象,每个 key 就是一个 Struts 2 属性,该 key 对应的 value 就是一个 Struts 2 属性值。


struts.properties 文件通常放在 Web 应用的 WEB-INF/classes 路径下,实际上,只要将该文件放在 Web 应用的 CLASSPATH 路径下,Struts 2 框架就可以加载该文件。


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


struts.multipart.parser=jakarta


指定其他类型的解析器,以使系统避免漏洞的影响:


指定使用 COS 的文件上传解析器struts.multipart.parser=cos或指定使用 Pell 的文件上传解析器struts.multipart.parser=pell


如果用户使用基于 Jakarta 的多分片文件上传解析器,强烈建议用户立即升级到 ApacheStruts 2.3.32 或 2.5.10.1 版本


注意 


如果需要使用 cos 或者 pell 的文件上传方式,则应该将对应的 JAR 文件复制到 Web 应用中。例如,使用 cos 上传方式,则需要自己下载 cos 框架的 JAR 文件,并将该文件放在 WEB-INF/lib 路径下。


  • 应急方案 3


删除 webapp 应用目录/WEB-INF/lib/目录下的 commons-fileupload-x.x.x.jar 文件(会造成上传功能不可用)。


1、如果使用 weblogic 中间件容器


清空 server 缓存:删除 Domain home 目录下 servers\Server name\tmp


2、如果使用 WebSphere 中间件容器


清空 server 缓存:类似路径删除即可 


/opt/IBM/WebSphere/AppServer/profiles/AppSrv01/temp


重启 server 即可
 



原创文章,版权归本文作者所有,如需转载或合作,请务必联系我们


欢迎咨询海天起点技术专家


喜欢本文请长按下方的二维码订阅海天起点


以上是关于Struts 2 之 S2-045 高危漏洞的主要内容,如果未能解决你的问题,请参考以下文章

struts2远程命令执行漏洞S2-045

重大紧急安全预警:Apache Struts 2再爆高危远程漏洞

更新Struts2爆远程代码执行漏洞(S2-045),附POC

Struts 2高危漏洞爆发,天融信“加固续航”

Struts2远程代码执行漏洞预警

警示!Struts2-046漏洞来袭,Struts2 S2-045漏洞你补了吗?