XSS 攻击(详细)

目录

引言

[一、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 攻击技巧)

1.基本变形

2.事件处理程序

[3.JS 伪协议](#3.JS 伪协议)

4.编码绕过

5.绕过长度限制

6.使用标签

[四、XSS 攻击工具与平台](#四、XSS 攻击工具与平台)

[1.XSS 攻击平台](#1.XSS 攻击平台)

2.BEEF

[五、XSS 相关案例 - XSS 蠕虫](#五、XSS 相关案例 - XSS 蠕虫)

[六、XSS 防御方法](#六、XSS 防御方法)

1.输入输出过滤

[2.HttpOnly Cookie](#2.HttpOnly Cookie)

3.内容安全策略(CSP)

4.验证输入数据类型和格式

[5.JavaScript 框架与 XSS](#5.JavaScript 框架与 XSS)

5.1-jQuery

5.2-Vue.js

5.3-AngularJS

6.富文本与安全问题

6.1-富文本的风险

6.2-处理方法

7.旧版浏览器的安全隐患

小结


引言

在当今数字化时代,网络应用与人们的生活、工作深度融合,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 = '&lt;script&gt;alert(\'XSS\')&lt;/script&gt;';
        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)

设置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 攻击,营造安全可靠的网络环境。

喜欢就点点赞和关注评论一起进步呗

相关推荐
zhougl9961 小时前
html处理Base文件流
linux·前端·html
花花鱼1 小时前
node-modules-inspector 可视化node_modules
前端·javascript·vue.js
HBR666_1 小时前
marked库(高效将 Markdown 转换为 HTML 的利器)
前端·markdown
ALe要立志成为web糕手2 小时前
SESSION_UPLOAD_PROGRESS 的利用
python·web安全·网络安全·ctf
careybobo2 小时前
海康摄像头通过Web插件进行预览播放和控制
前端
zhu12893035563 小时前
网络安全的现状与防护措施
网络·安全·web安全
杉之4 小时前
常见前端GET请求以及对应的Spring后端接收接口写法
java·前端·后端·spring·vue
喝拿铁写前端4 小时前
字段聚类,到底有什么用?——从系统混乱到结构认知的第一步
前端
再学一点就睡4 小时前
大文件上传之切片上传以及开发全流程之前端篇
前端·javascript
zhu12893035565 小时前
网络安全与防护策略
网络·安全·web安全