SQL盲注、SQL注入 - SpringBoot配置SQL注入过滤器

待我称王封你为后i 2023-10-05 10:12 151阅读 0赞
  1. SQL盲注、SQL注入

风险:可能会查看、修改或删除数据库条目和表。

原因: 未对用户输入正确执行危险字符清理。

固定值: 查看危险字符注入的可能解决方案。

  1. pom.xml添加依赖


    org.springframework.boot
    spring-boot-configuration-processor
    true
  2. 添加SQL注入包装类

    import java.util.regex.Matcher;
    import java.util.regex.Pattern;

    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletRequestWrapper;

    import cn.hutool.core.util.StrUtil;
    import lombok.extern.slf4j.Slf4j;

    /**

    • SQL注入包装类
    • @author CL
      /
      @Slf4j
      public class SqlInjectHttpServletRequestWrapper extends HttpServletRequestWrapper {

      /**

      • 构造请求对象
      • @param request
        */
        public SqlInjectHttpServletRequestWrapper(HttpServletRequest request) {
        super(request);
        }

        /**

      • 获取头部参数
      • @param v 参数值
        */
        @Override
        public String getHeader(String v) {
        String header = super.getHeader(v);
        if (header == null || “”.equals(header)) {

        1. return header;

        }
        return sqlFilter(header);
        }

        /**

      • 获取参数
      • @param v 参数值
        */
        @Override
        public String getParameter(String v) {
        String param = super.getParameter(v);
        if (param == null || “”.equals(param)) {

        1. return param;

        }
        return sqlFilter(param);
        }

        /**

      • 获取参数值
      • @param v 参数值
        */
        @Override
        public String[] getParameterValues(String v) {
        String[] values = super.getParameterValues(v);
        if (values == null) {

        1. return values;

        }

        // 富文本内容不过滤
        if (“remarks”.equals(v)) {

        1. return values;

        }

        int length = values.length;
        String[] resultValues = new String[length];
        for (int i = 0; i < length; i++) {

        1. // 过滤特殊字符
        2. resultValues[i] = sqlFilter(values[i]);
        3. if (!(resultValues[i]).equals(values[i])) {
        4. log.debug("SQL注入过滤器 => 过滤前:{} => 过滤后:{}", values[i], resultValues[i]);
        5. }

        }
        return resultValues;
        }

        /**

      • 预编译SQL过滤正则表达式
        */
        private Pattern sqlPattern = Pattern.compile(

        1. "(?:')|(?:--)|(/\\*(?:.|[\\n\\r])*?\\*/)|(\\b(select|update|and|or|delete|insert|trancate|char|into|substr|ascii|declare|exec|count|master|into|drop|execute)\\b)",
        2. Pattern.CASE_INSENSITIVE);

        /**

      • SQL过滤
      • @param v 参数值
      • @return
        */
        private String sqlFilter(String v) {
        if (v != null) {
        1. String resultVal = v;
        2. Matcher matcher = sqlPattern.matcher(resultVal);
        3. if (matcher.find()) {
        4. resultVal = matcher.replaceAll("");
        5. }
        6. if (!resultVal.equals(v)) {
        7. return "";
        8. }
        9. return resultVal;
        }
        return null;
        }
        }
  3. 配置文件添加配置

    信息安全

    security:
    sql:

    1. enable: true
    2. excludes:
    3. - /images/*
    4. - /jquery/*
    5. - /layui/*
  4. 添加SQL注入过滤器

    import java.io.IOException;
    import java.util.List;
    import java.util.regex.Matcher;
    import java.util.regex.Pattern;

    import javax.servlet.Filter;
    import javax.servlet.FilterChain;
    import javax.servlet.FilterConfig;
    import javax.servlet.ServletException;
    import javax.servlet.ServletRequest;
    import javax.servlet.ServletResponse;
    import javax.servlet.annotation.WebFilter;
    import javax.servlet.http.HttpServletRequest;

    import org.springframework.boot.context.properties.ConfigurationProperties;
    import org.springframework.stereotype.Component;

    /**

    • SQL注入过滤器
    • @author CL
      /
      @Component
      @ConfigurationProperties(prefix = “security.sql”)
      @WebFilter(filterName = “SqlInjectFilter”, urlPatterns = “/*”)
      public class SqlInjectFilter implements Filter {

      /**

      • 过滤器配置对象
        */
        FilterConfig filterConfig = null;

        /**

      • 是否启用
        */
        private boolean enable;

        public void setEnable(boolean enable) {
        this.enable = enable;
        }

        /**

      • 忽略的URL
        */
        private List excludes;

        public void setExcludes(List excludes) {
        this.excludes = excludes;
        }

        /**

      • 初始化
        */
        @Override
        public void init(FilterConfig filterConfig) throws ServletException {
        this.filterConfig = filterConfig;
        }

        /**

      • 拦截
        */
        @Override
        public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain)

        1. throws IOException, ServletException {

        HttpServletRequest request = (HttpServletRequest) servletRequest;

        // 不启用或者已忽略的URL不拦截
        if (!enable || isExcludeUrl(request.getServletPath())) {

        1. filterChain.doFilter(servletRequest, servletResponse);
        2. return;

        }
        SqlInjectHttpServletRequestWrapper sqlInjectHttpServletRequestWrapper = new SqlInjectHttpServletRequestWrapper(

        1. request);

        filterChain.doFilter(sqlInjectHttpServletRequestWrapper, servletResponse);
        }

        /**

      • 销毁
        */
        @Override
        public void destroy() {
        this.filterConfig = null;
        }

        /**

      • 判断是否为忽略的URL
      • @param urlPath URL路径
      • @return true-忽略,false-过滤
        */
        private boolean isExcludeUrl(String url) {
        if (excludes == null || excludes.isEmpty()) {
        1. return false;
        }
        return excludes.stream().map(pattern -> Pattern.compile(“^” + pattern)).map(p -> p.matcher(url))
        1. .anyMatch(Matcher::find);
        }
        }

发表评论

表情:
评论列表 (有 0 条评论,151人围观)

还没有评论,来说两句吧...

相关阅读

    相关 dnslog注入_dnslog

    dnslog注入原理通过子查询,将内容拼接到域名内,让load\_file()去访问共享文件,访问的域名被记录此时变为显错注入,将盲注变显错注入,读取远程共享文件,通过拼接出函