Java Web项目漏洞修复(绿盟检测)

前言

在公司给客户做的一个项目中,客户使用绿盟进行了项目漏洞扫描,这里记录一下我做的一些漏洞修复方法。

  • 检测到目标URL存在http host头攻击漏洞

由于我使用的是Nginx,因此只需要在Nginx的配置文件里面配置,使项目只能以指定域名(由于没有提供域名,设置的是ip)来访问,如下在设置server_name,这里可以使用多个域名),如果使用其他域名(如localhost)访问直接返回403。配置示例如下:

server{

listen 8082 default;

       server_name _;

return 403;

}

server {

listen 8082;

       server_name  我的域名 127.0.0.1 

       …其他配置

}

上面的配置,注意第一个server中,代表除了用下面server中配置的域名来访问系统,其他会返回403页面。

  • 检测到会话Cookie中缺少HttpOnly

在Resin3.1中,直接在项目配置文件conf中放开cookie-http-only,就能实现HttpOnly的添加。

在Resin4中,已经去除了cookie-http-only,因此需要代码来辅助添加。网上普遍的说法是在增加过滤器,然后在过滤器中添加如下代码:

    HttpServletRequest request = (HttpServletRequest) req;
    HttpServletResponse response = (HttpServletResponse) res;  
    Cookie[] cookies = request.getCookies();
    StringBuffer sb = new StringBuffer();
    String oldSetCookie = null;
    if(cookies!=null){
        for(Cookie cookie : cookies){
            if(cookie!=null){
                String newCookie = cookie.getName()+"="+cookie.getValue()+";";
                if(cookie.getPath()!=null){
                    newCookie+="Path="+cookie.getPath()+";";
                }
                if(oldSetCookie!=null && oldSetCookie.indexOf(newCookie)>-1){
                }else{
                    sb.append(newCookie);
                    oldSetCookie = sb.toString();
                }
            }
        }
        if(sb.length()>0){
           response.setHeader("Set-Cookie",sb.append("Path=/;HttpOnly;").toString());
        }
    }

以上代码是在Servlet2.5下的操作,在Servlet3.0下可以使用更简单的操作,具体的操作为:

    HttpServletRequest request = (HttpServletRequest) req;
    HttpServletResponse response = (HttpServletResponse) res;  
    Cookie[] cookies = request.getCookies();
    if(cookies!=null){
        for(Cookie cookie : cookies){
            if(cookie!=null){
                cookie.setHttpOnly(true);
                response.addCookie(cookie);
            }
        }
        if(sb.length()>0){
           response.setHeader("Set-Cookie",sb.append("Path=/;HttpOnly;").toString());
        }
    }

创建了CookieFilter,然后在web.xml声明,并设置过滤所有请求:

 
    cookieFilter  
    com.filter.CookieFilter  
 
 
    cookieFilter  
    /*  

但是在实际使用中,发现并没有起到应有的作用,还是能被扫描出来.于是又找寻了另外的方法,具体使用是使用了监听器,设置了SessionCookieConfig的HttpOnly属性,具体操作如下:

创建监听器,实现javax.servlet.ServletContextListener接口:

package com;

import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.SessionCookieConfig;
import javax.servlet.annotation.WebListener;
@WebListener
public class CookieConfigInitializer implements ServletContextListener{
	@Override
	public void contextDestroyed(ServletContextEvent arg0) {
		
	}

	@Override
	public void contextInitialized(ServletContextEvent contextEvent) {
        //这里只是添加了HttpOnly,也能添加其他属性如Secure,Path
		SessionCookieConfig sessionCookieConfig = contextEvent.getServletContext().getSessionCookieConfig();
		sessionCookieConfig.setHttpOnly(true);
	}
}

然后在web.xml声明这个监听器

        com.CookieConfigInitializer 

  • 点击劫持:X-Frame-Options未配置

漏洞说明:不配置这个Header,会让我们的网页能被任何页面使用Frame引用到,如果想要自己的网页只能被指定域名的Frame包裹就需要设置这个属性.

在Nginx里面,设置方法为在nginx的配置文件对应server里面添加如下代码:

#设置允许将系统作为iframe添加的地址

add_header X-Frame-Options  允许iframe的IP;

add_header X-Frame-Options 允许ifame的域名;

#下面这句是因为Google浏览器不支持上面的头信息

add_header Content-Security-Policy "允许iframe的IP 允许ifame的域名 'self'";

注意:这里针对Google做了不同的处理,因为在Google浏览器 X-Frame_Options没阻止被非合法IP 或域名网站使用iframe引用我们的网站。

如果是直接在代码中添加,应该是可以使用过滤器或者拦截器,使用response.addHeader(name,value)增加response的Header。

你可能感兴趣的:(Web项目漏洞修复)