系统安全|AppScan检查到的一些中高危漏洞解决方案

1.appScan 中危漏洞指示跨站点请求伪造尝试成功,尽管其中有假想的“Referer”头
解决办法:在shiro的配置文件中引入
2.AppScan 发现加密会话(SSL)使用的是没有“secure”属性的 cookie。
解决办法:在shiro的配置文件中 引入


2.1再加全局拦截器:
import com.thinkgem.jeesite.common.mapper.JsonMapper; import com.thinkgem.jeesite.common.utils.StringUtils; import javax.servlet.*; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.util.Map; /** * @author zfq * @create 2021-12-28 17:44 *在cookie上添加 Secure防跨站请求漏洞 */ public class CsrfDefInterceptorUtilimplements Filter {public void destroy() { // TODO Auto-generated method stub System.out.println("过滤器1销毁方法"); }public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { // TODO Auto-generated method stub HttpServletRequest request2 = (HttpServletRequest) request; String referer = request2.getHeader("Referer"); String serverName = request.getServerName(); //1.判断是否存在外链请求本站 System.out.println("请求的域名是"+referer); Boolean isTongGuo=true; if (null != referer && referer.indexOf(serverName) < 0) { isTongGuo=false; } String ctx_path = request2.getContextPath(); String request_url = request2.getRequestURI(); String action = request_url.substring(ctx_path.length()); System.out.println("拦截到的路径action:"+action); //2.判断是否有xss攻击 Map parameterMap = request.getParameterMap(); if(parameterMap!=null&¶meterMap.size()>0){ String params= JsonMapper.toJsonString(parameterMap); //获取全部请求内容 System.out.println("拦截前params==========="+params); String paramsNew=StringUtils.cleanXSS(params); System.out.println("拦截后params==========="+paramsNew); //若参数发生变化则说明有不合法字符 则阻止本次提交 if(!paramsNew.equals(params)){ isTongGuo=false; } }//3.为cookie加上 Secure 和 HttpOnly属性 HttpServletResponse response2 = (HttpServletResponse)response; Cookie[] cookies = request2.getCookies(); if(cookies!=null&&cookies.length>0){ for(Cookie cookie : cookies) { cookie.setHttpOnly(true); cookie.setSecure(true); } } String sessionid = request2.getSession().getId(); response2.setHeader("Set-Cookie", "JSESSIONID="+sessionid+"; Secure=true; HttpOnly"); if(isTongGuo){ chain.doFilter(request, response); }else{ System.out.println("Referer过滤器 => 服务器:{} => 当前域名:{}"+ serverName+"; 而referer是:"+referer); response.setContentType("text/html; charset=utf-8"); response.getWriter().write("拦截到不合法请求,请勿此操作!"); } }public void init(FilterConfig filterConfig) throws ServletException { // TODO Auto-generated method stub System.out.println("过滤器1初始化方法"); }}

在web.xml中声明此拦截器
filterCookie xxxx.xx.CsrfDefInterceptorUtil filterCookie /*


再看所有请求头中已有Secure 和HttpOnly属性
系统安全|AppScan检查到的一些中高危漏洞解决方案
文章图片


2.2.servlet3及以上 在web.xml中引入 http-only 和secure的属性
MyComm true true

【系统安全|AppScan检查到的一些中高危漏洞解决方案】2.3 项目中全局查找有关cookie的操作,把Secure和HttpOnly都设置为true
Cookie cookie = new Cookie(name, null); cookie.setSecure(true); cookie.setHttpOnly(true);

2.4 在shiro的认证回调函数中检查对请求参数进行xss拦截,有不合法字符拒绝认证登录
/** * 认证回调函数, 登录时调用 */ @Override protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authcToken) {UsernamePasswordToken token = (UsernamePasswordToken) authcToken; //校验是否有xs攻击 String tokenJson= JsonMapper.toJsonString(token); Boolean aBoolean = com.thinkgem.jeesite.common.utils.StringUtils.matchXss(tokenJson); if(aBoolean==false){ throw new AuthenticationException("msg:疑似XSS攻击."); } }

3. 高危漏洞xss攻击:
解决办法:mvc全局拦截器处理非法字符 代码见上面的拦截器

4. 高危漏洞sql注入:
解决办法:全局sql拦截处理非法sql字符,代码涉及公司代码安全,不再贴出,每个公司的分页拦截器也不一样,只要在分页拦截器中拦截就行
5.伪造请求头Referer
验证请求头Referer是否包含服务名,代码见上面的拦截器

6.高危漏洞 AppScan 识别了不是通过 SSL 发送的登录请求。
解决办法:ssl证书+https+1,2,3,4,5解决方案

总结:这些处理方案对我们的系统真实有效,大神勿喷,仅供参考

    推荐阅读