# XSS攻击实践

> 作者/来源: UCloud 运营管理员
> 发布时间: 2022-10-08T06:57:00.000Z
> 分类: 云主机
> 标签: 安全, 存储, 前端
> 原文链接: http://117.50.162.249:3000/yun/articles/2383

---

# XSS攻击实践

> 来源: https://www.ucloud.cn/yun/127962.html
> 作者: 社区管理员
> 发布日期: 发布于2022-10-08 14:57

## 一、前言

由于浏览器同源策略，限制了页面无法引用第三方资源，无法请求不同源下面的资源，影响了web的发展，所以浏览器出让了一些安全策略来满足web的发展。

- 通过CSP安全策略来保证浏览器可以安全的加载第三方资源；
- 通过CORS允许浏览器跨域请求；
- 通过PostMessage来操作DOM

但这些策略也给了黑客攻击我们的站点的机会。

web站点常见的攻击方式包括：`XSS攻击`，`CSRF攻击`、`Sql注入攻击`等。

## 二、XSS攻击

### 1、什么是XSS攻击

XSS攻击（跨站脚本攻击），黑客通过网站的漏洞，将恶意脚本插入Html页面，当用户打开站点时，由于恶意脚本和站点代码拥有同样的执行权限，恶意脚本就有可能篡改站点内容，窃取用户信息发送到第三方服务器。

恶意代码一般会做下面这些攻击：

- 获取用户Cookies
- 修改用户DOM，伪造登录页面
- 生成浮窗广告
- 监听用户输入

### 2、XSS攻击的分类

XSS攻击常被分为三类：存储型攻击、反射型攻击、基于DOM的XSS攻击。

前两种一般要经过服务器，所以后端研发更需要注意，而最后一种没有经过服务器，是需要前端注意避免的。

#### 1）存储型攻击

一个真实的案例就是：2015年乌云网爆出来的，喜玛拉雅站点，编辑上传专辑名称，未对录入表单进行过滤，黑客可以上传恶意脚本到服务器。当其他用户点击这张专辑的时候，就执行了恶意脚本，恶意脚本获取用户的Cookies信息，上传到黑客的服务器，然后就可以登录用户的站点。

第一步：输入恶意脚本到站点，没有过滤，所以可以上传到服务器

![image.png](https://ucloud-blog.cn-bj.ufileos.com/articles/127962/images/127962_000.png)

 第二步：当用户打开了当前页面，执行了恶意脚本，后端代码没有禁止第三方站点发出的请求，所以黑客就获取了用户的Cookies，接着就可以访问用户的站点或者调用站点的API

![image.png](https://ucloud-blog.cn-bj.ufileos.com/articles/127962/images/127962_001.png)

#### 2）反射型攻击

反射型XSS攻击的常见模式是，黑客发现了网站存在将url的参数直接在页面上显示，并且没有过滤的情况，于是黑客就构造带有恶意脚本的链接，诱导用户点击，当用户点击了链接，就将恶意代码注入到了页面并执行，从而获取用户信息等。

**反射型攻击案例：**

页面中又直接渲染html的变量，直接渲染html的，如下代码，直接读取url参数query， 在页面展示，如果后端服务没有经过过滤，就有可能将query的代码引入页面中执行，造成攻击

![image.png](https://ucloud-blog.cn-bj.ufileos.com/articles/127962/images/127962_002.png)

![image.png](https://ucloud-blog.cn-bj.ufileos.com/articles/127962/images/127962_003.png)

#### 3)基于DOM的XSS攻击

该攻击可以是一些流氓软件或攻击路由器，在http请求返回的过程中，在返回的数据中插入了恶意代码，前端站点如果没有过滤，就可能出现执行恶意代码的情况。

### 3、其他相关案例

1、页面读取html显示，后端通过抓取邮件内容，生成html，给到前端展示。由于邮件中可能存在一些非法标签，浏览器在解析中无法识别，就导致浏览器crash，常常使用插件或者js过滤，转译等。

2、给朋友发送一个页面的脚本，其中alert了6次，并且获取了浏览器Cookies

```
<!DOCTYPE html> <html lang="en">     <head>         <meta charset="UTF-8">         <title>攻击测试</title>     </head>     <body>         <script>             window.onload = () => {                 document.cookie = "username=test"                 for(let i=0; i<=5; i++){                     alert(`你被攻击了，我获取了你的Cookies${document.cookie}`)                  }             }         </script>         你被攻击了     </body> </html> 复制代码
```

打开页面后：

![image.png](https://ucloud-blog.cn-bj.ufileos.com/articles/127962/images/127962_004.png)

 如果将其中的攻击脚本插入用户的页面中，然后向第三方服务器发送cookies，这就构成了XSS攻击

## 三、模拟存储型攻击

我们来模拟下存储型攻击

### 1、前期准备

一个恶意的脚本这里用Express搭建，端口9000

![一个恶意服务](https://ucloud-blog.cn-bj.ufileos.com/articles/127962/images/127962_005.png)

### 2、正常站点

另外启动一个http服务器，为我们的正常站点，端口8080。

假设，这个的网站存在漏洞，没有过滤参数，恶意脚本上传到了服务器

![表单录入](https://ucloud-blog.cn-bj.ufileos.com/articles/127962/images/127962_006.png)

### 3、正常站点的另一个页面

当用户打开另一个页面，可以加载了前一步录入的内容，我们发现恶意脚本已经执行

![打开站点](https://ucloud-blog.cn-bj.ufileos.com/articles/127962/images/127962_007.png)

### 4、恶意脚本执行

![恶意脚本执行](https://ucloud-blog.cn-bj.ufileos.com/articles/127962/images/127962_008.png)

### 5、恶意服务后端获取当前站点Cookies

![获取Cookie](https://ucloud-blog.cn-bj.ufileos.com/articles/127962/images/127962_009.png)

## 四、防止XSS攻击的办法

阻止XSS攻击，要先知道XSS攻击的原理：一般分为两个步骤。

第一步：黑客找到站点的漏洞，想站点插入恶意脚本。

第二步：读取站点的信息，发送到第三方服务器。

XSS攻击主要有以下方法注入：

- html中的script脚本
- 凡事可以请求第三方数据的地方：标签的属性Img的src属性、a标签的href属性、`background:url()`
- js脚本的拼接特殊字符

对于后端来说，主要有以下几处常常不可信：

- 用户输入内容
- url参数
- post参数
- 第三方的链接
- referere
- Cookies

### 1、过滤关键字

对于存储型XSS攻击和反射型XSS攻击，二者由于都需要过服务器，那么只要后端开发在入库的时候最敏感代码进行过滤进行过滤，就可以避免大部分的XSS攻击。

### 2、前端框架和组件的使用

目前对于前端的大部分组件（富文本组件）和常见的Vue、React框架都对展示的数据，只会展示以字符串进行展示。

对于有可能嵌入恶意代码的部分也贴心的增加了提示：

如在Vue中：

```
<div v-html="html"></div> 复制代码
```

在React中：

```
<div dangerouslySetInnerHTML = {{__html:<div><script src="http://xxs.js"></script></div>}} ></div> 复制代码
```

这些可能导致XSS攻击的地方，框架都给了显著的提示，所以在页面显示这些不可控的内容前要进行过滤。

### 3、严格执行CSP策略

设置CSP，现在站点加载或发送请求到第三方服务器

### 4、给Cookie设置HttpOnly

给cookies设置了该属性，当前页面重要的Cookie就无法通过js读取，这样黑客也就无法获取用户的信息

作者：前端中后台  
链接：https://juejin.cn/post/7041435485310287886  
来源：稀土掘金  
著作权归作者所有。商业转载请联系作者获得授权，非商业转载请注明出处。