前言
工作中渗透测试检测出,跨站请求伪造漏洞进行修复的记录。一、跨站请求伪造是什么?
攻击者使用CSRF攻击能够强迫用户向服务器发送请求,导致用户信息被迫修改,甚至可引发蠕虫攻击。如果恶意用户能够知道网站管理后台某项功能的URL,就可以直接攻击管理员,强迫管理员执行恶意用户定义的操作。
二、给出的修复建议
(1)在后台添加请求的过滤器,将每个请求的Referer头与受信任的Referer集合进行验证。如验证不通过则跳转到登录页面或返回报错页面。
(2)配合在请求地址或者请求头添加token并验证方案来预防CSRF。
(3)检查程序代码里的增加、删除、修改等功能代码里是否调用formtoken、token等的变量函数有没有对refer请求链接进行判断。
三、修复过程
1、准备过滤器
public class CsrfFilter implements Filter {
private final Logger logger = LogManager.getLogger(CsrfFilter.class);
public void init(FilterConfig filterConfig) throws ServletException {
}
public void destroy() {
}
/**
* 拦截
*/
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain)
throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) servletRequest;
// 不启用或者已忽略的URL不拦截
// if (!enable || isExcludeUrl(request.getServletPath())) {
// filterChain.doFilter(servletRequest, servletResponse);
// return;
// }
String referer = request.getHeader("Referer");
String serverName = request.getServerName();
if (null != referer && referer.indexOf(serverName) < 0) {
// 判断是否存在外链请求本站
servletResponse.setContentType("text/html; charset=utf-8");
servletResponse.getWriter().write("系统不支持当前域名的访问!");
} else {
filterChain.doFilter(servletRequest, servletResponse);
}
}
}
2、注册过滤器
@Bean
public FilterRegistrationBean<CsrfFilter> csrfFilterBean() {
FilterRegistrationBean<CsrfFilter> registrationBean = new FilterRegistrationBean<>();
registrationBean.setFilter(new CsrfFilter());
registrationBean.addUrlPatterns("/*"); // 这里配置需要过滤的URL
registrationBean.setName("csrfFilter");
registrationBean.setOrder(1); // 设置过滤器的执行顺序,数字越小越优先
return registrationBean;
}