首页 > 其他分享 >SpringBoot Xss漏洞修复

SpringBoot Xss漏洞修复

时间:2023-01-11 17:13:46浏览次数:36  
标签:Xss SpringBoot value 漏洞 org import com public String

原文链接:https://www.cnblogs.com/zhangruifeng/p/16082741.html

1、过滤SQL、JS脚本

1.1、添加pom依赖

  <dependency>
       <groupId>org.apache.commons</groupId>
       <artifactId>commons-text</artifactId>
       <version>1.4</version>
   </dependency>

1.2、创建XssAndSqlHttpServletRequestWrapper

package cn.vantee.util;

import org.apache.commons.text.StringEscapeUtils;
import org.springframework.util.StringUtils;

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

/**
 * @author :[email protected]
 * @date :Created in 2022/3/31 16:46
 * @description:xss过滤
 * @modified By:
 * @version: 1.0.0
 */
public class XssAndSqlHttpServletRequestWrapper extends HttpServletRequestWrapper {

    private HttpServletRequest request;

    public XssAndSqlHttpServletRequestWrapper(HttpServletRequest request) {
        super(request);
        this.request = request;
    }

    /**
     * 假如有有html 代码是自己传来的  需要设定对应的name 不走StringEscapeUtils.escapeHtml4(value) 过滤
     */
    @Override
    public String getParameter(String name) {
        String value = request.getParameter(name);
        if (!StringUtils.isEmpty(value)) {
            value = StringEscapeUtils.escapeHtml4(value);
        }
        return value;
    }

    @Override
    public String[] getParameterValues(String name) {
        String[] parameterValues = super.getParameterValues(name);
        if (parameterValues == null) {
            return null;
        }
        for (int i = 0; i < parameterValues.length; i++) {
            String value = parameterValues[i];
            parameterValues[i] = StringEscapeUtils.escapeHtml4(value);
        }
        return parameterValues;
    }
}

1.3、创建XssStringJsonSerializer

package cn.vantee.util;

import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializerProvider;
import org.apache.commons.text.StringEscapeUtils;

import java.io.IOException;

/**
 * @author :[email protected]
 * @date :Created in 2022/3/31 16:47
 * @description:xss过滤
 * @modified By:
 * @version: 1.0.0
 */
public class XssStringJsonSerializer extends JsonSerializer<String> {

    @Override
    public Class<String> handledType() {
        return String.class;
    }

    /**
     * 假如有有html 代码是自己传来的  需要设定对应的name 不走StringEscapeUtils.escapeHtml4(value) 过滤
     */
    @Override
    public void serialize(String value, JsonGenerator jsonGenerator, SerializerProvider serializerProvider)
            throws IOException {
        if (value != null) {
            String encodedValue = StringEscapeUtils.escapeHtml4(value);
            jsonGenerator.writeString(encodedValue);
        }
    }

}


1.4、创建过滤器

package cn.vantee.filter;

import cn.vantee.util.XssAndSqlHttpServletRequestWrapper;
import cn.vantee.util.XssStringJsonSerializer;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.module.SimpleModule;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Primary;
import org.springframework.http.converter.json.Jackson2ObjectMapperBuilder;
import org.springframework.stereotype.Component;

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;

/**
 * @author :[email protected]
 * @date :Created in 2022/3/31 10:53
 * @description:xss过滤
 * @modified By:
 * @version: 1.0.0
 */
@WebFilter(filterName = "xssFilter", urlPatterns = "/*", asyncSupported = true)
@Component
public class XssFilter implements Filter {

    @Override
    public void destroy() {
        // TODO Auto-generated method stub

    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {
        // TODO Auto-generated method stub
        HttpServletRequest req = (HttpServletRequest) request;
        XssAndSqlHttpServletRequestWrapper xssRequestWrapper = new XssAndSqlHttpServletRequestWrapper(req);
        chain.doFilter(xssRequestWrapper, response);
    }

    @Override
    public void init(FilterConfig arg0) throws ServletException {
        // TODO Auto-generated method stub
    }

    @Bean
    @Primary
    public ObjectMapper xssObjectMapper(Jackson2ObjectMapperBuilder builder) {
        // 解析器
        ObjectMapper objectMapper = builder.createXmlMapper(false).build();
        // 注册xss解析器
        SimpleModule xssModule = new SimpleModule("XssStringJsonSerializer");
        xssModule.addSerializer(new XssStringJsonSerializer());
        objectMapper.registerModule(xssModule);
        // 返回
        return objectMapper;
    }
}

@Primary 注解优先走这个Bean方法。
asyncSupported = true 配置支持异步,sync-supported是servlet 3.0后推出的新特性

5、验证

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <form action="/test">
        <input type="text" name="params">
        <input type="submit">
    </form>
</body>
</html>
package cn.vantee.controller;

import cn.vantee.service.TestService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * @author :[email protected]
 * @date :Created in 2022/3/29 14:53
 * @description:测试Controller
 * @modified By:
 * @version: 1.0.0
 */
@RestController
public class TestController {

    @Autowired
    public TestService testService;

    @GetMapping("/test")
    public String test(String params){
      System.out.println(params);
			return params;
    }

}

输入:

<script>hello world</scrpit>

输出:

&lt;script&gt;hello world&lt;/scrpit&gt;

2、设置HttpOnly

2.1、什么是HttpOnly

如果cookie中设置了HttpOnly属性,那么通过js脚本将无法读取到cookie信息,这样能有效的防止XSS攻击,窃取cookie内容,这样就增加了cookie的安全性,即便是这样,也不要将重要信息存入cookie。XSS全称Cross SiteScript,跨站脚本攻击,是Web程序中常见的漏洞,XSS属于被动式且用于客户端的攻击方式,所以容易被忽略其危害性。其原理是攻击者向有XSS漏洞的网站中输入(传入)恶意的HTML代码,当其它用户浏览该网站时,这段HTML代码会自动执行,从而达到攻击的目的。如,盗取用户Cookie、破坏页面结构、重定向到其它网站等。

2.2、如何设置

案例:

response.addHeader("Set-Cookie", "username=123456; Path=/; HttpOnly")

标签:Xss,SpringBoot,value,漏洞,org,import,com,public,String
From: https://www.cnblogs.com/fswhq/p/16981419.html

相关文章

  • Java进阶篇——springboot2源码探究
    1.@EnableAutoConfiguration除了元注解之外,EnableAutoConfiguration包含了两大重要部分:1)@AutoConfigurationPackage注解该注解只导入了一个内部类:AutoConfigurationPac......
  • XSS之WAF绕过及安全修复
    常规WAF绕过思路标签语法替换 (aherf /imgsrc''onerror='')特殊符号干扰 (/   #)提交方式更改垃圾数据溢出加密解密算法结合其他漏洞绕过——————通过拆解语句......
  • XSS跨站原理
    XSS跨站漏洞(会被浏览器内核版本限制)(限制条件太多)本质:在变量接收数据时,数据可以写成JS脚本,可以被执行和显示。产生层面:前端函数类:输出类函数——————XSS跨站漏洞分类反......
  • XSS代码及HTTP only绕过
    什么是HTTPonly?如果你在cookie中设置了HTTPonly属性,那么通过js脚本将无法获取cookie信息,这样能有效的防止XSS攻击。——————HTTPonly代码<?phpini_set("session.coo......
  • SpringBoot配置文件中spring
    SpringBoot配置文件中spring.profiles.active配置详解现象:在开发的时候测试和生产配置不一样每次加配置都需要更新生产原因:不方便解决:添加多套配置知识库:1、多环......
  • Springboot3.0 +OpenApi
    pom.xml<dependency><groupId>org.springdoc</groupId><artifactId>springdoc-openapi-starter-webmvc-ui</artifactId>......
  • SpringBoot+Mybatis-plus整合easyExcel批量导入Excel到数据库+导出Excel
    一、前言今天小编带大家一起整合一下easyExcel,之所以用这个,是因为easyExcel性能比较好,不会报OOM!市面上常见的导入导出Excel分为三种:hutooleasyExcelpoihutool和eas......
  • 【SpringBoot实战专题】「开发实战系列」从零开始教你舒服的使用RedisTemplate操作Red
    SpringBoot快速操作Redis数据在SpringBoot框架中提供了spring-boot-starter-data-redis的依赖组件进行操作Redis服务,当引入了该组件之后,只需要配置Redis的配置即可进行链......
  • 【SpringBoot实战专题】「开发实战系列」从零开始教你舒服的使用RedisTemplate操作Red
    SpringBoot快速操作Redis数据在SpringBoot框架中提供了spring-boot-starter-data-redis的依赖组件进行操作Redis服务,当引入了该组件之后,只需要配置Redis的配置即可进行链接R......
  • SpringBoot-MVC自动配置类
    前言今天写登录页面的时候,遇到了一个问题,bootstrape的静态资源引用失败,提示NomappingforGET/bootstrap/css/bootstrap.min.css,百度后得知需要在MVC自动配置类映......