XSS漏洞的原理利用防御

  网络渗透测试     |      2026-06-17 23:55

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

二、什么是 XSS

XSS (Cross Site Scripting) 攻击全称跨站脚本攻击,是为不和层叠样式表 (Cascading Style Sheets, CSS) 的缩写混淆,故将跨站脚本攻击缩写为 XSS。

XSS 是一种经常出现在 Web 应用中的计算机安全漏洞,它允许恶意 Web 用户将代码植入到提供给其它用户使用的页面中。

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

三、XSS 的危害

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

四、XSS 简单应用场景举例

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

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

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

五、XSS 基本攻击手段

XSS 根据效果不同主要分为三种类型

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

危害性来说,存储型 XSS >> 反射型 XSS ~= DOM 型 XSS

我们接下来细讲一下这三种 XSS 的攻击手段。

(一) 反射型 XSS 及绕过手段 什么是反射型 XSS

反射型 XSS,也叫非持久型 XSS,转瞬即逝。

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

反射型 XSS 的 Payload 如下:

<script>alert(1)</script>

效果如图所示:

绕过 当大多数标签被禁止时的绕过

Lab: Reflected XSS into HTML context with most tags and attributes blocked

还是常规的 Fuzz 测试,在尝试 XSS 攻击之后,若失败了就进行 Fuzz 测试,因为无法排除是不是 WAF 过滤了部分关键字。

探测出来 onresize 标签还是有效的,我们可以通过这一串 Payload 唤起打印服务:

<body onresize=print()>" onload=this.style.width='100px'>

当事件处理器与 href 被禁用时的绕过

老样子还是需要 Fuzz 的。如果渗透测试真正遇到这种情况的话,svg标签的绕过方式还是主流。

Lab: Reflected XSS with event handlers and href attributes blocked

Payload:

<svg> <a> <animateattributeName=href values=javascript:alert(1) /> <textx=20y=20>Click me</text> </a>

还有一些svg标签的绕过手段:

<svg><animatetransform onbegin=alert(1)> 对 script 进行闭合后构造 Payload

对某些语句中的符号进行闭合。

有些 Web 后端代码会通过反斜杠转义,对很多单引号字符进行过滤,那么转义之后的代码就不能进行原 Payload 的作用。

XSS Insert Into-> JavaScript

这种 Payload 可以是通过修改 Web 网站内部 JavaScript 来实现的,因为 JavaScript 本身就可以直接执行 alert 方法,无需使用<script>标签。

一般的 Payload:

'-alert(document.domain)-' ';alert(document.domain)// 绕过 CSP 攻击

CSP:content security policy,比较严格的防御 XSS 手段。

它一般在 HTTP 包里面长这样

CSP通过这样的指令限制只能加载与页面本身相同来源的资源:script-src 'self'

通过指令限制只能从指定域中加载资源:script-src <https://scripts.normal-website.com>

但是这种允许外部域的做法还是有风险的,如果攻击者可以向其传递恶意脚本也会遭到攻击的。而且应该也同时不信任来自 CDN 的资源,因为也有被投放的风险。CSP 还通过随机数和哈希值来指定可信资源。

CSP 的指令指定一个随机数,加载脚本的标签也必须有相同的随机数。否则就不执行该脚本。并秉持一次性的原则,避免被猜解。

CSP 指令可以指定脚本内容的哈希值。不匹配也是不会执行的。

绕过方式一:悬空标记攻击

这种和闭合语句的攻击差不多。

虽然 CSP 通常可以阻止脚本,但是经常不会禁止加载图片资源,这就导致可以利用img标签窃取 CSRF 令牌。