目录
[一、XSS 攻击简介](#一、XSS 攻击简介)
[二、XSS 攻击类型](#二、XSS 攻击类型)
[1.反射型 XSS](#1.反射型 XSS)
[2.存储型 XSS](#2.存储型 XSS)
[3.基于 DOM 的 XSS](#3.基于 DOM 的 XSS)
[4.Self - XSS](#4.Self - XSS)
[三、XSS 攻击技巧](#三、XSS 攻击技巧)
[3.JS 伪协议](#3.JS 伪协议)
[四、XSS 攻击工具与平台](#四、XSS 攻击工具与平台)
[1.XSS 攻击平台](#1.XSS 攻击平台)
[五、XSS 相关案例 - XSS 蠕虫](#五、XSS 相关案例 - XSS 蠕虫)
[六、XSS 防御方法](#六、XSS 防御方法)
[2.HttpOnly Cookie](#2.HttpOnly Cookie)
[5.JavaScript 框架与 XSS](#5.JavaScript 框架与 XSS)
引言
在当今数字化时代,网络应用与人们的生活、工作深度融合,Web安全的重要性愈发凸显。XSS攻击,作为Web安全领域中极为常见且危害巨大的漏洞类型,正悄然威胁着每一位网络用户和网站运营者。你是否曾想过,当你在浏览网页、登录账户、输入信息时,背后可能隐藏着怎样的风险?看似平常的操作,或许正被恶意攻击者利用XSS漏洞窥探隐私、窃取数据。从电商平台用户账号被盗刷,到社交网站个人信息泄露,XSS攻击的阴影无处不在。本文将带你深入了解XSS攻击的方方面面,从攻击类型、技巧,到实际案例和防御方法,为你揭开这一网络安全威胁的神秘面纱,帮助你筑牢网络安全防线。
一、XSS 攻击简介
XSS ,即跨站脚本攻击 ,是 Web 安全领域中十分常见的漏洞类型。攻击者通过在 Web 页面中注入恶意脚本,当用户浏览该页面时,恶意脚本便会在用户的浏览器中执行。借助这种攻击方式,攻击者能够窃取用户的敏感信息,如登录凭证、个人隐私数据 等;劫持用户会话 ,以用户身份进行各种操作;甚至篡改网站内容 ,严重损害网站的声誉和用户信任。举例来说,某电商网站若存在 XSS 漏洞,攻击者可通过注入恶意脚本,窃取用户的账号密码,进而盗刷用户的账户资金,给用户带来直接的经济损失。
二、XSS 攻击类型
1.反射型 XSS
反射型 XSS 攻击的脚本通常存在于URL 中,服务器在接收到请求后,会直接将包含恶意脚本的内容返回给浏览器执行。这种攻击属于非持久性攻击 ,一般是攻击者通过诱骗用户点击包含恶意脚本的链接来实施攻击。例如,攻击者构造链接 "http://example.com/search?query=alert('XSS')",当用户点击该链接时,服务器将恶意脚本反射回浏览器,进而执行弹窗操作。下面是一个简单的 Python Flask 示例,展示反射型 XSS 漏洞:
python
from flask import Flask, request
app = Flask(__name__)
@app.route('/search')
def search():
query = request.args.get('query')
return f'<html><body>{query}</body></html>'
if __name__ == '__main__':
app.run(debug=True)
2.存储型 XSS
存储型 XSS 攻击会将恶意脚本存储在服务器端,比如数据库 中。当其他用户访问包含该恶意脚本的页面时,脚本就会被加载并执行,这是一种持久性攻击 ,危害较大。以留言板功能为例,攻击者在留言内容中插入恶意脚本,如 "alert('Stored XSS')",后续访问留言板的用户都会触发该脚本。以下是 PHP 实现的存在存储型 XSS 漏洞的留言板代码:
php
<?php
$conn = mysqli_connect("localhost", "root", "", "testdb");
if (isset($_POST['message'])) {
$message = $_POST['message'];
$sql = "INSERT INTO messages (content) VALUES ('$message')";
mysqli_query($conn, $sql);
}
$sql = "SELECT * FROM messages";
$result = mysqli_query($conn, $sql);
while ($row = mysqli_fetch_assoc($result)) {
echo $row['content'];
}
mysqli_close($conn);
?>
3.基于 DOM 的 XSS
基于DOM 的 XSS 攻击通过修改页面的 DOM 结构来注入恶意脚本,它是从客户端的 JavaScript 代码中执行的,与服务器交互数据没有直接关联。攻击者利用 JavaScript 中对 DOM 对象操作的函数,当这些函数的参数受用户输入影响且未经过严格安全处理时,就可能引发漏洞。比如,当页面中有代码 "document.getElementById ('target').innerHTML = userInput;",若 userInput 被攻击者控制并输入恶意脚本 "alert('XSS')",页面在执行这段代码时就会弹出警告框,实现 XSS 攻击。下面是一个 HTML 和 JavaScript 示例:
javascript
<!DOCTYPE html>
<html>
<head>
<title>DOM - XSS Example</title>
</head>
<body>
<input type="text" id="input" />
<button onclick="updateContent()">Submit</button>
<div id="target"></div>
<script>
function updateContent() {
var input = document.getElementById('input').value;
document.getElementById('target').innerHTML = input;
}
</script>
</body>
</html>
4.Self - XSS
Self - XSS 是指用户自己将恶意脚本输入到应用程序中,通常是由于用户自身安全意识不足导致的,并非攻击者直接注入。例如,用户为了实现某些特定效果,在应用允许的输入框中输入恶意脚本,从而触发 XSS 攻击。
三、XSS 攻击技巧
1.基本变形
攻击者会对恶意脚本进行编码变形 ,如使用Unicode 编码或特殊字符 ,以绕过安全过滤机制。例如,将 "alert('XSS')" 编码为 "<script>alert ('XSS')</script>",部分仅检测明文恶意代码的过滤系统可能无法识别。
html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>基本变形 XSS 示例</title>
</head>
<body>
<!-- 正常的恶意脚本 -->
<script>alert('XSS')</script>
<!-- 经过 Unicode 编码变形后的脚本 -->
<script>
// 将 Unicode 编码的脚本进行解码并执行
const encodedScript = '\u003c\u0073\u0063\u0072\u0069\u0070\u0074\u003e\u0061\u006c\u0065\u0072\u0074\u0028\u0027\u0058\u0053\u0053\u0027\u0029\u003c\u002f\u0073\u0063\u0072\u0069\u0070\u0074\u003e';
const decodedScript = unescape(encodedScript.replace(/\\u/g, '%u'));
const scriptElement = document.createElement('script');
scriptElement.innerHTML = decodedScript;
document.body.appendChild(scriptElement);
</script>
</body>
</html>
2.事件处理程序
利用 HTML 元素的onclick、onmouseover 等事件属性,当用户触发相应事件时,执行恶意代码。例如,在 "" 中,当图片无法加载时,就会触发 onerror 事件,执行恶意脚本。
html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>事件处理程序 XSS 示例</title>
</head>
<body>
<!-- 当图片无法加载时,触发 onerror 事件执行恶意脚本 -->
<img src="nonexistent.jpg" onerror="alert('XSS')">
<!-- 鼠标悬停时触发 onmouseover 事件执行恶意脚本 -->
<div onmouseover="alert('XSS')">鼠标悬停此处</div>
</body>
</html>
3.JS 伪协议
通过 "javascript:" 伪协议在 URL 中嵌入 JavaScript 代码,当用户点击链接时,恶意脚本就会执行。例如,链接 "Click me",用户点击后会弹出警告框。
html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>JS 伪协议 XSS 示例</title>
</head>
<body>
<!-- 点击链接执行 JavaScript 代码 -->
<a href="javascript:alert('XSS')">Click me</a>
</body>
</html>
4.编码绕过
将恶意脚本进行Unicode 编码、HTML 实体编码等,绕过只检测明文恶意代码的过滤系统,在浏览器解析时还原执行。如将 "<" 编码为 "<",">" 编码为 ">"。
html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>编码绕过 XSS 示例</title>
</head>
<body>
<!-- 经过 HTML 实体编码的脚本 -->
<script>
const encoded = '<script>alert(\'XSS\')</script>';
const decoded = document.createElement('div');
decoded.innerHTML = encoded;
const script = decoded.firstChild;
document.body.appendChild(script);
</script>
</body>
</html>
5.绕过长度限制
攻击者会把长 Payload 分割成短片段 ,在页面中进行拼接;或者利用 window.name 属性跨页面传递长 Payload。例如,将恶意脚本拆分成多个部分,通过多个 JavaScript 变量存储,再进行拼接执行。
html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>绕过长度限制 XSS 示例</title>
</head>
<body>
<script>
// 长 Payload 分割成短片段
const part1 = 'alert(';
const part2 = '\'XSS\'';
const part3 = ');';
const fullPayload = part1 + part2 + part3;
const scriptElement = document.createElement('script');
scriptElement.innerHTML = fullPayload;
document.body.appendChild(scriptElement);
// 利用 window.name 属性跨页面传递长 Payload
// 页面 1:设置 window.name
// window.name = 'alert(\'XSS from window.name\');';
// 页面 2:获取并执行 window.name 中的 Payload
const payloadFromWindowName = window.name;
const scriptFromWindowName = document.createElement('script');
scriptFromWindowName.innerHTML = payloadFromWindowName;
document.body.appendChild(scriptFromWindowName);
</script>
</body>
</html>
6.使用标签
在 XSS 攻击中,攻击者常常巧妙利用各种 HTML 标签来达成恶意目的。许多 HTML 标签本身具备特殊功能,若被攻击者利用,就能注入恶意脚本,进而在用户浏览器中执行。
<iframe>
标签可用于在当前页面嵌入其他网页内容。攻击者会精心构造恶意链接,当用户点击后,页面会嵌入包含恶意脚本的网页。比如:
html
<iframe src="http://恶意网站.com/恶意脚本页面.html"></iframe>
在此示例里,恶意网站的页面可能含有窃取用户信息的脚本,一旦用户加载了包含此<iframe>
的页面,恶意脚本便会在用户浏览器中执行。
<object>
标签主要用于在 HTML 页面中嵌入外部对象,像 Flash 文件、PDF 文件等。攻击者会制作带有恶意脚本的特殊文件,借助<object>
标签嵌入到目标页面。例如:
html
<object data="恶意文件.swf" type="application/x-shockwave-flash"></object>
倘若这个恶意文件.swf
文件中藏有恶意脚本,当用户访问包含该<object>
标签的页面时,恶意脚本就会被触发执行。
<embed>
标签同样能嵌入外部内容,常被用于嵌入多媒体文件、插件等。攻击者会利用它来嵌入恶意的多媒体文件,这些文件可能在播放或加载过程中执行恶意脚本。示例如下:
html
<embed src="恶意音频.mp3" type="audio/mpeg">
尽管 MP3 音频文件通常用于音频播放,但如果攻击者对其进行特殊处理,在文件中隐藏恶意脚本代码,当用户的浏览器尝试加载并解析这个音频文件时,恶意脚本就可能会被执行。
通过利用这些标签,攻击者增加了 XSS 攻击的多样性和隐蔽性,使得检测和防范工作变得更加困难。因此,开发者在处理用户输入和嵌入外部内容时,必须格外谨慎,进行严格的输入验证和安全检查,以防止被此类攻击手段利用。
四、XSS 攻击工具与平台
1.XSS 攻击平台
研究人员将多种功能封装到 XSS 攻击平台中,这些平台具备获取浏览器和计算机信息、钓鱼攻击等功能。攻击者可以通过这些平台更高效地实施 XSS 攻击,并收集攻击成果。
2.BEEF
BEEF 是一款强大的 XSS 攻击辅助平台,它能够与浏览器进行交互,注入脚本获取敏感数据,控制浏览器操作。BEEF 内置 Web 界面,方便攻击者进行操作和管理。
五、XSS 相关案例 - XSS 蠕虫
以 Samy 蠕虫为例,其利用 MySpace 网站的 XSS 漏洞进行传播,在短时间内造成了广泛的影响。Samy 蠕虫通过在用户的个人资料页面中注入恶意脚本,当其他用户访问该页面时,脚本会自动将蠕虫代码复制到他们的个人资料页面,从而实现快速传播。
六、XSS 防御方法
1.输入输出过滤
对用户输入数据进行严格过滤,转义或去除特殊字符,防止恶意脚本注入。同时,对输出数据也进行检查和转义,确保不会在页面中执行恶意脚本。在 Python 中,可以使用正则表达式过滤恶意脚本,示例如下:
python
import re
def filter_xss(input_str):
return re.sub(r'<script.*?>.*?</script>', '', input_str, flags=re.DOTALL)
2.HttpOnly Cookie
设置Cookie 的 HttpOnly 属性,使 JavaScript 无法访问该 Cookie,防止 Cookie 被窃取,降低会话劫持的风险。在 PHP 中,可以使用 setcookie 函数设置 HttpOnly 属性:
php
setcookie("session_id", "123456", time() + 3600, "/", "example.com", false, true);
3.内容安全策略(CSP)
配置CSP 策略 ,限制页面加载资源的来源,阻止恶意脚本的执行。可以通过 HTTP 响应头 "Content-Security-Policy" 或 HTML 的 "" 标签来设置。例如,设置 "Content-Security-Policy: script-src'self'",表示只允许从当前域名加载脚本。
4.验证输入数据类型和格式
确保用户输入的数据符合预期的类型和格式,防止攻击者利用非预期的数据格式进行攻击。例如,对于一个要求输入数字的字段,使用 JavaScript 进行验证:
javascript
function validateNumber(input) {
return!isNaN(parseFloat(input)) && isFinite(input);
}
5.JavaScript 框架与 XSS
5.1-jQuery
jQuery 是广泛使用的 JavaScript 框架,本身设计较为安全。但在实际应用中,若开发人员使用不当,如在使用 html ()、text () 等方法将用户输入内容插入到 DOM 中时,未对输入进行安全过滤,就可能引入 XSS 漏洞。例如:
javascript
$(document).ready(function() {
$('.element').html(userInput);
});
5.2-Vue.js
Vue.js 通过数据绑定和组件化开发提高了开发效率。但在数据绑定过程中,如果不对用户输入的数据进行安全处理,也可能导致 XSS。例如,在模板中直接使用未过滤的用户数据:
javascript
<template>
<div>{{ userData }}</div>
</template>
5.3-AngularJS
AngularJS 以强大的双向数据绑定和依赖注入等功能著称。但在处理用户输入和动态生成 HTML 内容时,如果缺乏安全验证,容易产生 XSS 漏洞。例如,在使用 ng-bind-html 指令绑定 HTML 内容时:
javascript
<div ng-bind-html="htmlContent"></div>
6.富文本与安全问题
6.1-富文本的风险
富文本内容通常包含 HTML 标签和可能的 JavaScript 代码,具有较高的安全风险。如果对富文本内容处理不当,攻击者可以在其中插入恶意脚本,当其他用户浏览这些内容时,脚本就会被执行,从而导致 XSS 攻击。
6.2-处理方法
可以使用安全的富文本编辑器,这些编辑器会对用户输入的内容进行过滤和净化,只允许特定的、安全的 HTML 标签和属性存在,去除可能包含恶意脚本的代码。另外,对富文本内容进行输出转义也是必要的,确保在展示时不会执行潜在的恶意脚本。
7.旧版浏览器的安全隐患
旧版本的IE 浏览器 存在一些安全缺陷,例如在处理 "Content-Type" 头信息时可能出现误判,将本应作为普通文本处理的内容错误地解析为脚本并执行,这就为 XSS 攻击提供了可乘之机。此外,旧版浏览器对一些安全特性的支持不完善,相比新版本浏览器,更容易受到 XSS 等攻击的影响。因此,建议用户及时升级浏览器版本,开发者在开发过程中,若需要支持旧版浏览器,要格外注意采取额外的安全防护措施。
小结
跨站脚本攻击(XSS) 严重威胁着 Web 应用的安全,攻击者借助多种类型的 XSS 攻击和丰富的攻击技巧,试图窃取用户信息、劫持会话,对用户和网站造成极大危害。为了有效防范 XSS 攻击,我们需要从多个层面入手。
在编码阶段 ,对用户输入和输出进行严格的过滤和转义,验证数据类型和格式;在部署阶段 ,合理配置 HttpOnly Cookie 和内容安全策略(CSP),借助 XSS Filter 等工具进行防护;在使用 JavaScript 框架 时,遵循安全规范,防止因框架使用不当引入漏洞;对于富文本内容 ,采用安全的编辑器并进行输出转义。同时,要关注浏览器的版本更新,及时升级以避免旧版浏览器的安全隐患。只有构建全方位、多层次的安全防护体系,持续提升安全意识,才能有效抵御 XSS 攻击,营造安全可靠的网络环境。
喜欢就点点赞和关注评论一起进步呗