目录
引言
一、XSS 攻击简介
二、XSS 攻击类型
1.反射型 XSS
2.存储型 XSS
3.基于 DOM 的 XSS
4.Self - XSS
三、XSS 攻击技巧
1.基本变形
2.事件处理程序
3.JS 伪协议
4.编码绕过
5.绕过长度限制
6.使用标签
四、XSS 攻击工具与平台
1.XSS 攻击平台
2.BEEF
五、XSS 相关案例 - XSS 蠕虫
六、XSS 防御方法
1.输入输出过滤
2.HttpOnly Cookie
3.内容安全策略(CSP)
4.验证输入数据类型和格式
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 漏洞:
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 $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 示例:
<!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’)” 编码为 “”,部分仅检测明文恶意代码的过滤系统可能无法识别。
<!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 事件,执行恶意脚本。
<!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”,用户点击后会弹出警告框。
<!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 实体编码等,绕过只检测明文恶意代码的过滤系统,在浏览器解析时还原执行。如将 “<” 编码为 “<”,“>” 编码为 “>”。
<!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 变量存储,再进行拼接执行。
<!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>标签可用于在当前页面嵌入其他网页内容。攻击者会精心构造恶意链接,当用户点击后,页面会嵌入包含恶意脚本的网页。比如:
<iframe src="http://恶意网站.com/恶意脚本页面.html"></iframe>在此示例里,恶意网站的页面可能含有窃取用户信息的脚本,一旦用户加载了包含此<iframe>的页面,恶意脚本便会在用户浏览器中执行。
<object>标签主要用于在 HTML 页面中嵌入外部对象,像 Flash 文件、PDF 文件等。攻击者会制作带有恶意脚本的特殊文件,借助<object>标签嵌入到目标页面。例如:
<object data="恶意文件.swf" type="application/x-shockwave-flash"></object>倘若这个恶意文件.swf文件中藏有恶意脚本,当用户访问包含该<object>标签的页面时,恶意脚本就会被触发执行。
<embed>标签同样能嵌入外部内容,常被用于嵌入多媒体文件、插件等。攻击者会利用它来嵌入恶意的多媒体文件,这些文件可能在播放或加载过程中执行恶意脚本。示例如下:
<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 中,可以使用正则表达式过滤恶意脚本,示例如下:
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 属性:
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 进行验证:
function validateNumber(input) { return!isNaN(parseFloat(input)) && isFinite(input); }5.JavaScript 框架与 XSS
5.1-jQuery
jQuery 是广泛使用的 JavaScript 框架,本身设计较为安全。但在实际应用中,若开发人员使用不当,如在使用 html ()、text () 等方法将用户输入内容插入到 DOM 中时,未对输入进行安全过滤,就可能引入 XSS 漏洞。例如:
$(document).ready(function() { $('.element').html(userInput); });5.2-Vue.js
Vue.js 通过数据绑定和组件化开发提高了开发效率。但在数据绑定过程中,如果不对用户输入的数据进行安全处理,也可能导致 XSS。例如,在模板中直接使用未过滤的用户数据:
<template> <div>{{ userData }}</div> </template>5.3-AngularJS
AngularJS 以强大的双向数据绑定和依赖注入等功能著称。但在处理用户输入和动态生成 HTML 内容时,如果缺乏安全验证,容易产生 XSS 漏洞。例如,在使用 ng-bind-html 指令绑定 HTML 内容时:
<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 攻击,营造安全可靠的网络环境。
网络安全学习路线&学习资源![]()
网络安全的知识多而杂,怎么科学合理安排?
下面给大家总结了一套适用于网安零基础的学习路线,应届生和转行人员都适用,学完保底6k!就算你底子差,如果能趁着网安良好的发展势头不断学习,日后跳槽大厂、拿到百万年薪也不是不可能!
初级网工
1、网络安全理论知识(2天)
①了解行业相关背景,前景,确定发展方向。
②学习网络安全相关法律法规。
③网络安全运营的概念。
④等保简介、等保规定、流程和规范。(非常重要)
2、渗透测试基础(一周)
①渗透测试的流程、分类、标准
②信息收集技术:主动/被动信息搜集、Nmap工具、Google Hacking
③漏洞扫描、漏洞利用、原理,利用方法、工具(MSF)、绕过IDS和反病毒侦察
④主机攻防演练:MS17-010、MS08-067、MS10-046、MS12-20等
3、操作系统基础(一周)
①Windows系统常见功能和命令
②Kali Linux系统常见功能和命令
③操作系统安全(系统入侵排查/系统加固基础)
4、计算机网络基础(一周)
①计算机网络基础、协议和架构
②网络通信原理、OSI模型、数据转发流程
③常见协议解析(HTTP、TCP/IP、ARP等)
④网络攻击技术与网络安全防御技术
⑤Web漏洞原理与防御:主动/被动攻击、DDOS攻击、CVE漏洞复现
5、数据库基础操作(2天)
①数据库基础
②SQL语言基础
③数据库安全加固
6、Web渗透(1周)
①HTML、CSS和JavaScript简介
②OWASP Top10
③Web漏洞扫描工具
④Web渗透工具:Nmap、BurpSuite、SQLMap、其他(菜刀、漏扫等)
恭喜你,如果学到这里,你基本可以从事一份网络安全相关的工作,比如渗透测试、Web 渗透、安全服务、安全分析等岗位;如果等保模块学的好,还可以从事等保工程师。薪资区间6k-15k
到此为止,大概1个月的时间。你已经成为了一名“脚本小子”。那么你还想往下探索吗?
【“脚本小子”成长进阶资源领取】
7、脚本编程(初级/中级/高级)
在网络安全领域。是否具备编程能力是“脚本小子”和真正黑客的本质区别。在实际的渗透测试过程中,面对复杂多变的网络环境,当常用工具不能满足实际需求的时候,往往需要对现有工具进行扩展,或者编写符合我们要求的工具、自动化脚本,这个时候就需要具备一定的编程能力。在分秒必争的CTF竞赛中,想要高效地使用自制的脚本工具来实现各种目的,更是需要拥有编程能力.
零基础入门,建议选择脚本语言Python/PHP/Go/Java中的一种,对常用库进行编程学习; 搭建开发环境和选择IDE,PHP环境推荐Wamp和XAMPP, IDE强烈推荐Sublime; ·Python编程学习,学习内容包含:语法、正则、文件、 网络、多线程等常用库,推荐《Python核心编程》,不要看完; ·用Python编写漏洞的exp,然后写一个简单的网络爬虫; ·PHP基本语法学习并书写一个简单的博客系统; 熟悉MVC架构,并试着学习一个PHP框架或者Python框架 (可选); ·了解Bootstrap的布局或者CSS。
8、超级网工
这部分内容对零基础的同学来说还比较遥远,就不展开细说了,贴一个大概的路线。感兴趣的童鞋可以研究一下,不懂得地方可以【点这里】加我耗油,跟我学习交流一下。
网络安全工程师企业级学习路线
如图片过大被平台压缩导致看不清的话,可以【点这里】加我耗油发给你,大家也可以一起学习交流一下。
一些我自己买的、其他平台白嫖不到的视频教程:
需要的话可以扫描下方卡片加我耗油发给你(都是无偿分享的),大家也可以一起学习交流一下。
网络安全学习路线&学习资源![]()
结语
网络安全产业就像一个江湖,各色人等聚集。相对于欧美国家基础扎实(懂加密、会防护、能挖洞、擅工程)的众多名门正派,我国的人才更多的属于旁门左道(很多白帽子可能会不服气),因此在未来的人才培养和建设上,需要调整结构,鼓励更多的人去做“正向”的、结合“业务”与“数据”、“自动化”的“体系、建设”,才能解人才之渴,真正的为社会全面互联网化提供安全保障。
特别声明:
此教程为纯技术分享!本书的目的决不是为那些怀有不良动机的人提供及技术支持!也不承担因为技术被滥用所产生的连带责任!本书的目的在于最大限度地唤醒大家对网络安全的重视,并采取相应的安全措施,从而减少由网络安全而带来的经济损失!!!