从0到1完全掌握 XSS

2026-01-16 08:16:27

博客地址:https://drun1baby.github.io/

从0到1完全掌握 XSS文章篇幅较长,建议分块观看学习。

0x01 前言本人二刷 XSS,在一刷的时候是以漏洞挖掘与漏洞利用为主,实际上完全对于实战根本没有概念,出去工作一段时间之后才算是拿出来应用。写这篇文章是打算再好好地梳理一遍 XSS。

XSS 的本质是一种高级钓鱼手法。

0x02 什么是 XSSXSS (Cross Site Scripting) 攻击全称跨站脚本攻击,是为不和层叠样式表 (Cascading Style Sheets, CSS) 的缩写混淆,故将跨站脚本攻击缩写为 XSS。XSS 是一种经常出现在 Web 应用中的计算机安全漏洞,它允许恶意 Web 用户将代码植入到提供给其它用户使用的页面中。

XSS 的运行原理是将恶意的 script 脚本插入进 html/css/js 文件当中。代码长这样。

0x03 XSS 的危害前文我们说 XSS 本质上来说是一种钓鱼攻击,所以 XSS 的危害角度上也是以钓鱼能够造成的危害为主。

0x04 XSS 简单应用场景举例这里我想先介绍 XSS 的应用方法,如此一来讲起来不会太空洞,也能与下面的攻击手段有所呼应。以反射型 XSS 为例,原理图如下。

这里借用国光师傅的图片进行分析

这是一个恶意的 QQ 空间钓鱼网站,我们在输入框内输入username%20,再对登陆的按钮设置一个 href 到真正的 QQ 空间官网。然而当时用户输入的用户名密码已经被攻击者窃取了。

0x05 XSS 基本攻击手段XSS 根据效果不同主要分为三种类型

反射型 XSS,存储型 XSS,DOM 型 XSS

危害性来说,存储型 XSS >> 反射型 XSS ~= DOM 型 XSS我们接下来细讲一下这三种 XSS 的攻击手段。

1. 反射型 XSS 及绕过手段(1) 什么是反射型 XSS反射型 XSS,也叫非持久型 XSS,转瞬即逝。

利用比较简单,比如在搜索框中,我记得当时 2020 年,b 站的搜索框还是存在 XSS 的,现在没有了。

反射型 XSS 的 Payload 如下

&token=;script-src-elem 'unsafe-inline'

我们使用script-src-elem对 CSP 进行覆盖,从而进行 XSS 攻击。

2. 存储型 XSS存储型 XSS 是危害性最大的 XSS 了,它一般出现于评论留言功能处,大致的利用方法与绕过手段与反射型 XSS 很像,原理图如下。

如果执行起来也是插入进上下文标签当中,和之前反射型 XSS 的代码图类似,都是没有加任何的过滤手段,如图。

我们在新增的评论中将 username 构造成 Payload

username=

而这一条评论,又会被保存到数组或者是数据库当中(这个看 Web 程序的设计),就造成了存储型 XSS。

绕过手段不再逼逼,和反射型 XSS 是异曲同工。

3. DOM 型 XSS(重点!)DOM 型的 XSS 是基于文档对象模型 Document Objeet Model,DOM)的一种漏洞。说白了就是那些标签,比如img,input等这种类型的 DOM 节点标签而已,而 DOM 型 XSS 打的就是这些。

我个人觉得 DOM 型 XSS 与反射型,存储型 XSS 的区别可谓不是一点半点,虽然有人把 DOM 型 XSS 归结到反射型 XSS 当中,但是我们看下去,会感受到些许不同。

DOM 型 XSS 全部都是由前端进行触发的。所以我们平常如果挖洞,还是很考验代码审计的耐心的。

我们下面讲几种常见的攻击方式,在这之前,我们先把可以利用的 DOM 节点,以及其 Payload 拉出来。Payload 摘自HACK 师傅的文章

一些常用的标签与属性下面我列举的标签大部分是可以自动触发 js 代码的,无需用户去交互,大部分情况下我们也是希望是自动触发而不是等用户去触发。

scirpt 标签

img 标签标签定义 HTML 页面中的图像。

input 标签标签规定了用户可以在其中输入数据的输入字段。onfocus 事件在对象获得焦点时发生:

竞争焦点,从而触发 onblur 事件:

input 标签的 autofocus 属性规定当页面加载时元素应该自动获得焦点。可以通过 autofocus 属性自动执行本身的 focus 事件,这个向量是使焦点自动跳到输入元素上,触发焦点事件,无需用户去触发:

details 标签

标签通过提供用户开启关闭的交互式控件,规定了用户可见的或者隐藏的需求的补充细节。ontoggle 事件规定了在用户打开或关闭
元素时触发:

使用details 标签的 open 属性触发ontoggle事件,无需用户去点击即可触发:

svg 标签标签用来在HTML页面中直接嵌入SVG 文件的代码。

select 标签

通过autofocus属性规定当页面加载时元素应该自动获得焦点,这个向量是使焦点自动跳到输入元素上,触发焦点事件,无需用户去触发:

textarea 标签