Struts 2 S2-045 Jakarta插件遠程代碼執行漏洞加固方法

近日,安恆信息安全研究院WEBIN實驗室高級安全研究員nike.zheng發現著名J2EE框架-Struts2存在遠程代碼執行的嚴重漏洞。

漏洞編號:

S2-045,CVE-2017-5638

漏洞名稱:

基於 Jakarta plugin插件的Struts遠程代碼執行漏洞

官方評級:

高危

漏洞描述:

Apache Struts 2被曝出存在遠程命令執行漏洞,漏洞編號S2-045,CVE編號CVE-2017-5638,在使用基於Jakarta插件的文件上傳功能時,有可能存在遠程命令執行,導致系統被黑客入侵。惡意用戶可在上傳文件時通過修改HTTP請求頭中的Content-Type值來觸發該漏洞,進而執行系統命令。

漏洞利用條件和方式:

黑客通過Jakarta 文件上傳插件實現遠程利用該漏洞執行代碼。

1.基於Jakarta(Jakarta Multipart parser)插件的文件上傳功能

2.惡意攻擊者精心構造Content-Type的值

漏洞影響範圍:

Struts 2.3.5 – Struts 2.3.31

Struts 2.5 – Struts 2.5.10

加固方式如下:

通過判斷Content-Type頭是否為白名單類型,來限制非法Content-Type的攻擊。

加固代碼:

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

1. 將Java編譯以後的「SecurityFilter.class」(SecurityFilter.java是源代碼文件)複製到應用的WEB-INF/classes目錄下。

2. 配置Filter

將下面的代碼加入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>

/*代表攔截所有請求,進行攻擊代碼檢查,*.action只檢查.action結尾的請求。

示例:

3. 重啟應用即可

推薦閱讀:

Backslash Powered Scanning
俄羅斯大使被殺的真相能否大白?就看俄羅斯黑客能否破解iPhone 4S
段鋼:自從那個冬夜看雪,一晃已是十六年
圖解ARP協議(六)RARP與IARP:被遺忘的兄弟協議
2016網路犯罪形式 TOP 5

TAG:Web漏洞 | 信息安全 | 网络安全 |