浅析各类型XSS原理
0x00 前言
把CTFHub技能树的XSS题目刷完了,也觉得需要对XSS有原理上的了解。本质学习有以下目标:
- 各种类型的XSS的原理
- 各种类型的XSS的异同
- XSS的防范措施
推荐文章:这一次,彻底理解XSS攻击-腾讯云开发者社区-腾讯云 (tencent.com)
0x01 概述
XSS(Cross-site scripting)
,跨站脚本攻击。
攻击原理:前端被插入精心构造的恶意代码,以实现攻击者的目的。从本质上来看,这样的输入流不再是纯净的数据流,可以影响到控制流。
攻击手段:一般是
JavaScript
,还有Java
、VBScript
、LiveScript
、ActiveX
、Flash
甚至是普通的HTML
。XSS类型:反射型(非持久型)XSS、存储型(持久型)XSS、DOM型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 | <html> |
通过合适的payload即可执行XSS。
通用型XSS和突变型XSS就不讲了。
0x05 防御XSS攻击
XSS 攻击有两大要素: 1. 攻击者提交恶意代码。 2. 浏览器执行恶意代码。
从两点入手,一是对恶意代码的过滤,二是对代码运行的调控。
HTML转义
这是非常常用的一个方法。
前后端都进行过滤
后端一定要进行过滤,因为前端过滤是可以越过的。
慎用JavaScript函数
在使用
.innerHTML、.outerHTML、document.write()
时要特别小心,不要把不可信的数据作为 HTML 插到页面上,而应尽量使用.textContent、.setAttribute()
等。