0x00 前言

把CTFHub技能树的XSS题目刷完了,也觉得需要对XSS有原理上的了解。本质学习有以下目标:

  • 各种类型的XSS的原理
  • 各种类型的XSS的异同
  • XSS的防范措施

推荐文章:这一次,彻底理解XSS攻击-腾讯云开发者社区-腾讯云 (tencent.com)

0x01 概述

XSS(Cross-site scripting),跨站脚本攻击。

  • 攻击原理:前端被插入精心构造的恶意代码,以实现攻击者的目的。从本质上来看,这样的输入流不再是纯净的数据流,可以影响到控制流。

  • 攻击手段:一般是JavaScript,还有JavaVBScriptLiveScriptActiveXFlash 甚至是普通的HTML

  • XSS类型:反射型(非持久型)XSS存储型(持久型)XSSDOM型XSS通用型XSS突变型XSS

0x02 反射型XSS

先看看下面这张图片

原理

首先,黑客把恶意链接发给用户。

然后,用户点击恶意链接,恶意代码执行并把用户信息发到恶意服务器。

最后,黑客从恶意服务器接受用户提交的信息。

思考

  • 反射型XSS的payload没有存储到数据库的过程,服务器拿到payload后(存在过滤)直接反射到HTML文档,每一次完整的过程都需要重新输入payload。
  • 恶意链接需要用户点击,不够自动化。

存储型XSS可以解决这些问题。

0x03 存储型XSS

再认真看看这张图片

原理

首先,黑客在正常服务器上插入了恶意程序。

然后,用户在正常服务器上访问了恶意程序,恶意代码执行并把用户信息发到恶意服务器。

最后,黑客从恶意服务器接受用户提交的信息。

思考

  • 对于第一个问题:

反射型XSS的payload没有存储到数据库的过程,服务器拿到payload后(存在过滤)直接反射到DOM文档,每一次完整的过程都需要重新输入payload。

存储型XSS每次的payload都由正常服务器的数据库提供。

  • 对于第二个问题:

恶意链接需要用户点击,不够自动化。

两种XSS的异同:

XSS类型 执行者 方式 结果
反射型XSS 用户 点击恶意链接 被动触发恶意程序
存储型XSS 系统 运行WEB服务 主动运行恶意程序

对于不同的对象,使用特定的方式来执行恶意程序,实现XSS。

0x04 DOM型XSS

原理

与反射型XSS类似,但是输入流不经过服务器,直接流向DOM节点。这样的好处就是不用当心服务端的waf。

demo

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<html>
<head>
<title>DOM Based XSS Demo</title>
<script>
function xsstest()
{
var str = document.getElementById("input").value;
document.getElementById("output").innerHTML = "<img
src='"+str+"'></img>";
}
</script>
</head>
<body>
<div id="output"></div>
<input type="text" id="input" size=50 value="" />
<input type="button" value="submit" onclick="xsstest()" />
</body>
</html>

通过合适的payload即可执行XSS。

通用型XSS和突变型XSS就不讲了。

0x05 防御XSS攻击

XSS 攻击有两大要素: 1. 攻击者提交恶意代码。 2. 浏览器执行恶意代码。

从两点入手,一是对恶意代码的过滤,二是对代码运行的调控。

HTML转义

这是非常常用的一个方法。

前后端都进行过滤

后端一定要进行过滤,因为前端过滤是可以越过的。

慎用JavaScript函数

在使用 .innerHTML、.outerHTML、document.write() 时要特别小心,不要把不可信的数据作为 HTML 插到页面上,而应尽量使用 .textContent、.setAttribute() 等。