海天起点发布SQL安全审核平台软件--HTAS
海天起点发布“悟空”数据库自动化管理软件V2.0
“悟空”协助陕西电力公司提升数据库自动化管理
【高危预警】WebLogic又该打补丁了
【预警!】高龄存储引发的性能问题,某电力核心业务性能10倍衰减

北京总部
公司地址:北京市朝阳区东大桥路8号尚都国际中心2806室
联系电话:010-58701010
服务热线:800-810-3650 400-810-3650
电子邮件:support@hthorizon.com

Copyright ©2003-2011 北京海天起点技术服务股份有限公司 版权所有 备案号:京ICP备11003326号 网站建设:中企动力 北二分

Struts 2之S2-045漏洞

浏览量

一.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 on Jakarta 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 Struts 2.3.32 or Struts 2.5.10.1
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

来源官网:

https://cwiki.apache.org/confluence/display/WW/S2-045?from=groupmessage

二.影响版本

    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 =(HttpServlet Request) 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的多分片文件上传解析器,强烈建议用户立即升级到Apache Struts 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即可