s2-045漏洞的復(fù)現(xiàn)及其修復(fù)

0x00漏洞概述

漏洞介紹

Apache Struts 2被曝存在遠(yuǎn)程命令執(zhí)行漏洞,漏洞編號S2-045,CVE編號CVE-2017-5638,在使用基于Jakarta插件的文件上傳功能時(shí),有可能存在遠(yuǎn)程命令執(zhí)行,導(dǎo)致系統(tǒng)被黑客入侵。

惡意用戶可在上傳文件時(shí)通過修改HTTP請求頭中的Content-Type值來觸發(fā)該漏洞,進(jìn)而執(zhí)行系統(tǒng)命令。

影響范圍

Struts 2.3.5 – Struts 2.3.31 Struts 2.5 – Struts 2.5.10

不受影響的范圍

Struts 2.3.32 Struts 2.5.10.1

0x01 漏洞復(fù)現(xiàn)

在實(shí)驗(yàn)環(huán)境中搭建struts2環(huán)境,利用已經(jīng)準(zhǔn)備好的poc.exe 執(zhí)行遠(yuǎn)程命令ifconfig命令,可以看到遠(yuǎn)程主機(jī)的ip信息:

1.PNG

說明系統(tǒng)存在此漏洞。

0x02 漏洞修復(fù)

修復(fù)方案一:

找到struts2的核心包 struts2-core-2.3.31,解壓,找到并打開其中的default.properties文件,修改struts.multipart.parser=jakarta
為struts.multipart.parser=pell 保存退出,重新打包生成jar文件,如下圖所示:


3.PNG

再次執(zhí)行如下命令,可以看到遠(yuǎn)程命令已經(jīng)無法被解析,說明漏洞修復(fù)成功!


5.PNG

修復(fù)方案二:

此次 S2-045 漏洞觸發(fā)點(diǎn)為Content-TypeHTTP頭字段,故此可以添加action攔截器,過濾非法請求。

攔截類SecurityFilter.java代碼如下所示:

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 {

        }

}


將SecurityFilter.java文件編譯為SecurityFilter.class,放入服務(wù)器路徑為:/var/www/apache-tomcat-7.0.14/webapps/ROOT/WEB-INF/classes/

修改web.xml(/var/www/apache-tomcat-7.0.14/webapps/ROOT/WEB-INF/web.xml)使得添加的攔截器生效

添加代碼如下:


<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>

保存web.xml之后,再次重新執(zhí)行遠(yuǎn)程命令,添加的攔截器將攔截此類action請求,此漏洞也可以修復(fù)成功!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容