admin管理员组文章数量:1586729
1.appScan 中危漏洞指示跨站点请求伪造尝试成功,尽管其中有假想的“Referer”头
解决办法:在shiro的配置文件中 引入 <property name="Secure" value="true"/>
2.AppScan 发现加密会话(SSL)使用的是没有“secure”属性的 cookie。
解决办法:在shiro的配置文件中 引入 <property name="Secure" value="true"/>
<bean id="sessionIdCookie" class="org.apache.shiro.web.servlet.SimpleCookie">
<constructor-arg name="name" value="*****自己的sessionid"/>
<property name="httpOnly" value="true"/>
<property name="Secure" value="true"/><!-- https和本地开发环境可配置此属性,否则可能登陆不上系统 -->
</bean>
2.1再加全局拦截器:
package com.thinkgem.jeesitemon.filter;
import com.thinkgem.jeesitemon.mapper.JsonMapper;
import com.thinkgem.jeesitemon.utils.IdGen;
import com.thinkgem.jeesitemon.utils.StringUtils;
import javax.servlet.*;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
/**
* @author zfq
* @create 2021-12-28 17:44
* 在cookie上添加 Secure防跨站请求漏洞
*/
public class CsrfDefInterceptorUtil implements 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); //获取全部请求内容
String paramsNew=StringUtils.StringFilter(params);
paramsNew=StringUtils.cleanXSS(paramsNew);
// paramsNew=XssClean.xssClean_error(paramsNew); //更严格,会转译html字符不适合工单自定义
//若参数发生变化则说明有不合法字符 则阻止本次提交
if(!paramsNew.equals(params)){
System.out.println("拦截前params==========="+params);
System.out.println("拦截后params==========="+paramsNew);
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();
if("/a/login".equals(action)){
Cookie newCookie=new Cookie("JSESSIONID",""); //假如要删除名称为username的Cookie JSESSIONID是cookie名 记得换成要删除的
newCookie.setMaxAge(0); //立即删除型
response2.addCookie(newCookie); //重新写入,将覆盖之前的
response2.setHeader("Set-Cookie", "JSESSIONID="+IdGen.uuid()+";Path=/mycrm;SameSite=None;Secure;HttpOnly");
}else{
response2.setHeader("Set-Cookie", "JSESSIONID="+sessionid+";Path=/mycrm;SameSite=None;Secure;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中声明此拦截器
<filter>
<filter-name>filterCookie</filter-name>
<filter-class>xxxx.xx.CsrfDefInterceptorUtil</filter-class>
</filter>
<filter-mapping>
<filter-name>filterCookie</filter-name>
<url-pattern>/*</url-pattern>
<!-- /*是对所有的文件进行拦截 -->
</filter-mapping>
再看所有请求头中已有Secure 和HttpOnly属性
2.2.servlet3及以上 在web.xml中引入 http-only 和secure的属性
<web-app xmlns:xsi="http://www.w3/2001/XMLSchema-instance"
xmlns="http://xmlns.jcp/xml/ns/javaee"
xsi:schemaLocation="http://xmlns.jcp/xml/ns/javaee
http://xmlns.jcp/xml/ns/javaee/web-app_3_1.xsd"
id="WebApp_ID" version="3.1">
<display-name>MyComm</display-name>
<session-config>
<cookie-config>
<http-only>true</http-only>
<secure>true</secure>
</cookie-config>
</session-config>
</web-app>
pom中的servlet也要升级3.0之上的
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
<scope>provided</scope>
</dependency>
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.jeesitemon.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解决方案
7.高危漏洞 登录后缓存id没有发生变化
登出的时候和登录的时候把sessionId重置 //上面的拦截器有登录的时候重置sessionId
下面的方法是在登出的时候让sessionId失效
// 让旧session失效 SecurityUtils.getSubject().logout();
总结:这些处理方案对我们的系统真实有效,大神轻喷,仅供参考
版权声明:本文标题:AppScan检查到的一些中高危漏洞解决方案 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:https://www.elefans.com/xitong/1725724502a1038782.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论