跨站脚本攻击XSS(Cross Site Scripting),是最常见的Web应用程序安全漏洞之一。它是指攻击者在网页中嵌入客户端脚本(通常是Javascript脚本),当用户使用浏览器浏览被嵌入恶意代码的网页时,恶意代码将会在用户的浏览器上执行。
XSS主要分为三种类型:
反射型XSS
攻击者通过将恶意脚本嵌入到URL或请求参数中,当用户点击链接时,恶意脚本被“反射”回浏览器执行。
工作原理
- 攻击者构造一个包含恶意脚本的URL,诱使用户点击链接。
- 服务器在收到请求后,将请求参数反射到响应页面中。
- 浏览器在加载页面时执行这个恶意脚本。攻击者可以通过该脚本获取用户信息、会话数据(Cookie、Session)等等。
如下图所示:
防止方法
- 对用户输入数据进行严格校验。
- 将回显到页面的内容进行HTML转义。
- 使用HTTPOnly和Secure标志,防止Cookie被劫持。
- 配置CSP(Content Security Policy),限制页面能执行的脚本来源.
存储型XSS
是一种比反射型更危险的XSS攻击形式,恶意脚本被永久存储在服务器,导致它在多个用户访问相同资源时被反复执行。
工作原理
- 攻击者通过可编辑的输入框提交恶意代码,被服务器接收并存储。
- 用户访问页面时(比如查看评论区),恶意代码被读取并响应给浏览器。
- 浏览器执行脚本,导致用户会话信息被窃取或者执行某些恶意操作。
如下图所示:
防止方法
- 对用户输入进行严格验证。
- 将用户输入数据输出到网页时,进行转义或编码,以防被浏览器将输入当成脚本执行。
- 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>
如下图所示:
防止方法
- 使用textContent代替innnerHTML。
- 对用户输入进行严格校验。
- 避免使用eval。
- 启用CSP,阻止非可信的脚本执行。