漏洞修复-跨站请求伪造【高危】


前言

工作中渗透测试检测出,跨站请求伪造漏洞进行修复的记录。

一、跨站请求伪造是什么?

攻击者使用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;
}

总结

使用过滤器即可修复。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值