PortSwigger 基于dom的漏洞-利用 DOM 破坏来启用 XSS

2024-03-06 12:12

本文主要是介绍PortSwigger 基于dom的漏洞-利用 DOM 破坏来启用 XSS,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

进入实验随意进入一篇博客

我们可以尝试随意提交一些恶意代码看看会发生什么

很显然我们提交成功了但是我们的恶意代码貌似被过滤了

查看源码发现这里有一个过滤框架
我们打开源码分析
 

function loadComments(postCommentPath) {let xhr = new XMLHttpRequest();xhr.onreadystatechange = function() {if (this.readyState == 4 && this.status == 200) {let comments = JSON.parse(this.responseText);displayComments(comments);}};xhr.open("GET", postCommentPath + window.location.search);xhr.send();function escapeHTML(data) {return data.replace(/[<>'"]/g, function(c){return '&#' + c.charCodeAt(0) + ';';})}
//我们主要分析这里以下的代码上面是通过ajax重新将过滤后的页面展示在前端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 = avatarImgHTMLif (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 + " | " + dateStrfirstPElement.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);}}
};

通过分析我们知道了
对于提交的用户名称以及用户的评论的内容它使用了过滤框架对我们的提交内容做了过滤
对于提交的链接和邮箱它里面有正则对我们的提交的内容进行了限制
怎么办呢?
我们分析代码可以看到它在获取头像和展示头像时没有使用框架进行过滤

这里可以看到它本身是没有defaultAvarat这个值的
我们可以想一想这个值是不是可以被替换如果可以被替换那我们最终的代码是不是可以被放在img标签的src中
这里就是一个由于⾮标准化的 DOM ⾏为,浏览器有时可能会向各种 DOM 元素添加 name & id 属性,作为对⽂档或 全局对象的属性引⽤,但是,这会导致覆盖掉 document原有的属性或全局变量,或者劫持⼀些变量的内容


通过这个例子我们可以看出这是完全可行的

也就是说如果我们可以让window.defaultAvatar = 1" οnerrοr=alert(1)
然后放入到我们的img标签中我们是否就实现一个弹窗的效果
 

 let avatarImgHTML = '<img class="avatar" src="' + (comment.avatar ? escapeHTML(comment.avatar) : defaultAvatar.avatar) + '">';

我们可以看到这段代码最终是将defaultAvatar.avatar放在了img中
这是一个两个层级的关系所以我们应该实现
 

<img id="defaultAvatar"><img id="defaultAvatar" name="avatar">

让它通过defaultAvatar拿到两个标签然后通过avatar拿到我们写有恶意代码的标签
这样的话我们可以构造我们的恶意代码
 

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

cid是过滤框架允许使用的协议但是这个协议不对双引号进行url编码所以我们需要写实体编码

我们就ok了

这篇关于PortSwigger 基于dom的漏洞-利用 DOM 破坏来启用 XSS的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/780027

相关文章

17 通过ref代替DOM用来获取元素和组件的引用

重点 ref :官网给出的解释是: ref: 用于注册对元素或子组件的引用。引用将在父组件的$refs 对象下注册。如果在普通DOM元素上使用,则引用将是该元素;如果在子组件上使用,则引用将是组件实例: <!-- vm.$refs.p will be the DOM node --><p ref="p">hello</p><!-- vm.$refs.child will be the c

react笔记 8-19 事件对象、获取dom元素、双向绑定

1、事件对象event 通过事件的event对象获取它的dom元素 run=(event)=>{event.target.style="background:yellowgreen" //event的父级为他本身event.target.getAttribute("aid") //这样便获取到了它的自定义属性aid}render() {return (<div><h2>{

【CTF Web】BUUCTF Upload-Labs-Linux Pass-13 Writeup(文件上传+PHP+文件包含漏洞+PNG图片马)

Upload-Labs-Linux 1 点击部署靶机。 简介 upload-labs是一个使用php语言编写的,专门收集渗透测试和CTF中遇到的各种上传漏洞的靶场。旨在帮助大家对上传漏洞有一个全面的了解。目前一共20关,每一关都包含着不同上传方式。 注意 1.每一关没有固定的通关方法,大家不要自限思维! 2.本项目提供的writeup只是起一个参考作用,希望大家可以分享出自己的通关思路

xss-labs-master通关教程

一.level1 先来进行一下代码审计 <?php ini_set("display_errors", 0);//关闭错误显示$str = $_GET["name"]; //接受URL来的get形式的name传参echo "<h2 align=center>欢迎用户".$str."</h2>";//在网页输出,并不是echo执行的,而是echo把HTML代码发送到浏览器,浏览器对发送的H

DOM 添加节点

DOM 添加节点 在Web开发中,文档对象模型(DOM)是一个非常重要的概念。DOM是HTML和XML文档的编程接口,它将文档表示为节点树,允许开发人员通过JavaScript等脚本语言进行操作。在本文中,我们将探讨如何在DOM中添加节点,包括各种方法和最佳实践。 DOM节点简介 在DOM中,文档的每一个部分都是一个节点。主要的节点类型包括: 元素节点:HTML标签,例如<div>或<sp

js操作Dom节点拼接表单及ajax提交表单

有时候我们不希望html(jsp、vm)中有创建太多的标签(dom节点),所以这些任务都由js来做,下面提供套完整的表单提交流程,只需要在html中添加两个div其余的都由js来做吧。下面原生代码只需略微修改就能达到你想要的效果。 1、需要创建表单的点击事件 <a href="javascript:void(0);"onclick="changeSettleMoney('$!doctor.do

单例模式以及反射对单例模式的破坏及防御

单例模式(Singleton Pattern)是一种确保类在应用程序生命周期内只存在一个实例的设计模式。它不仅提供了全局访问点,还能节省内存、控制实例的生命周期。但常见的单例模式实现方式如饿汉式、懒汉式、双重校验锁、静态内部类等,虽然设计良好,但都容易被 Java 的反射机制所破坏。本文将介绍这些单例实现方式的优缺点、反射如何破坏它们的唯一性,以及如何防御这种破坏。 1. 单例模式的常见实现

Java反序列化漏洞-TemplatesImpl利用链分析

文章目录 一、前言二、正文1. 寻找利用链2. 构造POC2.1 生成字节码2.2 加载字节码1)getTransletInstance2)defineTransletClasses 2.3 创建实例 3. 完整POC 三、参考文章 一、前言 java.lang.ClassLoader#defineClass defineClass可以加载字节码,但由于defineClas

Web安全之XSS跨站脚本攻击:如何预防及解决

1. 什么是XSS注入 XSS(跨站脚本攻击,Cross-Site Scripting)是一种常见的Web安全漏洞,通过注入恶意代码(通常是JavaScript)到目标网站的网页中,以此在用户浏览网页时执行。攻击者可以通过XSS获取用户的敏感信息(如Cookie、会话令牌)或控制用户浏览器的行为,进而造成信息泄露、身份冒用等严重后果。 2. XSS攻击类型 2.1 存储型XSS 存储型XS

【前端安全】浅谈XSS攻击和防范

定义 XSS是跨站脚本攻击(Cross Site Scripting),为不和层叠样式表(Cascading Style Sheets, CSS)的缩写混淆,故将跨站脚本攻击缩写为XSS。 恶意攻击者往Web页面里插入恶意Script代码,当用户浏览该页之时,嵌入其中Web里面的Script代码会被执行,从而达到恶意攻击用户的目的。 分类 大分类小分类原理非存储DOM型① 不需要经过服务器