目录
一、前言
1.1、XSS攻击流程
1.2、XSS攻击分类
1.3、攻击方式
二、解决方案
2.1、SPRINGBOOT XSS过滤插件(MICA-XSS)
2.2、MICA-XSS 配置
三、项目实战
3.1、项目环境
3.2、测试
3.2.1、测试GET请求
3.2.2、测试POST请求
3.2.3、测试POST请求
四、MICA-XSS 原理剖析
4.1、MICA-XSS 源码
XSS攻击又称跨站脚本攻击,通常指利用网页开发时留下的漏洞,通过巧妙的方法注入恶意指令代码到网页,使用户加载并执行攻击者恶意制造的网页程序。这些恶意网页程序通常是JavaScript,但实际上也可以包括Java、 VBScript、ActiveX、 Flash 或者甚至是普通的HTML。攻击成功后,攻击者可能得到包括但不限于更高的权限(如执行一些操作)、私密网页内容、会话和cookie等各种内容。
例如在设计某个表单时,没做相关防XSS攻击的处理。用户通过该表单提交相关恶意代码,浏览器会执行相关的代码,从而发起XSS攻击。如下图:
XSS攻击具有三类:反射型、存储型和DOM XSS
说明:
https://www.域名.com/index.php?xss=
https://www.域名.com/index.html#alert(xss攻击)
XSS攻击方式很多,这里只介绍一些常用的XSS攻击手段以及其目的,为提出Springboot项目防止XSS攻击解决方案做说明。例如:
盗用cookie,获取敏感信息。
利用植入Flash,通过crossdomain权限设置进一步获取更高权限;或者利用Java等得到类似的操作。
利用iframe、frame、XMLHttpRequest或上述Flash等方式,以(被攻击)用户的身份执行一些管理动作,或执行一些一般的如发微博、加好友、发私信等操作。
利用可被攻击的域受到其他域信任的特点,以受信任来源的身份请求一些平时不允许的操作,如进行不当的投票活动。
在访问量极大的一些页面上的XSS可以攻击一些小型网站,实现DDoS攻击的效果。
许多初级Springboot开发人员经常中此招,最近在测试个人项目时,也出现了这个问题。那么在Springboot项目中,我们该如何防止XSS攻击呢?
通过对XSS攻击的介绍,我们知道了XSS常从表单输入、URL请求、以及Cookie等方面进行攻击。因此,我们可以从如下几个方面进行防止XSS攻击。
其实这些解决方案都不用我们自己去实现,SpringBoot 对应的Maven插件为我们提供了对于的XSS 安全过滤插件:mica-core 和 mica-xss
添加Maven依赖后,便已经完成了XSS过滤配置。
mica-xss组件说明:
<dependency>
<groupId>net.dreamlu</groupId>
<artifactId>mica-xss</artifactId>
<version>2.0.9-GA</version>
</dependency>
<dependency>
<groupId>net.dreamlu</groupId>
<artifactId>mica-core</artifactId>
<version>2.1.0-GA</version>
</dependency>
mica:
xss:
enabled: true
path-exclude-patterns:
path-patterns: /**
开发工具:IDEA-2020.02 Springboot 2.4.1
测试工具:Google浏览器 Postman
未设置XSS防护:
添加注解@XssCleanIgnore跳过XSS过滤
import net.dreamlu.mica.xss.core.XssCleanIgnore;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* @author dell
*/
@RestController
@XssCleanIgnore //设置该注解 用于跳过配置的Xss 防护
@RequestMapping("/")
public class IndexController {
@GetMapping("/xss")
public String xssGet(String data){
System.out.println(data);
return data;
}
}
效果如下:
设置XSS防护:
去掉注解 @XssCleanIgnore,返回为空。效果如下
3.2.2.1、测试POST请求(XSS代码放在URL上)
未设置XSS防护:
添加注解@XssCleanIgnore
跳过XSS过滤,返回data数据。
import net.dreamlu.mica.xss.core.XssCleanIgnore;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* @author dell
*/
@RestController
@XssCleanIgnore //设置该注解 用于跳过配置的Xss 防护
@RequestMapping("/")
public class IndexController {
@PostMapping("/xss")
public String xssPost(String data){
System.out.println(data);
return data;
}
}
效果如下:
设置XSS防护:
去掉注解@XssCleanIgnore
,设置XSS防护,过滤data数据,返回为空。
3.2.2.2、测试POST请求(XSS代码放在 BODY 中)
未设置XSS防护:
import net.dreamlu.mica.xss.core.XssCleanIgnore;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.Map;
/**
* @author dell
*/
@RestController
@XssCleanIgnore
@RequestMapping("/")
public class IndexController {
@PostMapping("/xss")
public String xssPostBody(@RequestBody Map<String,String> body){
System.out.println(body);
return body.get("data");
}
}
效果如下:
设置XSS防护:
如果使用request.getParameter("xss")); 等等ServletRequest原生方法,则是MICA拦截不到的,需要补充下面文章的过滤器,亲测有用,原理就是重写了原生的一些方法.添加过滤.
SpringBoot集成Hutool防止XSS攻击实现_wcybaonier的博客-CSDN博客
说明:
链接:https://gitee.com/596392912/mica/tree/master/mica-xss
mica-xss 源码