欺騙單頁應用(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.pswp.cn/diannao/81557.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/81557.shtml
英文地址,請注明出處:http://en.pswp.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后綴差異硬件設計參考:引腳數…