Party Cat0%

20/04/25

ReactRouterTrucs&SourceReview

Reptes web | b01lersCTF 2025

Thanks for sharing!

بِسْمِ اللَّهِ الرَّحْمَنِ الرَّحِيمِ

React Router Trucs & Source Review
I know your browser history
Hola de nou i benvinguts a un altre escrit! És l'Omar (també conegut com Mushroom) i avui tenim algunes idees interessants de b01lersCTF en reptes web. Aquesta vegada participava amb l'equip lil L3ak, un equip tan increïble amb tanta gent interessant!
He tractat 2 reptes aquí, el segon és fàcil i el primer té una mica de picant!
No perdem més temps i endinsem-nos directament.

Repte 1: problemes a l'spa

Em va agradar la idea d'aquest repte. Vaig proporcionar una explicació tècnica detallada ♥️
Descripció del repte: vaig tenir aquesta idea d'aplicacions d'un milió de dòlars l'altre dia, però no puc fer que el meu encaminament funcioni! Només faig servir eines i marcs d'última generació, així que aquest no pot ser el problema... oi? Em pots portar fins al punt final dels meus somnis?
Té alguna cosa a veure amb enrutament. Comprovem el codi font.
Era una aplicació senzilla, sense lògica complicada, la part principal és la següent:
App.tsx té la pàgina principal i Flag.tsx té la bandera, es mostra que es troba sota el camí /flag.
Així que vaig visitar l'enllaç del repte https://ky28060.github.io/ i vaig visitar /flag, però vaig obtenir 404 No s'ha trobat...
De fet, també vaig visitar el seu github repo i de fet no hi havia cap altra pàgina, només index.html
Hi havia un fitxer js molt obfisticat, hi vaig passar una estona, però no em va donar res (tot i que és el meu dolent, no em vaig creure l'autor quan va escriure 'No em rev :(')
rev
Ara, com que el repte és sobre l'encaminament (específicament React Routing), aprenem-ne una mica.
Què fa l'encaminament del costat del client de react? Permet la navegació entre pàgines sense actualitzar el navegador, utilitzant JavaScript per actualitzar dinàmicament el contingut sense necessitat de tornar a trucar al servidor per a una pàgina nova. Comproveu-ho si necessiteu més detalls
Com que Flag.tsx s'importa al codi, s'inclou a JavaScript i existeix a l'aplicació del costat del client. L'error 404 probablement es produeix perquè GitHub Pages no està configurat correctament per gestionar rutes del costat del client com /flag, en lloc de retornar un error del costat del servidor.
React Router, però, encara pot representar el component Flag.tsx si actualitzem l'URL sense activar una recàrrega completa de la pàgina. Per solucionar-ho, obriu la consola de desenvolupadors del navegador i executeu:
Això canvia l'URL a /flag al navegador, demanant a React Router que carregui el component de la bandera i que mostri la bandera, evitant el problema d'encaminament del servidor.
Ara fes
Això detecta els canvis d'URL i actualitza el component representat en conseqüència.

Expliquem-ho una mica més 🙂

Penseu en això com una actualització normal de la pàgina, però al costat del client en lloc del costat del servidor. La recàrrega o l'actualització de la pàgina normal crida al camí específic des del backend, però com acabem de dir... és al costat del client, això és el que fan les ordres anteriors:
  1. Actualitzeu l'URL sense activar una recàrrega completa de la pàgina, fent que sembli que hi vau navegar.
  2. Activa un esdeveniment popstate per indicar a React Router que l'historial ha canviat, de manera que comprova el nou URL /flag i mostra el component Flag.
S'envia un esdeveniment popstate a la finestra cada vegada que l'entrada de l'historial activa canvia entre dues entrades de l'historial per al mateix document. Si l'entrada d'historial que s'està activant s'ha creat per una crida a history.pushState() o s'ha vist afectada per una crida a history.replaceState(), la propietat d'estat de l'esdeveniment popstate conté una còpia de l'objecte d'estat de l'entrada de l'historial. Llegir més
Flag
bctf{r3wr1t1ng_h1st0ry_1b07a3768fc}
Això va ser divertit! Ara acabem amb un de fàcil!

Repte 2: Quan

Aquest repte inclou una aplicació web de jocs d'atzar on els usuaris intenten guanyar una bandera tenint sort amb un hash basat en marca de temps.
Determina la victòria en funció de les marques de temps. El servidor pren l'hora actual de la capçalera Data de les sol·licituds entrants, la converteix en una marca de temps Unix i utilitza SHA-256 per comprimir-la. Si els dos primers bytes del hash són tots dos 0xFF (255), l'usuari guanya i rep la bandera.

Components clau del repte:

app.ts:
També hi havia un límit de tarifa establert a 60 sol·licituds per minut

Vulnerabilitat

La vulnerabilitat clau és que el servidor accepta una capçalera de data personalitzada del client:
Això permet que un atacant enviï una marca de temps específica que generarà un hash amb el patró requerit (dos bytes 0xFF al principi).

Solució

La solució consisteix a trobar una marca de temps Unix que, quan es fa un hash amb SHA-256, produeix un hash on els dos primers bytes són tots dos 0xFF.
Així que vaig fer el següent script:
Després d'executar-lo vaig obtenir: Sun, 20 Apr 2025 03:55:30 GMT. Simplement poseu-lo en una capçalera Date i obtindreu la bandera!
flag
bctf{noranta_nou_percent_de_gamblers_gamble_81dc9bdb}

Això és tot! Espero que hagis après alguna cosa o dues, troba'm A X o Discord. Ens veiem a la propera! 🚀

També et pot interessar