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信息:
說明系統(tǒng)存在此漏洞。
0x02 漏洞修復(fù)
修復(fù)方案一:
找到struts2的核心包 struts2-core-2.3.31,解壓,找到并打開其中的default.properties文件,修改struts.multipart.parser=jakarta
為struts.multipart.parser=pell 保存退出,重新打包生成jar文件,如下圖所示:
再次執(zhí)行如下命令,可以看到遠(yuǎn)程命令已經(jīng)無法被解析,說明漏洞修復(fù)成功!
修復(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ù)成功!