Exploiting DOM clobbering to enable XSS

实验室入口:

实验:利用 DOM 崩溃启用 XSS |网络安全学院

查看页面源码

<script src="/resources/labheader/js/labHeader.js"></script> 的作用是在网页中引入一个名为 labHeader.js 的 JavaScript 文件。这个文件通常用于加载实验室(Lab)或网站的页眉(Header)部分

这个页面看不出什么问题,可以看看这个实验室的有没有子页面。

子页面有评论功能,可以尝试恶意执行语句

<img src=1 οnerrοr=alert(1)>

恶意代码是插入进去了但是onerror属性被删除了

我们查看源码进行分析

在这里有两个js引入

|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| <script src='/resources/js/domPurify-2.0.15.js'></script> 作用是在网页中引入 DOMPurify (版本 2.0.15 )库,这是一个用于 防御 XSS(跨站脚本攻击) 的安全工具。 |
| <script src='/resources/js/loadCommentsWithDomClobbering.js'></script> 作用是加载一个名为 loadCommentsWithDomClobbering.js 的 JavaScript 文件,从文件名来看,它可能涉及 动态加载评论 功能,并可能涉及 DOM Clobbering(DOM 冲突/覆盖)相关的逻辑。 |

我们点开查看<script src='/resources/js/loadCommentsWithDomClobbering.js'></script>的js源码进行查看。对代码进行分析

  • 创建一个 XMLHttpRequest 对象,用于发送 HTTP 请求。

  • 监听请求状态的变化(readyState 变化时触发)。

  • 当请求成功时:this.responseText 获取服务器返回的 JSON 字符串, 将其解析为 JavaScript 对象调用一个display**Comments**函数

  • 浏览器向 postCommentPath + window.location.search发送 GET 请求。

复制代码

对字符串中的特殊 HTML 字符进行转义 ,防止 XSS(跨站脚本攻击)漏洞。它会将 <, >, ', " 等字符转换成对应的 HTML 实体编码,使其在页面上显示为普通文本,而不会被浏览器解析为 HTML 标签或 JavaScript 代码。

javascript 复制代码
 function displayComments(comments) {
        let userComments = document.getElementById("user-comments");

        for (let i = 0; i < comments.length; ++i)
        {
            comment = comments[i];
            let commentSection = document.createElement("section");
            commentSection.setAttribute("class", "comment");

            let firstPElement = document.createElement("p");

            let defaultAvatar = window.defaultAvatar || {avatar: '/resources/images/avatarDefault.svg'}
            let avatarImgHTML = '<img class="avatar" src="' + (comment.avatar ? escapeHTML(comment.avatar) : defaultAvatar.avatar) + '">';

            let divImgContainer = document.createElement("div");
            divImgContainer.innerHTML = avatarImgHTML

            if (comment.author) {
                if (comment.website) {
                    let websiteElement = document.createElement("a");
                    websiteElement.setAttribute("id", "author");
                    websiteElement.setAttribute("href", comment.website);
                    firstPElement.appendChild(websiteElement)
                }

                let newInnerHtml = firstPElement.innerHTML + DOMPurify.sanitize(comment.author)
                firstPElement.innerHTML = newInnerHtml
            }

            if (comment.date) {
                let dateObj = new Date(comment.date)
                let month = '' + (dateObj.getMonth() + 1);
                let day = '' + dateObj.getDate();
                let year = dateObj.getFullYear();

                if (month.length < 2)
                    month = '0' + month;
                if (day.length < 2)
                    day = '0' + day;

                dateStr = [day, month, year].join('-');

                let newInnerHtml = firstPElement.innerHTML + " | " + dateStr
                firstPElement.innerHTML = newInnerHtml
            }

            firstPElement.appendChild(divImgContainer);

            commentSection.appendChild(firstPElement);

            if (comment.body) {
                let commentBodyPElement = document.createElement("p");
                commentBodyPElement.innerHTML = DOMPurify.sanitize(comment.body);

                commentSection.appendChild(commentBodyPElement);
            }
            commentSection.appendChild(document.createElement("p"));

            userComments.appendChild(commentSection);
        }
    }
  • 作用:设置一个默认头像的配置。

    • 首先检查是否有全局定义的头像配置(window.defaultAvatar

    • 如果没有,则使用默认头像路径/resources/images/avatarDefault.svg

    • 确保后续代码总能获得一个包含avatar属性的对象

  • 用途:提供兜底机制,避免因头像缺失导致显示异常。

这一段代码有问题,可以尝试是否可以进行dom破坏通过设置全局变量defaultAvatar,这样就可以对img的地址进行控制尝试写出<img src=1 οnerrοr=alert(1)>

开始实验

想法是第一步将图片地址写入,第二步再引用就可以顺利执行。

<a href="cid:&quot;οnerrοr=alert(1)//" name="avatar" id="defaultAvatar"></a>

但是我发现找不到

原来这是个二层是window.defaultAvatar.avatar这种

就需要二层来锁定

<a id=defaultAvatar><a id=defaultAvatar name=avatar href="cid:&quot;οnerrοr=alert(1)//">

这样就可以将window.defaultAvatar进行定义img的src

然后再写随便写点评论就可以直接调用img直接恶意代码直接执行

开始测试

写进去了

第二步

ok成功

相关推荐
持敬chijing2 分钟前
Web渗透之SQL注入-SQLMAP使用笔记
数据库·sql·安全·web安全·网络安全·网络攻击模型
故渊at4 分钟前
第六板块:Android 安全与权限体系 | 第十九篇:SELinux 强制访问控制与沙箱机制
android·安全·访问控制·selinux·权限体系·沙箱机制
elirlove117 分钟前
图片页面展示技术实践:从数据管理到性能优化再到安全防护
安全·性能优化
Chengbei1142 分钟前
CTF & 红队专用 AI 求解AI 引擎 Cairn 系统,化轻量化部署,红队、CTF、漏洞研究一站式解决方案
java·人工智能·安全·web安全·网络安全·系统安全
KKKlucifer43 分钟前
智能研判、本地运算、一键运维:新一代安全管控产品的三大核心能力
运维·安全
故渊at44 分钟前
第六板块:Android 安全与权限体系 | 第二十篇:应用签名、权限机制与 PackageManagerService 的安全校验
android·安全·权限体系·应用签名
德迅云安全杨德俊1 小时前
游戏盾的原理解析与游戏盾的优势特点
安全·游戏·ddos
terry6001 小时前
2026携号转网查询接口深度测评:技术指标、接入教程与服务商选型
大数据·人工智能·web安全·信息与通信·数据库架构
xhtdj1 小时前
BadHost 漏洞使AI 代理评估器和LLM 网关面临风险
安全
zyplayer-doc1 小时前
zyplayer-doc 文档管理系统深度评测:私有化部署下的安全与智能边界
安全·开源软件