Struts 2 S2-045 Jakarta插件遠程代碼執行漏洞加固方法
漏洞編號:
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