Warning message

This translation is outdated. For the most up-to-date information, please refer to the English version.

HTTPoxy - 我的 JBoss/tomcat 会受影响吗?

Solution Verified - Updated -

Environment

  • Red Hat JBoss Enterprise Application Platform (EAP) 6.x
  • Red Hat JBoss Enterprise Application Platform (EAP) 5.x
  • Red Hat JBoss Enterprise Web Server (EWS) 2.x
    • Tomcat 6
  • Red Hat JBoss Web Server (JWS) 3.x
    • Tomcat 6
    • Tomcat 7

Issue

如果您使用 JBoss 或者 Tomcat,则存在这个问题。所有由攻击者对 CGI 脚本的原始请求生成的传出请求,都会被依次重新定向到攻击者控制的代理服务器。

Resolution

不建议在产品中使用 CGIServlet。如果您有那个选项,最好使用 CGIServlet 删除网页应用程序。另外,虽然可以在应用程序中添加 Servlet 过滤器,但如果探测到使用名为 ‘Proxy’ 的 HTTP 标头,则会返回‘400: Bad Request’响应。例如:

在过滤附带 ‘Proxy’ 标头的请求的 CGI 应用程序 WAR 中添加 Servlet Filter
注:过滤器会阻断所使用编程语言中的所有 CGI 部分。

package com.redhat.prodsec.web.filter;

import java.io.IOException;
import java.util.Enumeration;

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.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.annotation.WebFilter;

/*
 *  这是禁止附带 "Proxy" http 标头的 servlet 过滤器示例
 */
@WebFilter("/*")
公共类 ProxyHeaderFilter 实施过滤器 {

    /**
     * @see Filter#destroy()
     */
    public void destroy() {
        // TODO Auto-generated method stub
    }

    @Override
    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)
            throws IOException, ServletException {
        HttpServletRequest httpRequest = (HttpServletRequest) req;
        Enumeration<String> headerNames = httpRequest.getHeaderNames();


        if (headerNames != null) {
                while (headerNames.hasMoreElements()) {
                    String headerName = headerNames.nextElement();
                    if(headerName.equalsIgnoreCase("Proxy"))
                        ((HttpServletResponse) res).sendError(HttpServletResponse.SC_BAD_REQUEST);
                }
        }

        chain.doFilter(req, res);

    }

    /**
     * @see Filter#init(FilterConfig)
     */
    public void init(FilterConfig fConfig) throws ServletException {
    }

}

编译 ProxyHeaderFilter.java 后,会生成名为 com.redhat.prodsec.web.filter 的软件包,其中包含 ProxyHeaderFilter.class。

使用下面的命令为 ProxyHeaderFilter.class 生成 jar 文件。它会生成名为ProxyHeaderFilter.jar 的 jar 文件。

jar -cvf ProxyHeaderFilter.jar com

将这个文件放到网页应用程序的 WEB-I NF/lib 文件夹中。它会在网页应用程序中启用 Servlet 过滤器。

Root Cause

详情请查看 HTTPoxy - 影响 PHP、Go、Python 及其他语言的 CGI 应用程序代码漏洞

This solution is part of Red Hat’s fast-track publication program, providing a huge library of solutions that Red Hat engineers have created while supporting our customers. To give you the knowledge you need the instant it becomes available, these articles may be presented in a raw and unedited form.