# 一.XSS(反射型)

前言

它通过给别人发送带有恶意脚本代码参数的 URL,当 URL 地址被打开时,恶意代码参数被 HTML 解析、执行。它的特点是非持久化,必须用户点击带有特定参数的链接才能引起

攻击步骤(诱导用户点击恶意链接来造成一次性攻击)

  • 1.黑客把带有恶意脚本代码参数的 URL 地址发送给用户
  • 2.用户点击此链接
  • 3.服务器端获取请求参数并且直接使用,服务器反射回结果页面
  • 反射型 XSS 攻击是一次性的,必须要通过用户点击链接才能发起
  • 一些浏览器如 Chrome 其内置了一些 XSS 过滤器,可以防止大部分反射型 XSS 攻击
  • 反射型 XSS 其实就是服务器没有对恶意的用户输入进行安全处理就直接反射响应内容,导致恶意代码在浏览器中执行的一种 XSS 漏洞

# 1.案例一

# 1.1 前端部分

<a
  href="http://localhost:3000/goods?category=book<script>alert(`窃取用户cookie`)</script>"
>
  //用户访问带有恶意脚本代码的 url,用户遭受攻击 恶意链接 恶意链接
</a>
1
2
3
4
5
恶意链接

# 1.2 后端部分

const express = require("express")
const fs = require("fs")
const path = require("path")
const app = express()
const bodyParser = require("body-parser")

app.use(bodyParser.urlencoded({ extended: true }))
app.use(bodyParser.json())
app.use(express.static(path.resolve(__dirname, "public")))

const goods = {
  book: [{ name: "变形计" }, { name: "双城记" }],
  electronic: [{ name: "ipad", name: "iphone" }],
}

app.get("/goods", function(req, res) {
  let { category } = req.query
  res.header("Content-Type", "text/html;charset=utf-8")
  let currentGoods = goods[category]
  let detail = ""
  if (currentGoods) {
    detail = currentGoods.map((item) => `<li>${item.name}</li>`).join()
  } else {
    detail = "此分类下面没有商品"
  }
  res.send(`
  <h1>你选择的商品分类是:${category}</h1>
  <ul>${detail}</ul>
  `)
})
app.listen(3000, () => {
  console.log("The server is starting at port 3000")
})

//访问如下链接
//http://localhost:3000/goods?category=book<script>alert(1)</script>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36

# 2.场景

# 2.1 聊天软件

  • 用户在群中发送危险链接

# 2.2 学习社区

  • 作者在文章中留下危险链接

# 3.防范

总结

通过构造 url 地址,地址中暗藏 xss 平台地址,当有受害者点击此连接,会访问两个网址,一个是受害者原本想访问的网站,另一个是 xss 平台,受害者原本想访问的网站的 cookie 会被记录在 XSS 平台