0x00 前言

代码审计中,如果遇到了SpringBoot,Filter的执行顺序肯定是至关重要的,所以本节来看一下SpringBoot的Filter加载顺序。

0x01 加载顺序

这里先来看一个Demo

package com.cms.config;

import com.cms.filter.PageCacheFilter;
import com.cms.filter.PermissionFilter;
import com.cms.filter.UrlFilter;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class FilterConfig {

    @Autowired
    private PageCacheFilter pageCacheFilter;

    @Autowired
    private PermissionFilter permissionFilter;

    @Autowired
    private UrlFilter urlFilter;

    @Bean
    public FilterRegistrationBean registerPageCacheFilter() {
        FilterRegistrationBean registration = new FilterRegistrationBean();
        registration.setFilter(pageCacheFilter);
        registration.addUrlPatterns("/*");
        registration.setName("pageCacheFilter");
        registration.addInitParameter("cacheName","PageCacheFilter");
        registration.setOrder(1);
        return registration;
    }

    @Bean
    public FilterRegistrationBean registerPermissionFilter() {
        FilterRegistrationBean registration = new FilterRegistrationBean();
        registration.setFilter(permissionFilter);
        registration.addUrlPatterns("/admin/*");
        registration.setName("permissionFilter");
        registration.setOrder(2);
        return registration;
    }

    @Bean
    public FilterRegistrationBean registerUrlFilter() {
        FilterRegistrationBean registration = new FilterRegistrationBean();
        registration.setFilter(urlFilter);
        registration.addUrlPatterns("/*");
        registration.setName("urlFilter");
        registration.setOrder(3);
        return registration;
    }

}

@Configuration注解表示告诉SpringBoot这是一个配置类。

@Autowired注解表示会自动生成封装方法。

@Bean注解用于告诉方法,产生一个Bean对象,然后这个Bean对象交给Spring管理。

FilterRegistrationBean 这个类的主要作用就是用来注册filter的优先级的,registration.setOrder(1),这里的数字越小代表filter的优先级越高。

registration.setFilter(pageCacheFilter);
		# 注册的路径
        registration.addUrlPatterns("/*");
		# 注册的filter
        registration.setName("pageCacheFilter");
        # 不需要过滤的filter
		registration.addInitParameter("cacheName","PageCacheFilter");
		# 优先级
        registration.setOrder(1);

补充知识

SpringBoot

Spring Boot 是一款轻量级的开源 Java 框架,它基于 Spring 框架,为开发 Spring 应用程序提供了快速、简便的方式。Spring Boot 可以自动配置 Spring 应用程序和 Spring 应用程序的依赖项,从而减少了配置文件和样板代码的编写。它还提供了各种各样的插件和库,如数据库访问、Web 开发、安全性等。与传统的 Spring 应用程序相比,Spring Boot 的最大优势在于它可以快速启动,从而加速应用程序的部署和开发过程。

Filter

Spring Boot Filter 是 Spring 框架中的一种机制,它是用于在 Web 应用中对请求和响应进行拦截或过滤处理的组件。它为开发者提供了一种灵活的方式来对请求和响应进行处理,可以在请求进入控制器之前对请求进行一些必要的处理,或在响应返回给客户端之前对响应进行一些必要的修改或补充操作。通过配置 Filter,开发者可以实现对请求参数的验证、对请求进行安全验证、对响应进行加密解密等操作,从而提高了 Web 应用的安全性和可靠性。

在 Spring Boot 中,开发者可以通过实现 Filter 接口或继承 Filter 抽象类来编写自己的 Filter,然后通过配置 FilterRegistrationBean 对 Filter 进行注册和启用。同时,Spring Boot 还提供了一些内置的 Filter,如 CharacterEncodingFilter、HiddenHttpMethodFilter 等,可以直接使用。

代码审计学习方法

以下是代码审计学习的方法:

  1. 学习编程语言:了解不同编程语言的语法和基本语句是很重要的,这有助于理解代码的构造。
  2. 学习漏洞类型:了解最常见的漏洞类型(如SQL注入、跨站脚本攻击、文件包含)是必要的,这样可以帮助你更快地识别和定位漏洞。
  3. 使用工具:有些工具可以帮助你快速分析代码,例如静态代码分析工具(如Fortify、FindBugs、Checkmarx等)或动态分析工具(如Burp Suite、OWASP ZAP等)。这些工具可以自动检测是否存在常见的漏洞。
  4. 阅读安全资源:阅读安全论坛、安全博客、安全杂志等都会对你的知识汇聚有所帮助,可以了解最新的漏洞和攻击技术。
  5. 编写代码:编写自己的代码可以增加对编程语言和其中的漏洞类型的理解,同时当你自己编写代码时,也能帮助你更好地理解其他人的代码。
  6. 实践:最好的学习方法是实践,尝试在一些CTF比赛或渗透测试实践中寻找漏洞可以帮助你更好地理解代码审计。