PostWigger的xss漏洞

news2024/11/17 1:25:07

文章目录

  • Lab: Exploiting DOM clobbering to enable XSS

Lab: Exploiting DOM clobbering to enable XSS

这是一道dom破坏题。
首先进入,发现都是一个个博客。
在这里插入图片描述
随便点击看看。
在这里插入图片描述
在这里插入图片描述
发现是一篇文章之后是一些评论以及咱们也可以发布评论。这里的Email使用了html的正则表达。
先随便使用反射型xss进行注入尝试。
在这里插入图片描述
提交评论,看有什么变化。
在这里插入图片描述
查看其元素。发现将其后面的危险代码删除了。
在这里插入图片描述
在这里插入图片描述
查看其源码


<!DOCTYPE html>
<html>
    <head>
        <link href=/resources/labheader/css/academyLabHeader.css rel=stylesheet>
        <link href=/resources/css/labsBlog.css rel=stylesheet>
        <title>Exploiting DOM clobbering to enable XSS</title>
    </head>
    <body>
        <script src="/resources/labheader/js/labHeader.js"></script>
        <div id="academyLabHeader">
            <section class='academyLabBanner'>
                <div class=container>
                    <div class=logo></div>
                        <div class=title-container>
                            <h2>Exploiting DOM clobbering to enable XSS</h2>
                            <a class=link-back href='https://portswigger.net/web-security/dom-based/dom-clobbering/lab-dom-xss-exploiting-dom-clobbering'>
                                Back&nbsp;to&nbsp;lab&nbsp;description&nbsp;
                                <svg version=1.1 id=Layer_1 xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' x=0px y=0px viewBox='0 0 28 30' enable-background='new 0 0 28 30' xml:space=preserve title=back-arrow>
                                    <g>
                                        <polygon points='1.4,0 0,1.2 12.6,15 0,28.8 1.4,30 15.1,15'></polygon>
                                        <polygon points='14.3,0 12.9,1.2 25.6,15 12.9,28.8 14.3,30 28,15'></polygon>
                                    </g>
                                </svg>
                            </a>
                        </div>
                        <div class='widgetcontainer-lab-status is-notsolved'>
                            <span>LAB</span>
                            <p>Not solved</p>
                            <span class=lab-status-icon></span>
                        </div>
                    </div>
                </div>
            </section>
        </div>
        <div theme="blog">
            <section class="maincontainer">
                <div class="container is-page">
                    <header class="navigation-header">
                        <section class="top-links">
                            <a href=/>Home</a><p>|</p>
                        </section>
                    </header>
                    <header class="notification-header">
                    </header>
                    <div class="blog-post">
                    <img src="/image/blog/posts/68.jpg">
                    <h1>Wedding Bells</h1>
                    <p><span id=blog-author>Roger That</span> | 20 July 2024</p>
                    <hr>
                    <p>There&apos;s a new craze that is crazier than the craziest crazes so far - in my opinion. This is the one where a couple fall in love, get engaged, then invite their family and friends to pay for the wedding. What could possibly go wrong?</p>
                    <p>Pretty much everything can go wrong. To start with the assumption is that the guests would have stumped up a reasonable amount of money on a gift in the first place. The theory, replace that gift with money. Money paid in advance of the reception so that it can be booked and paid for ready for the big day.</p>
                    <p>I&apos;m guessing the only person happy about this set up would be the Father of the bride who has always been expected to dig deep to send off his one and only beloved daughter. Fast forward to social media groups.</p>
                    <p>&apos;My best friend is getting married and wants us to contribute to the cost of the wedding. I think this is really rude, what do y&apos;all think?&apos;</p>
                    <p>Here follows 500 opinions until admin finally turns off comments. The general consensus is less than romantic, as strangers suggest the relationship might break down, and then you&apos;re out of pocket having already contributed to the non-refundable sandwiches and sparkle.</p>
                    <p>Should this plan actually make it to the table, can you imagine the chaos at the buffet as everyone rushes forward to get their money&apos;s worth? Aunt Val insists on taking the table decorations home with her, and Uncle Ross fills his pockets with the complimentary mints at the front desk. If you let people pay for stuff, they then have the right to complain. About everything. And complain they will.</p>
                    <p>Normally civilized people will become feral as they expect their $50 contribution to provide them with something a little fancier than a single serving of doughnuts, instead of a nice slab of wedding cake. Blame Cousin Eve, she only paid in $5, something had to give. Soon the whispering will begin, &apos;how much did you put in?&apos; Followed by, &apos;I heard Val only donated $5, she should not be allowed to have anything to eat.&apos; Resentment will grow. Relatives will fall out and probably never speak to each other again, until the next family gathering at least.</p>
                    <p>If you want the wedding of your dreams, save up like the rest of us and pay for it yourself.</p>
                    <div/>
                    <hr>
                    <h1>Comments</h1>
                    <span id='user-comments'>
                    <script src='/resources/js/domPurify-2.0.15.js'></script>
                    <script src='/resources/js/loadCommentsWithDomClobbering.js'></script>
                    <script>loadComments('/post/comment')</script>
                    </span>
                    <hr>
                    <section class="add-comment">
                        <h2>Leave a comment</h2>
                        <form action="/post/comment" method="POST" enctype="application/x-www-form-urlencoded">
                            <input required type="hidden" name="csrf" value="fMgHhBhOhLDapt7kD6EhSJ4tSTRnMM8S">
                            <input required type="hidden" name="postId" value="10">
                            <label>Comment:</label>
                            <div>HTML is allowed</div>
                            <textarea required rows="12" cols="300" name="comment"></textarea>
                                    <label>Name:</label>
                                    <input required type="text" name="name">
                                    <label>Email:</label>
                                    <input required type="email" name="email">
                                    <label>Website:</label>
                                    <input pattern="(http:|https:).+" type="text" name="website">
                            <button class="button" type="submit">Post Comment</button>
                        </form>
                    </section>
                    <div class="is-linkback">
                        <a href="/">Back to Blog</a>
                    </div>
                </div>
            </section>
            <div class="footer-wrapper">
            </div>
        </div>
    </body>
</html>

也发现了其被最强过滤方法(domPurify)过滤掉了,那么基本不用考虑绕过这个方法了
漏洞基本都是出自于js代码中,那我们就查看js。第63行的js代码。

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) + ';';
        })
    }

    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);
        }
    }
};

观察发现,基本可以分为三个方法:escapeHTML(过滤)、displayComments(展示)、loadComments(载入)。
观察escapeHTML过滤代码发现,将<、>、"、'全部过滤为实体编码,也就是说不可能进入标签开始状态了。
再分析展示部分,循环comments,然后会增加一个p标签,然后创建一个img标签,然后再创建一个div标签,将头像标签放入。
然后判断有没有author、website,如果有,依次将相应信息添加到firstPElement中,也就是p标签中。然后再向下就是使用了一个过滤框架和将一些时间等信息放入p标签。
在这里插入图片描述
出现问题的地方就是在头像的地方,分析代码

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

发现,当window.defaultAvatar有值时头像就是传入的,如果没值,那就是默认那个头像。传入头像时,首先也是会经过过滤函数。
那么我们能不能创建window.defaultAvatar呢?
那就来考虑dom破坏,创建window.defaultAvatar.avatar。
看到下面的src是使用双引号进行过滤的,那我们就得使用双引号进行过滤,然后再写咱们的恶意代码。

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

这里的1后面的双引号为什么要用html实体编码呢?原因是为了闭合源代码中的双引号,如果使用"这个符号,那么会闭合href的双引号,会报错,所以这里的双引号用了html实体编码。
在这里插入图片描述

提交进行测试。
在这里插入图片描述

并没有什么反应,难道是咱们的思路出错了吗?此时这才第一步,dom破坏。接下来再随便发一个评论。成功弹窗
在这里插入图片描述
本来我对构建的a标签有点疑惑为什么最后要加个//,当我看到提交后的元素后,我知道了是为了注释掉多余的"。
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2049352.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Redis的缓存淘汰策略

1. 查看Redis 最大的占用内存 打开redis配置文件, 设置maxmemory参数&#xff0c;maxmemory 是bytes字节类型, 注意转换 2. Redis默认内存多少可以用 注意: 在64bit系统下&#xff0c; maxmemory 设置为 0 表示不限制Redis内存使用 3. 一般生产上如何配置 一般推荐Redis 设置内…

微信小程序骨架屏

骨架屏是常用的一种优化方案&#xff0c;针对于页面还未加载完时给用户的一种反馈方式。如果自己要写骨架屏有点复杂因为页面的元素过多且不稳定&#xff0c;这边直接使用微信开发工具生成骨架屏。也不只有微信开发工具有像常用的抖音开发工具&#xff0c;字节开发工具都有对应…

Python自准直仪双筒望远镜光学ABCD矩阵行为算法

&#x1f3af;要点 &#x1f3af;平面&#xff1b;曲面&#xff1b;圆柱面&#xff1b;非球面光&#xff0c;双凸透镜&#xff1b;90 度棱镜&#xff1b;分束立方体&#xff0c;双透镜棱&#xff1b;镜分光镜光线&#xff1b;横置隔膜&#xff1b;全内反射&#xff1b;多个分束…

【Django开发】前后端分离django美多商城项目第1篇:欢迎来到美多 项目主要页面介绍【附代码文档】

本教程的知识点为&#xff1a; 项目准备 项目准备 配置 1. 修改settings/dev.py 文件中的路径信息 2. INSTALLED_APPS 3. 数据库 用户部分 图片 1. 后端接口设计&#xff1a; 视图原型 2. 具体视图实现 用户部分 使用Celery完成发送 判断帐号是否存在 1. 判断用户名是否存在 后…

看图学sql之sql 中的窗口函数

数据分析社区直达 免费数据分析资料下载。定期分享数据分析领域的最新动态、实战案例、技术工具评测、数据可视化技巧以及行业洞察报告。

【Arduino】ATmega328PB 单片机初始化配置,连接使用配置 arduino

总览 1.下载资料 2.配置 arduino 首选项 3.配置开发板管理器 4.配置不同 晶振频率 的 mega328PB 的参数设置 一、下载资料 1.你也可以看着资料自己来弄&#xff0c;如果嫌我麻烦 网盘&#xff1a;https://pan.baidu.com/s/13FCKXE8t_AZeixcR_bEhXg 提取密码&#xff1a;123…

从Linux内核探索 Socket 的本质

目录 一、引言 二、Socket 的概念 三、Socket 的使用场景 四、Socket 的设计 五、提供 Socket 层 六、Socket 如何实现网络通信 &#xff08;一&#xff09;建立连接 &#xff08;二&#xff09;数据传输 七、Socket 怎么实现“继承” 八、总结 一、引言 相信大家刚…

[Zer0pts2020]Can you guess it?1

打开题目 看到信息随便输入一个数&#xff0c;显示错误 查看源代码 看到php代码&#xff0c;代码审计 <?php include config.php; // FLAG is defined in config.php if (preg_match(/config\.php\/*$/i, $_SERVER[PHP_SELF])) { exit("I dont know what you are t…

以node / link文件表征的道路网络-----dijkstra算法yyds-----基于南京公路公开数据做路径规划(上)

前文已经基于公开数据&#xff0c;获得了南京的全域高速公路的路网数据&#xff0c;这些以node / link文件表征的道路网络不仅延续了osm地图中所包含的经纬度、名称、容量等信息 &#xff0c;还包含了一个重要的道路等级字段 “link_type_name”。 交通部门一般以高速公路、国…

ThinkPHP的SQL注入漏洞学习

目录 漏洞环境 漏洞概要 函数学习 call_user_func函数 mplode函数 漏洞分析 漏洞修复 攻击总结 漏洞环境 漏洞存在于 Builder 类的 parseData 方法中。由于程序没有对数据进行很好的过滤&#xff0c;将数据拼接进 SQL 语句&#xff0c;导致 SQL注入漏洞 的产生。 漏洞…

Shell参考 - Linux Shell 训练营

出品方<Linux.cn & 阿里云开发者学堂> 一&#xff0c;Linux 可以划分为以下四个部分&#xff1a; 1. 应用软件 2. 窗口管理软件 Unity Gnome KDE 3. GNU 系统工具链 Software- GNU Project - Free Software Foundation 4. Linux 内核 二&#xff0c;什么是shell 1. L…

一款免费开源电脑流量监控软件,电脑流量统计工具!

TrafficMonitor是一个开源的网络速度监控工具&#xff0c;它能够在Windows平台上以悬浮窗的形式显示当前的网速、CPU和内存使用情况。该工具支持多种显示模式&#xff0c;包括悬浮窗和任务栏显示&#xff0c;并且允许用户更换不同的皮肤来自定义外观样式。此外&#xff0c;Traf…

【MySQL】数据库基础(库的操作)

目录 一、MySQL安装、连接、修改密码操作 二、库的操作 2.1 创建数据库 2.2 字符集和校验规则 2.3 操控数据库 2.4 修改数据库 2.5 删除数据库 2.6 数据库的备份和恢复 2.7 查看连接情况 前情提要&#xff1a; 我的服务器操作系统是Ubuntu20.04&#xff0c;安装的是M…

eNSP 华为远程访问路由器

华为远程访问路由器 前提&#xff1a;主机能与路由器通信就行&#xff0c;如果不同网段就配路由协议&#xff0c;这里直接模拟直连通信 Cloud&#xff1a; R&#xff1a; <Huawei>sys [Huawei]sys R [R]int g0/0/0 [R-GigabitEthernet0/0/0] [R-GigabitEthernet0/0/0]i…

Vue50 todolist自定义事件版本

代码 MyFooter.vue <template><div class"todo-footer" v-show"total"><label><!-- <input type"checkbox" :checked"isAll" change"checkAll"/> --><input type"checkbox" v…

【html】颜色随机产生器(补充包)

上一篇文章我们讲了如何制作一个通过滑动产色纯色背景的网页&#xff0c;今天&#xff0c;我们对那个网页进行一个补充&#xff0c;&#xff08;&#xff09; 因为很多人在设计网页的时候没有颜色的灵感这个时候我们我们就可以考虑通过随机产生一种颜色并且能够实时看到效果的…

Delphi5实现密码、姓名生成器

文章目录 目的效果图密码生成器类类定义成员函数 点击“密码生成”事件名字生成器类类的成员功能概述注意点 点击“姓名生成”事件点击“清空”事件“导出txt”事件“备注”输入框画图软件完整代码 目的 写这个程序的目的是生成一个密码和用于快递的名字&#xff08;生成密码和…

keepalived详细讲解

keepalived&#xff1a; Keepalived是一个基于VRRP&#xff08;‌Virtual Router Redundancy Protocol&#xff0c;‌虚拟路由冗余协议&#xff09;‌协议实现的LVS&#xff08;‌Linux Virtual Server&#xff09;‌服务高可用方案。‌它的主要作用是进行虚拟路由的故障切换&…

算法打卡 Day24(二叉树)-二叉搜索树的最近公共祖先 + 二叉搜索树中的插入操作 + 删除二叉搜索树中的节点

文章目录 Leetcode 235-二叉搜索树的最近公共祖先题目描述解题思路 Leetcode 701-二叉搜索树中的插入操作题目描述解题思路 Leetcode 450-删除二叉搜索树中的节点题目描述解题思路 Leetcode 235-二叉搜索树的最近公共祖先 题目描述 https://leetcode.cn/problems/lowest-comm…

江协科技STM32学习笔记(第10章 SPI通信)

第10章 SPI通信 10.1 SPI通信协议 10.1.1 SPI通信 SPI&#xff08;Serial Peripheral Interface&#xff09;是由Motorola公司开发的一种通用数据总线&#xff1b; 串行外设接口&#xff1b; I2C无论是软件还是软件电路&#xff0c;设计的都还是比较复杂的&#xff0c;硬件…