欺骗单页应用(SPA)渲染隐藏路由 -- trouble at the spa b01lersCTF

题目信息:I had this million-dollar app idea the other day, but I can’t get my routing to work! I’m only using state-of-the-art tools and frameworks, so that can’t be the problem… right? Can you navigate me to the endpoint of my dreams?

题目使用 vite

{"name": "src","private": true,"version": "0.0.0","type": "module","scripts": {"dev": "vite","build": "tsc -b && vite build","lint": "eslint .","preview": "vite preview"},"dependencies": {"@tailwindcss/vite": "^4.1.3","react": "^19.0.0","react-dom": "^19.0.0","react-router": "^7.5.0","tailwindcss": "^4.1.3"},"devDependencies": {"@types/react": "^19.0.10","@types/react-dom": "^19.0.4","@vitejs/plugin-react": "^4.3.4","globals": "^15.15.0","typescript": "~5.7.2","vite": "^6.2.0","vite-plugin-javascript-obfuscator": "^3.1.0"}
}

查看路由

// 从 react 库中导入 StrictMode 组件,它可以帮助我们在开发模式下发现潜在问题
import { StrictMode } from 'react';
// 从 react-dom/client 库中导入 createRoot 函数,用于创建 React 根节点
import { createRoot } from 'react-dom/client';
// 从 react-router 库中导入 BrowserRouter、Routes 和 Route 组件,用于实现路由功能
import { BrowserRouter, Routes, Route } from 'react-router';// 导入页面组件
// 导入 App 组件,作为首页展示
import App from './App.tsx';
// 导入 Flag 组件,用于 /flag 路径的页面展示
import Flag from './Flag.tsx';// 导入全局样式文件
import './index.css';/*** 使用 createRoot 函数创建一个 React 根节点,挂载到 id 为 'root' 的 DOM 元素上* 并渲染 React 应用程序*/
createRoot(document.getElementById('root')!).render(// 使用 StrictMode 组件包裹应用,在开发模式下检查潜在问题<StrictMode>{/* 使用 BrowserRouter 组件为应用提供路由功能 */}<BrowserRouter>{/* 使用 Routes 组件来定义一组路由规则 */}<Routes>{/* 定义首页路由,当路径为根路径时,渲染 App 组件 */}<Route index element={<App />} />{/* 定义 /flag 路径的路由,当路径为 /flag 时,渲染 Flag 组件 */}<Route path="/flag" element={<Flag />} /></Routes></BrowserRouter></StrictMode>
);

看看flag

export default function Flag() {return (<section className="text-center pt-24"><div className="flex items-center text-5xl font-bold justify-center">{'bctf{test_flag}'}</div></section>)
}

访问 /flag 返回 404 , 根据题目,我不可能修改服务器端代码,接下来我怎么访问 /flag?

The site configured at this address does not contain the requested file.If this is your site, make sure that the filename case matches the URL as well as any file permissions.  
For root URLs (like `http://example.com/`) you must provide an `index.html` file.[Read the full documentation](https://help.github.com/pages/) for more information about using **GitHub Pages**.
import Header from './Header.tsx';
import AdCard from './AdCard.tsx';
import Footer from './Footer.tsx';function App() {const sponsors = ['microsoft.svg', 'google.svg', 'amazon.svg', 'netflix.svg', 'meta.svg', 'apple.svg'];return (<><Header /><section className="text-center pt-24"><h1 className="text-7xl mb-4 font-bold">Quantum b01lerchain</h1><p>Quantum-computing based blockchain technology at scale, automatically secured by cutting-edgeAI threat-assessment models.</p></section><section className="pt-14 pb-2 mb-20"><div className="w-full mx-auto -z-10 bg-gradient-to-r from-yellow-500 via-pink-400 to-red-500 transform -skew-y-3 flex flex-row"><div className="transform skew-y-3 mx-auto -my-4 flex flex-row space-x-12"><AdCardtitle="Quantum powered"src="/0f5146d5ed9441853c3f2821745a4173.jpg">Leveraging distributed quantum compute power, b01lerchain technology achieves energyefficiency where other blockchains fail.</AdCard><AdCardtitle="Blockchain at scale"src="/0bee89b07a248e27c83fc3d5951213c1.jpg">All b01lerchain transactions are backed up across 10 different blockchains,ensuring data security.</AdCard><AdCardtitle="AI++"src="/5ab557c937e38f15291c04b7e99544ad.jpg">Leveraging scalable quantum compute power, b01lerchain technology achieves energy efficiencywhere other blockchains fail.</AdCard></div></div></section><section className="mb-8"><p className="text-sm text-center text-secondary mb-3">Proudly powered by</p><div className="flex gap-x-10 gap-y-2 items-center flex-wrap justify-center px-6">{sponsors.map((l) => (<imgsrc={l}className="h-12"key={l}/>))}</div></section><h3 className="font-bold text-xl text-center mb-8">Join 1,200+ investors sharing in b01lerchain's vision.</h3><section><p className="max-w-5xl px-8 mx-auto mb-8">View our demo below:</p><imgsrc="/483032a6422b3ba7005dfa12dda874b5.jpg"className="w-full h-[30rem] object-cover object-center opacity-50"/></section><Footer /></>)
}
'use client'import { useScroll } from '../hooks/useScroll';export default function Header() {const scroll = useScroll();return (<header className={`sticky top-0 z-50 ${scroll > 0 ? 'bg-midnight/90 shadow-md backdrop-blur-sm' : 'bg-midnight hover:bg-midnight/90 hover:shadow-md hover:backdrop-blur-sm'} transition-shadow duration-300 ease-in-out`}><nav className="px-8 py-4 flex gap-4 items-center"><a href="/" className="flex items-center gap-2"><imgsrc="/icon.svg"alt="b01lerchain logo"className="size-6"/><h3 className="font-semibold">b01lerchain</h3></a><a href="/#" className="ml-auto text-inherit hover:no-underline">About</a><a href="/#" className="text-inherit hover:no-underline">FAQ</a><a href="/flag" className="text-inherit hover:no-underline">Flag</a></nav></header>)
}

查一手漏洞

Report Summary┌───────────────────┬──────┬─────────────────┬─────────┐
│      Target       │ Type │ Vulnerabilities │ Secrets │
├───────────────────┼──────┼─────────────────┼─────────┤
│ package-lock.json │ npm  │        1        │    -    │
└───────────────────┴──────┴─────────────────┴─────────┘
Legend:
- '-': Not scanned
- '0': Clean (no security findings detected)package-lock.json (npm)Total: 1 (UNKNOWN: 0, LOW: 0, MEDIUM: 1, HIGH: 0, CRITICAL: 0)┌─────────┬────────────────┬──────────┬────────┬───────────────────┬──────────────────────────────────────┬───────────────────────────────────────────────────────────┐
│ Library │ Vulnerability  │ Severity │ Status │ Installed Version │            Fixed Version             │                           Title                           │
├─────────┼────────────────┼──────────┼────────┼───────────────────┼──────────────────────────────────────┼───────────────────────────────────────────────────────────┤
│ vite    │ CVE-2025-32395 │ MEDIUM   │ fixed  │ 6.2.5             │ 6.2.6, 6.1.5, 6.0.15, 5.4.18, 4.5.13 │ vite: Vite has an `server.fs.deny` bypass with an invalid │
│         │                │          │        │                   │                                      │ `request-target`                                          │
│         │                │          │        │                   │                                      │ https://avd.aquasec.com/nvd/cve-2025-32395                │                                                                                                             
└─────────┴────────────────┴──────────┴────────┴───────────────────┴──────────────────────────────────────┴───────────────────────────────────────────────────────────┘

复现与修复指南:Vite再次bypass(CVE-2025-32395)

但是服务器没有 /@fs

放弃 ------------------------------------------------------------------------------------------------------------

赛后

1. SPA 是什么?
  • 定义
    SPA(单页应用)是一种通过动态重写当前页面内容(而非加载新页面)实现交互的 Web 应用。所有逻辑(路由、数据获取、渲染)均在浏览器中运行,只需加载一次 index.html,后续通过 JavaScript 与 API 交互更新内容。

  • 核心特点

    • 无整页刷新:页面切换时仅局部更新内容,体验更流畅。
    • 前端路由:通过 react-routerVue Router 等库管理 URL 路径与组件的映射。
    • 前后端分离:后端仅提供 API 接口,前端独立处理业务逻辑与渲染。
  • 技术依赖
    依赖现代前端框架(React、Vue、Angular)及工具链(Webpack、Vite)。

2. SPA 的工作原理
  1. 首次加载
    • 用户访问网站时,服务器返回 index.html 和打包后的 JS/CSS 文件。
    • 浏览器解析并执行 JS,渲染初始页面(如登录页或主页)。
  2. 后续交互
    • 用户点击链接或按钮时,前端路由库拦截请求,根据 URL 匹配对应组件。
    • 前端通过 API 异步获取数据,动态更新 DOM(无需整页刷新)。
  3. URL 管理
    • 使用 history.pushState()window.location.hash 修改 URL,避免浏览器向服务器发送请求。

我们可以使用,有效负载欺骗前端js渲染隐藏路由

以下代码实现了 修改 URL + 触发路由更新 的核心逻辑:

history.pushState(null, '', '/flag');                  // Step 1: 修改 URL
window.dispatchEvent(new PopStateEvent('popstate'));   // Step 2: 触发事件
Step 1: history.pushState 的作用
  • 底层行为
    调用浏览器 History API 的 pushState 方法,向浏览器的 会话历史栈(Session History) 中添加一条新记录。

  • 关键细节

    1. 修改 URL 但不刷新页面:仅更新地址栏显示,不触发 HTTP 请求(对比 window.location.href = '/flag' 会触发页面跳转)。
    2. 关联状态数据:第一个参数 state 允许存储任意 JSON 序列化对象(如 { page: 'flag', auth: true }),绑定到新历史记录条目。
    3. 同源策略限制:新 URL 必须与当前页面同源(Same Origin),否则抛出安全错误。
  • 数据结构示例

    history.pushState({ timestamp: Date.now(), user: 'guest' }, // 有效负载(状态数据)'',                                       // 标题(忽略)'/flag'                                   // 新 URL
    );
    
Step 2: PopStateEvent 的触发机制
  • 事件本质
    popstate 是浏览器原生事件,通常在 用户点击后退/前进按钮 或调用 history.back()/history.go() 时触发。

  • 手动触发的意义
    通过 dispatchEvent 主动派发 popstate 事件,模拟浏览器历史导航行为,欺骗前端路由库(如 React Router)执行路由更新逻辑。

  • 事件对象细节

    new PopStateEvent('popstate', {state: history.state,  // 必须与当前历史条目的 state 一致bubbles: true,         // 事件是否冒泡(默认 false)cancelable: true       // 事件是否可取消(默认 false)
    });
    
    • state 字段的强制一致性
      若手动传递的 statehistory.state 不一致,React Router 等库可能忽略此次事件(视为非法状态变更)。

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

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

相关文章

大数据引领行业革命:深度解析与未来趋势

📝个人主页🌹:慌ZHANG-CSDN博客 🌹🌹期待您的关注 🌹🌹 在信息化、数字化、智能化日益发展的今天,大数据技术已经成为推动产业变革的重要引擎。它不仅仅是一个技术工具,更是各行各业创新和优化的核心动力。无论是大企业还是初创公司,大数据的应用已经成为提升效…

[machine learning] Transformer - Attention (二)

本文介绍带训练参数的self-attention&#xff0c;即在transformer中使用的self-attention。 首先引入三个可训练的参数矩阵Wq, Wk, Wv&#xff0c;这三个矩阵用来将词向量投射(project)到query, key, value三个向量上。下面我们再定义几个变量&#xff1a; import torch inpu…

施磊老师rpc(三)

文章目录 mprpc框架项目动态库编译框架生成动态库框架初始化函数-文件读取1. 为什么要传入 argc, argv2. 读取参数逻辑3. 配置文件设计 init部分实现 mprpc配置文件加载(一)配置文件加载类成员变量主要方法**src/include/mprpcconfig.h** 配置文件**bin/test.conf** 实现配置文…

文献分享:通过简单的生物偶联策略将肽双特异性抗体(pBsAbs)应用于免疫治疗

背景 双特异性抗体是将单克隆抗体的两个不同抗原结合位点融合成一个单一实体的人工分子。它们已经成为一种很有前景的下一代抗癌治疗方法。尽管双特异性抗体的应用令人着迷&#xff0c;但双特异性抗体的设计和生产仍然繁琐而富有挑战性&#xff0c;导致研发过程漫长&#xff0…

二、shell脚本--变量与数据类型

1. 变量的定义与使用 定义变量&#xff1a;简单直接 在 Shell 里定义变量相当容易&#xff1a; 基本格式: variable_namevalue关键点 ❗&#xff1a;赋值号 的两边绝对不能有空格&#xff01;这绝对是初学者最容易踩的坑之一 &#x1f628;&#xff0c;务必留意&#xff01…

java_Lambda表达式

1、背景 lambda表达式是Java SE 8中一个重要的新特性。lambda表达式允许你通过表达式来代替功能接口。lambda表达式就和方法一样样&#xff0c;它提供了一个正常的参数列表和一个使用这些参数的主体&#xff08;body&#xff0c;可以是一个表达式和一个代码块&#xff09;。La…

给QCustomPlot添加一个QScrollBar滚动条、限制缩放范围、自动设置大小和右边栏垂直缩放

实现效果 实现思路 从QCustomPlot类派生一个类,进行个性化设置,在轴矩形的上边设置Margin,放一个滚动条,设置滚动条的样式 常量定义 #define NQSCRB 1000构造函数初始化 // 设置QScrollBar的样式// 顶部空--5,左侧空--6

实验-组合电路设计1-全加器和加法器(数字逻辑)

目录 一、实验内容 二、实验步骤 2.1 全加器的设计 2.2 加法器的设计 三、调试过程 3.1 全加器调试过程 2.加法器的调试过程 四、实验使用环境 五、实验小结和思考 一、实验内容 a) 介绍 在这次实验中&#xff0c;你将熟悉 Logisim 的操作流程&#xff0c;并且学习…

Linux进程控制与替换详解

进程创建 fork函数初识 在linux中fork函数是非常重要的函数,它从已存在进程中创建⼀个新进程。新进程为子进程,而原进程为父进程。 进程调用fork,当控制转移到内核中的fork代码后,内核做: • 分配新的内存块和内核数据结构给子进程 • 将父进程部分数据结构内容拷贝至…

Vue3学习笔记2——路由守卫

路由守卫 全局 router.beforeEach((to, from, next) > {})router.afterEach((to, from, next) > {}) 组件内守卫 beforeRouteEnter((to, from, next) > {})beforeRouteUpdate((to, from, next) > {})beforeRouteLeave((to, from, next) > {}) 路由独享 be…

AI与无人零售:如何通过智能化技术提升消费者体验和运营效率?

引言&#xff1a;无人零售不只是无人值守 你走进一家无人便利店&#xff0c;没有迎宾、没有收银员&#xff0c;甚至没有一个人在场&#xff0c;但你刚拿起商品&#xff0c;货架旁的摄像头就悄悄“看懂”了你的动作&#xff0c;系统已经在后台为你记账。你以为只是没人管&#x…

如何在3dMax中使用UVW展开修改器?

UVW展开(Unwrap UVW)修改器是3dmax中的一个强大工具,允许对纹理如何应用于3D模型进行精确控制。 与更简单的UVW Map修改器不同,Unwrap UVW修改器提供了高级选项,用于手动编辑纹理映射,对于详细和复杂的模型来说是必不可少的。 在本文中,我们将探讨增强您对Unwrap UVW修…

【Linux】进程优先级与进程切换理解

&#x1f31f;&#x1f31f;作者主页&#xff1a;ephemerals__ &#x1f31f;&#x1f31f;所属专栏&#xff1a;Linux 目录 前言 一、进程优先级 1. 什么是进程优先级 2. 为什么有进程优先级 3. 进程优先级的作用 4. Linux进程优先级的本质 5. 修改进程优先级 二、进…

【Hive入门】Hive高级特性:事务表与ACID特性详解

目录 1 Hive事务概述 2 ACID特性详解 3 Hive事务表的配置与启用 3.1 启用Hive事务支持 3.2 创建事务表 4 Hive事务操作流程 5 并发控制与隔离级别 5.1 Hive的锁机制 5.2 隔离级别 6 Hive事务的限制与优化 6.1 主要限制 6.2 性能优化建议 7 事务表操作示例 7.1 基本…

二叉树算法精解(Java 实现):从遍历到高阶应用

引言 二叉树&#xff08;Binary Tree&#xff09;作为算法领域的核心数据结构&#xff0c;在搜索、排序、数据库索引、编译器语法树构建等众多场景中都有着广泛应用。无论是初学者夯实算法基础&#xff0c;还是求职者备战技术面试&#xff0c;掌握二叉树相关算法都是不可或缺的…

ES6入门---第二单元 模块二:关于数组新增

一、扩展运算符。。。 1、可以把ul li转变为数组 <script>window.onloadfunction (){let aLi document.querySelectorAll(ul li);let arrLi [...aLi];arrLi.pop();arrLi.push(asfasdf);console.log(arrLi);};</script> </head> <body><ul><…

Nature正刊:新型折纸启发手性超材料,实现多模式独立驱动,变形超50%!

机械超材料是一种结构化的宏观结构&#xff0c;其几何排列方式具有独特的几何结构&#xff0c;从而具有独特的力学性能和变形模式。超材料的宏观特性取决于中观尺度晶胞的具体形状、尺寸和几何取向。经典的结构化晶胞&#xff0c;例如以拉伸为主的八面体桁架单元和以弯曲为主的…

Servlet(二)

软件架构 1. C/S 客户端/服务器端 2. B/S 浏览器/服务器端&#xff1a; 客户端零维护&#xff0c;开发快 资源分类 1. 静态资源 所有用户看到相同的部分&#xff0c;如&#xff1a;html,css,js 2. 动态资源 用户访问相同资源后得到的结果可能不一致&#xff0c;如&#xff1a;s…

循环缓冲区

# 循环缓冲区 说明 所谓消费&#xff0c;就是数据读取并删除。 循环缓冲区这个数据结构与生产者-消费者问题高度适配。 生产者-产生数据&#xff0c;消费者-处理数据&#xff0c;二者速度不一致&#xff0c;因此需要循环缓冲区。 显然&#xff0c;产生的数据要追加到循环缓…

嵌入式硬件篇---STM32 系列单片机型号命名规则

文章目录 前言一、STM32 型号命名规则二、具体型号解析1. STM32F103C8T6F103:C:8:T6:典型应用2. STM32F103RCT6F103:R:C:T6:典型应用三、命名规则扩展1. 引脚数与封装代码2. Flash 容量代码3. 温度范围代码四、快速识别技巧性能定位:F1/F4后缀差异硬件设计参考:引脚数…