web安全 - XSS漏洞

209 阅读2分钟

跨站脚本攻击XSSCross Site Scripting),是最常见的Web应用程序安全漏洞之一。它是指攻击者在网页中嵌入客户端脚本(通常是Javascript脚本),当用户使用浏览器浏览被嵌入恶意代码的网页时,恶意代码将会在用户的浏览器上执行。

XSS主要分为三种类型:

反射型XSS

攻击者通过将恶意脚本嵌入到URL或请求参数中,当用户点击链接时,恶意脚本被“反射”回浏览器执行。

工作原理

  1. 攻击者构造一个包含恶意脚本的URL,诱使用户点击链接。
  2. 服务器在收到请求后,将请求参数反射到响应页面中。
  3. 浏览器在加载页面时执行这个恶意脚本。攻击者可以通过该脚本获取用户信息、会话数据(CookieSession)等等。

如下图所示:

xss-reflection.gif

防止方法

  • 对用户输入数据进行严格校验。
  • 将回显到页面的内容进行HTML转义。
  • 使用HTTPOnly和Secure标志,防止Cookie被劫持。
  • 配置CSP(Content Security Policy),限制页面能执行的脚本来源.

存储型XSS

是一种比反射型更危险的XSS攻击形式,恶意脚本被永久存储在服务器,导致它在多个用户访问相同资源时被反复执行。

工作原理

  1. 攻击者通过可编辑的输入框提交恶意代码,被服务器接收并存储。
  2. 用户访问页面时(比如查看评论区),恶意代码被读取并响应给浏览器。
  3. 浏览器执行脚本,导致用户会话信息被窃取或者执行某些恶意操作。

如下图所示:

xss-storage.gif

防止方法

  • 对用户输入进行严格验证。
  • 将用户输入数据输出到网页时,进行转义或编码,以防被浏览器将输入当成脚本执行。
  • WAF可以检测并拦截常见的XSS攻击模式,减少XSS攻击的发生。
  • 配置CSP来限制页面允许加载和执行的脚本来源,防止从不信任的来源加载恶意脚本。
  • 定期对网站进行安全审计和漏洞扫描,及时发现和修复XSS漏洞。

DOM型XSS

攻击者利用JavaScript操作DOM,将恶意脚本注入页面并执行。它只发生在客户端处理数据阶段。

示例

<!DOCTYPE html>
<html lang="zh-CN">
<head>
  <meta charset="utf-8">
  <title>DOM型XSS</title>
</head>
<body>
  <p id="content"></p>

  <script>
      const urlParams = new URLSearchParams(window.location.search);
      document.getElementById('content').innerHTML = urlParams.get('content');
  </script>
</body>
</html>

上述代码的意思是获取URL中查询参数,并输出到页面。当攻击者构造如下恶意URL时,就会产生XSS攻击:

http://localhost:5500/XSS/demo3.html?content=<iframe src="javascript:alert('Boom!!!')"></iframe>

如下图所示:

xsss-dom.gif

防止方法

  • 使用textContent代替innnerHTML。
  • 对用户输入进行严格校验。
  • 避免使用eval。
  • 启用CSP,阻止非可信的脚本执行。