Apache Struts2(S2-045) 漏洞

00x0 漏洞简介

Apache Struts 是美国阿帕奇软件基金会负责维护的一个开源项目,是一套用于创建企业级 Java Web 应用的开源 MVC 框架,主要提供两个版本框架产品:Struts 1 和 Struts 2。

ApacheStruts 2.3.5 -2.3.31 版本及 2.5-2.5.10 版本存在远程代码执行漏洞(CNNVD-201703-152,CVE-2017-5638)。该漏洞是由于上传功能的异常处理函数没有正确处理用户输入的错误信息。导致远程攻击者可以通过发送恶意的数据包,利用该漏洞在受影响的服务器上执行任意命令。

00x1 漏洞危害

攻击者可通过发送恶意构造的 HTTP 数据包利用该漏洞,在受影响的服务器上执行系统命令,进一步可完全控制该服务器,造成拒绝服务、数据泄露、网站遭篡改。由于该漏洞利用无需任何前置条件(如开启 dmi、debug等功能)以及启用任何插件,因此漏洞危害较为严重。

00x2 漏洞修复

通过判断Content-Type头是否为白名单类型,来限制非法的 Content-Type的攻击。

加固代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
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 {
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” 复制到应用的 WEB-INF/classes目录下。

  2. 配置Filter 将下面的代码加入WEB-INF/web.xml文件中。

    1
    2
    3
    4
    <filter-name>SecurityFilter</filter-name>
    <filter-class>SecurityFilter</filter-class>
    <filter-name>SecurityFilter</filter-name>
    <url-pattern>/*</url-pattern>

    / 代表拦截所有请求,进行攻击代码检查,.action 结尾的请求。

  3. 重启应用。

00x3 漏洞利用

点我下载EXP 密码:npx1

杉达的一处ST2,不过漏洞已经修复了。我还在问别人查资料问什么 jsp大马为什么传不上去时,别人早上八点就提交补天了,哎哎,差一点就走上人生巅峰赢取白富美了。

最后放上以前 S2-016/019/032 的漏洞利用工具,共勉。

点我下载 密码:frrb

我们一直都向往,面朝大海,春暖花开。 但是几人能做到,心中有爱,四季不败?