PortSwigger靶场之DOM XSS in document.write sink using source location.search通关秘籍

一、靶场描述

这个靶场在搜索查询的跟踪功能中,包含一个基于DOM的跨站脚本(DOM-based XSS)漏洞。

该漏洞的产生是因为网站使用了一个名为 document.write 的 JavaScript 函数,这个函数会把数据直接写入到页面中。而写入的数据来源于 location.search,也就是网站 URL 中问号 (?) 之后的部分,这部分内容是你可以完全控制的。

衍生一下,标签<img>是在在网页中插入图片的意思,主要属性包括:

  • src:图片的地址,必填,比如:src="example.jpg"
  • alt:图片无法显示时的替代文本
  • width、height:设置图片大小
<img src="logo.png" alt="网站LOGO" width="100" height="50">

其中:
<img src=xxx οnerrοr=" ">:当src="xxx" 是不存在或无法加载的资源时,浏览器会触发 onerror 事件,可以利用图片加载失败触发 JavaScript 执行

<img src=xxx οnlοad=" ">:当src="xxx" 是有效且能正常加载的资源时,浏览器会触发 onload 事件,可以利用图片加载成功触发 JavaScript 执行

我们访问/resources/images/tracker.gif可以访问

所以本靶场可以利用图片加载成功触发 JavaScript 执行通关,但是主要使用的是下面三、攻击思路,这种也是一种办法。

" onload="alert(1)"

当你的输入被拼接到原始代码中后,最终生成的HTML字符串变成了:

<img src="/resources/images/tracker.gif?searchTerms="" onload="alert(1)">

二、漏洞原理详解

1、基于DOM的跨站脚本 (DOM-based XSS):

  • 这是一种特殊的XSS攻击。与存储型和反射型XSS不同,DOM型XSS的攻击载荷(payload)不一定会发送到服务器。

  • 整个攻击过程发生在用户的浏览器端。具体来说,是页面的客户端JavaScript代码,在处理数据时不够安全,导致了漏洞。

  • 在这个靶场中,流程是这样的:

    a. 浏览器加载页面的合法JavaScript代码。

    b. 这段代码从URL中读取数据 (通过 location.search)。

    c. 代码没有对读取到的数据进行安全处理(过滤或编码),就直接使用 document.write 将其写入到页面的文档对象模型(DOM)中。

    d. 如果URL中包含了恶意脚本,这个脚本就会被写入页面并执行。

2、危险函数 (Sink):

document.write这是一个非常经典的导致DOM-XSS的函数。它会把传入的字符串当作HTML来解析并插入到文档流中。如果字符串里包含 <script> 标签,浏览器就会执行它。

3、数据来源 (Source):

location.search这是指URL中从 ? 开始的所有内容(查询字符串)。例如,在 http://example.com/search?query=apple 这个URL中, location.search 的值就是 ?query=apple。攻击者可以随意构造这个部分。

4、解决目标

要成功完成这个靶场,你需要构造一个特殊的URL。当这个URL被访问时,它能够触发DOM-XSS漏洞,并成功执行 alert 函数(即在浏览器中弹出一个警告框)。

三、攻击思路:

在输入框随便输入字符串,发现我们的输入被拼接到url,然后函数 document.write() 将从url中获取的search参数写入页面中

这是一段 JavaScript 代码,它的主要功能是跟踪用户在网站上的搜索行为,但它包含一个严重的安全漏洞。

1、代码详解

<script>// 定义一个名为 trackSearch 的函数,它接收一个参数叫 queryfunction trackSearch(query) {// 使用 document.write 向页面写入一段 HTML 代码document.write(// 这段 HTML 是一个 <img> 图像标签// 图像的源(src)指向一个跟踪像素(tracker.gif)// 关键在于,它把用户输入的搜索词(query)作为参数拼接到了图像的 URL 后面'<img src="/resources/images/tracker.gif?searchTerms=' + query + '">');}// 从当前页面的 URL 中获取名为 'search' 的参数值// 例如,如果 URL 是 https://example.com/?search=1// 那么 query 变量的值就是 '1'var query = (new URLSearchParams(window.location.search)).get('search');// 判断 query 是否存在 (即 URL 中是否有 'search' 参数)if (query) {// 如果存在,就调用上面定义的 trackSearch 函数,并将获取到的搜索词传进去trackSearch(query);}
</script>

2、功能总结

这段代码的目的是:

  1. 从当前页面的 URL 地址栏里,寻找一个名为 search 的参数 (例如: .../?search=关键词)。

  2. 如果找到了这个参数,就把它的值(也就是用户搜索的关键词)取出来。

  3. 然后,它会动态地在页面上创建一个看不见的图像(一个1x1像素的跟踪GIF)。这个图像的 URL 地址会把用户的搜索关键词作为 searchTerms 参数附加上去。

  4. 当浏览器尝试加载这个图像时,就会向服务器发送一个请求,服务器通过分析这个请求日志,就能知道用户刚刚搜索了什么关键词,从而实现搜索行为跟踪。

3、严重的安全问题 (DOM-based XSS)

这段代码最关键的问题在于它使用了 document.write() 函数来处理从URL中获取的用户输入,并且没有任何安全过滤

一个攻击者可以构造一个恶意的 URL,如下所示:

https://[网站地址]/?search="><script>alert('XSS')</script>

当用户访问这个 URL 时,代码的执行流程会变成这样:

  1. query 变量获取到的值是:"><script>alert('XSS')</script>

  2. trackSearch 函数被调用,document.write() 执行的内容就变成了:

    <img src="/resources/images/tracker.gif?searchTerms=""><script>alert('XSS')</script>">
    
  3. 浏览器在解析这段 HTML 时,会先闭合 <img> 标签,然后遇到 <script> 标签,就会立即执行里面的 JavaScript 代码,导致弹出一个警告框。

结论: 这段代码实现了一个简单的搜索跟踪功能,但由于直接将 URL 参数写入页面,导致了严重的基于DOM的跨站脚本(DOM-XSS)漏洞,允许攻击者在网站上执行任意脚本。

你需要将一个恶意的JavaScript载荷(payload)放在URL的查询字符串中。当页面上的脚本读取这个查询字符串并用 document.write 将其写入页面时,你的脚本就会被执行。

一个典型的攻击URL会类似这样:

https://......./?search=<script>alert('XSS')</script>

至此,成功通关。

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

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

相关文章

深度学习篇---Pytorch常用优化器

优化器介绍&#xff1a;在 PyTorch 中&#xff0c;优化器&#xff08;Optimizer&#xff09;的作用是根据模型参数的梯度来更新参数&#xff0c;以最小化损失函数。下面用通俗易懂的方式介绍几种常用的优化器&#xff1a;1. SGD&#xff08;随机梯度下降&#xff09;最基础的优…

0903 C++类的运算符重载、静态成员与继承

Part 1.梳理思维导图一.运算符重载1.运算符重载的作用使原本只能对基本数据类型生效的运算符&#xff0c;在重载后&#xff0c;满足可以对构造类型数据生效。2.关系运算符重载a.关系运算符种类> > < < !b.分析参数表达式…

Cloudflare安全规则实用指南:从路径拦截到IP限制的10个经典范例

前言&#xff1a;在Cloudflare的安全防护体系中&#xff0c;自定义规则是抵御特定威胁的“精准武器”。除了基础的路径拦截&#xff0c;日常运维中还有许多高频场景需要针对性配置。本文将通过10个实用范例&#xff0c;带你掌握Cloudflare规则的灵活用法&#xff0c;覆盖路径防…

数据结构(时空复杂度)

目录 一、算法复杂度 二、时间复杂度 1.不同时间度代码举例 三、空间复杂度 一、算法复杂度 算法复杂度&#xff08;评估算法优劣一个重要指标&#xff09;分为时间复杂度和空间复杂度。 时间复杂度是指执行算法所需要的计算工作量&#xff0c;而空间复杂度是指执行这个…

ESXI8多网卡链路聚合

1. 背景 测试服务器只有千兆网卡&#xff0c;增加上行带宽&#xff0c;使用两块网卡做链路聚合。 2. 环境 VM ESXI 8.0 华为交换机 S5735S 3. 交换机配置 负载均衡方式采用了src-dst-ipTrunk模式采用了手工负载分担&#xff08;测试了静态LACP&#xff0c;未成功&#xff09;4.…

从“人工驱动”到“AI协同”:良策金宝AI如何助力设计院数智化跃迁?

在“双碳”目标驱动下&#xff0c;电力工程项目的数量与复杂度持续攀升。设计院面临“项目多、周期短、人力紧”的三重压力&#xff0c;传统的“人工驱动”模式已难以为继。良策金宝AI&#xff0c;正是这场变革的核心引擎。它以AI驱动数智化服务&#xff0c;为工程设计企业提供…

vue3 vite 自适应方案

两种方案&#xff1a; 1 使用 postcss-pxtorem插件 npm install postcss-pxtorem autoprefixer --save-dev # 或 yarn add postcss-pxtorem autoprefixer -D 2、postcss-px-to-viewport npm install postcss-px-to-viewport --save-dev 或 yarn add postcss-px-to-viewport -D …

华为研发投资与管理实践(IPD)读书笔记

在全球科技产业竞争日趋激烈的背景下&#xff0c;企业研发管理早已告别 “依赖个体经验、靠运气突破” 的粗放时代&#xff0c;如何将研发创新从 “偶然成功” 转化为 “可复制、可持续的必然成果”&#xff0c;成为所有追求长期竞争力的企业必须破解的命题。华为&#xff0c;作…

【LeetCode_283】移动零

刷爆LeetCode系列LeetCode第283题&#xff1a;github地址前言题目描述题目与思路分析代码实现算法代码优化LeetCode第283题&#xff1a; github地址 有梦想的电信狗 前言 本文用C实现 LeetCode 第283题 题目描述 题目链接&#xff1a;https://leetcode.cn/problems/move-z…

一文弄懂C/C++不定参数底层原理

目录 一、C语言的可变参数&#xff1a;基于栈帧的手动读取 &#xff08;1&#xff09;C函数调用的栈帧结构 &#xff08;2&#xff09;C 可变参数的 4 个核心宏&#xff1a;如何 “手动读栈” &#xff08;3&#xff09;实战代码&#xff1a;用 C 可变参数实现求和函数 &a…

【Android】【设计模式】抽象工厂模式改造弹窗组件必知必会

写一个 Android 版本的抽象工厂弹窗 Manager 管理器&#xff0c;使用 DialogFragment 实现&#xff0c;这样能更贴近真实的开发场景。结构设计 抽象产品&#xff1a;BaseDialogFragment&#xff08;继承 DialogFragment&#xff09;具体产品&#xff1a;LoginDialogFragment, …

Win64OpenSSL-3_5_2.exe【安装步骤】

官网下载 注意&#xff1a;科学上网&#xff0c;可以加速下载速度&#xff01; Win32/Win64 OpenSSL Installer for Windows - Shining Light Productions 下载后得到&#xff1a;Win64OpenSSL-3_5_2.exe 双击安装 修改安装路径&#xff1a; 默认就选择第一个。 重要提醒​…

华为云云原生架构赋能:大腾智能加速业务创新步伐

巨大的涡轮、细小的螺丝&#xff0c;一台航天飞机发动机的三维模型呈现在屏幕上&#xff0c;远程同事同步协作&#xff0c;一台复杂设备在工程师高效的协同中不断完善。深圳市大腾信息技术有限公司&#xff0c;正是这场工业变革的推动者之一。大腾智能以“云原生工业”的融合为…

基于https+域名的Frp内网穿透教程(Linux+Nginx反向代理)

系列文章目录 基于http公网ip的Frp内网穿透教程(win server) 基于http域名的Frp内网穿透教程(win serverIIS反向代理) 基于http公网ip的Frp内网穿透教程(Linux) 基于https域名的Frp内网穿透教程(LinuxNginx反向代理) 目录 系列文章目录 前言 一、Frp是什么&#xff1f; 1. …

裸机程序(1)

一、裸机裸机是一个在计算机硬件与软件开发领域高频出现的概念&#xff0c;核心定义是 “未安装操作系统&#xff08;OS&#xff09;&#xff0c;仅包含硬件本身&#xff08;或仅运行最底层硬件驱动 / 控制程序&#xff09;的设备”。在电脑中&#xff0c;裸机会映射代码到cpu&…

95%企业AI失败?揭秘LangGraph+OceanBase融合数据层如何破局!​

本文较长&#xff0c;建议点赞收藏&#xff0c;以免遗失。更多AI大模型应用开发学习视频及资料&#xff0c;尽在聚客AI学院。不知道你们有没有遇到过&#xff0c;在我们一些实际落地的AI项目中&#xff0c;虽然前期“Demo 很惊艳&#xff0c;但上线后却无人问津”。你们有没有想…

树莓集团产教融合:数字学院践行职业教育“实体化运营”要求

在职业教育改革不断深化的背景下&#xff0c;“实体化运营” 成为推动职业教育高质量发展的重要方向。树莓集团积极响应这一要求&#xff0c;以产教融合为核心&#xff0c;打造数字学院&#xff0c;切实践行职业教育 “实体化运营”&#xff0c;为培养高素质数字领域专业人才探…

ELK 统一日志分析系统部署与实践指南(上)

#作者&#xff1a;张桐瑞 文章目录1 ELK 技术栈概述1.1ELK 核心组件详解1.2 ELK 工作流程2 ELK部署2.1 环境描述2.1.7 配置es集群下篇&#xff1a;《ELK 统一日志分析系统部署与实践指南&#xff08;下&#xff09;》 链接: [https://blog.csdn.net/qq_40477248/article/detail…

上位机知识篇---poweshellcmd

要理解 PowerShell 和 CMD 的区别&#xff0c;我们可以先打个通俗的比方&#xff1a;CMD 像老式功能机&#xff0c;只能干打电话、发短信这些 “基础活”&#xff1b;而 PowerShell 像智能手机&#xff0c;不仅能做基础操作&#xff0c;还能装 APP、玩复杂功能&#xff0c;甚至…

利用 Python 绘制环形热力图

暑假伊始&#xff0c;Coldrain 参加了学校举办的数模集训&#xff0c;集训的过程中&#xff0c;遇到了需要展示 59 个特征与 15 个指标之间的相关性的情况&#xff0c;在常用的图表不大合适的情况下&#xff0c;学到了一些厉害的图表&#xff0c;但是似乎千篇一律都是用 R 语言…