Appscan安全漏扫问题总结

您所在的位置:网站首页 sql注入的问题怎么解决 Appscan安全漏扫问题总结

Appscan安全漏扫问题总结

2024-07-13 09:48| 来源: 网络整理| 查看: 265

最近解决Appscan安全漏洞扫描软件上的漏洞,遇到不少问题,趁热打铁写个总结。

下面罗列问题类型,截图,以及解决方案。

1.SQL盲注

对于一些sql关键词过滤掉即可。

public static boolean checkWebUnSafesql(String word){ String str=word.replaceAll("'", "").replaceAll("\"", "").replaceAll("(?i)or", "").replaceAll("(?i)and", "").replaceAll("=", "") .replaceAll("(?i)exec", "").replaceAll("(?i)execute", "").replaceAll("(?i)union", "").replaceAll("(?i)create", "").replaceAll("(?i)insert", "") .replaceAll("(?i)select", "").replaceAll("(?i)delete", "").replaceAll("(?i)update", "").replaceAll("(?i)count", "").replaceAll("(?i)chr", "") .replaceAll("(?i)mid", "").replaceAll("(?i)master", "").replaceAll("(?i)truncate", "").replaceAll("(?i)char", "").replaceAll("(?i)declare", "") .replaceAll("(?i)xp_", "").replaceAll("(?i)sp_", "").replaceAll("(?i)Drop", "").replaceAll("(?i)table", "").replaceAll("(?i)0x", "") .replaceAll("%", "").replaceAll("\\*", ""); if (word.length()!=str.length()) { return true; } return false; }

 

 注:(?i)代表忽略大小写,即or是Or、oR、OR、or都可以匹配到。

2.跨站点脚本编制

注入的方法很多,最简单的是 alert(123),还有"+eval("ale"+"rt"+"("162")")+",'+eval('ale'+'rt'+'('162')')+', */eval(/ale/.source+/rt/.source+/(451)/.source)///*等等

要彻底解决需要过滤一些js的关键字。

public static boolean checkWebUnSafejs(String word){ String str=word.replaceAll("", "").replaceAll(";", "").replaceAll("(?i)alert", "").replaceAll("\\[", "").replaceAll("\\]", "").replaceAll("(?i)source","").replaceAll("\"+\"","").replaceAll("'+'","") .replaceAll("(?i)window", "").replaceAll("(?i)eval", "").replaceAll("(?i)function", "").replaceAll("(?i)hasOwnProperty", "").replaceAll("(?i)Infinity", "").replaceAll("(?i)isFinite", "").replaceAll("(?i)isNaN", "").replaceAll("(?i)isPrototypeOf", "") .replaceAll("(?i)blur", "").replaceAll("(?i)button", "").replaceAll("(?i)element", "").replaceAll("(?i)event", "").replaceAll("(?i)focus", "").replaceAll("(?i)frame", "").replaceAll("(?i)link", "") .replaceAll("(?i)parseInt", "").replaceAll("(?i)plugin", "").replaceAll("(?i)screenX", "").replaceAll("(?i)screenY", "").replaceAll("(?i)select", ""); if (word.length()!=str.length()) { return true; } return false; } 3.查询中的密码参数

对参数的敏感关键词进行处理,word改为w即可。

 4.使用HTTP动词篡改的认证旁路

有该问题的请求走过滤器,在过滤器中加上对请求method判断,防止此类问题的发生。

HttpServletRequest request = (HttpServletRequest) req; HttpServletResponse response = (HttpServletResponse) resp;     String method = request.getMethod(); if(!"GET".equalsIgnoreCase(method)&&!"POST".equalsIgnoreCase(method)&&!"HEAD".equalsIgnoreCase(method)) { response.setContentType("text/html;"); response.setCharacterEncoding("GBK"); ((HttpServletResponse) resp).setStatus(403); response.getWriter().print("对不起,您的请求非法,系统拒绝响应!"); return; }

 

5.加密会话(SSL)Cookie中缺少Secure属性

有两个方法:第一个方法是项目使用servlet3.0版本,在web.xml里添加secure属性。

第二个方法,简单粗暴,直接让该页面走过滤器,手动加上secure属性。(缺少HttpOnly同理)

if ( url.indexOf("")!=-1){ //""内写请求名 String jSessionId=request.getSession().getId(); if(jSessionId!=null) response.setHeader("Set-Cookie", "JSESSIONID="+jSessionId+";secure;HttpOnly"); } 6. MongoDB NoSQL 注入 

过滤掉NoSql注入的相关字符,上面是对参数内容的过滤,下面的方法是对参数名的过滤。

  //防止MongoDB参数注入 public static boolean checkWebUnSafeMongoDB(String word){ String str=word.replaceAll("(?i)true", "").replaceAll("(?i)false", "").replaceAll("(?i)error", "").replaceAll(".*", "").replaceAll("^", "").replaceAll("(?i)$where", "").replaceAll("(?i)mapReduce", "").replaceAll("(?i)group", "") .replaceAll("(?i)find", "").replaceAll("(?i)db", "").replaceAll("(?i)$", "").replaceAll("(?i)$and", "").replaceAll("(?i)$gt", "").replaceAll("(?i)$lt", "").replaceAll("(?i)$gte", "").replaceAll("(?i)$lte", "").replaceAll("(?i)$ne", "").replaceAll("(?i)$in", "").replaceAll("(?i)$nin", "") .replaceAll("(?i)$all", "").replaceAll("(?i)$or", "").replaceAll("(?i)$not", ""); if (word.length()!=str.length()) { return true; } return false; } //防止MongoDB名词注入 public static boolean checkWebUnSafeParameterNameMongoDB(String word){ String str=word.replaceAll("(?i)regex", "").replaceAll("(?i)ne", "").replaceAll("$", "").replaceAll("\\[", "").replaceAll("\\]", "").replaceAll("(?i)ORIG", "").replaceAll("(?i)VAL", ""); if (word.length()!=str.length()) { return true; } return false; } 7.未实施加密

添加一段代码,让服务器只接收https请求。

//判断是否为https开头 String referer=request.getHeader("Referer"); if(!referer.startsWith("https://")){ forwordException(req, request, response, "","未实施加密,请求无效");//包装一个跳转错误的方法 return; } 8.发现可高速缓存的 SSL 页面

 

 添加响应头

//阻止高速缓存 response.setHeader("Cache-Control", "no-cache,no-store"); response.setHeader("Pragma", "no-cache"); 9.缺少 HTTP Strict-Transport-Security 头    缺少“Content-Security-Policy”头    缺少“X-Content-Type-Options”头    缺少“X-XSS-Protection”头 

 

 

 

 添加响应头。

response.setHeader("Strict-Transport-Security", "max-age=31536000; includeSubDomains"); response.setHeader("Content-Security-Policy", "referrer https:;js-src https:;form-action https:;"); response.setHeader("X-Content-Type-Options", "nosniff"); response.setHeader("X-XSS-Protection", "1");

 

 

 

另外,如何获取所有请求参数 Enumeration em = request.getParameterNames(); while (em.hasMoreElements()) { String name = (String) em.nextElement(); String value = req.getParameter(name);        }

 



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3