Opis
To zadanie polega na zidentyfikowaniu i wykorzystaniu błędu w systemie cacheowania pseudonimu aktualnego użytkownika.
W ramach tego systemu w composable useAuthState.ts:
// VULNERABILITY: Module-level state leak!
// This object is shared across all concurrent requests in the Node process.
const activeUsersObj: Ref<Record<string, string>> = ref({})
export const useAuthState = () => {
const state = useState<Record<string, string>>('leaked_users_state', () => activeUsersObj)
const setCurrentUser = (solverId: string, username: string) => {
state.value[solverId] = username
activeUsersObj.value[solverId] = username
}
const getCurrentUser = (solverId: string) => {
return state.value[solverId] || null
}
return {
setCurrentUser,
getCurrentUser
}
}
Przez zastosowanie ref na poziomie modułu, obiekt activeUsersObj jest współdzielony pomiędzy wszystkimi równoczesnymi requestami w Nuxtcie.
Oznacza to, że jeśli jeden użytkownik ustawi swój pseudonim, to każdy inny użytkownik, który wykona request w tym samym czasie, może odczytać ten pseudonim jako swój aktualny pseudonim.
W przypadku tego zadania użyta była mapa przechowują pary użytkownika oraz id rozwiązującego, aby zapewnić możliwość rozwiązania zadania przez wielu użytkowników jednocześnie.
Rozwiązanie
Aby rozwiązać zadanie, należy wykonać następujące kroki:
- Założyć konto na stronie
unemployment-is-over-party.hack4krak.pli zalogować się. - Utworzyć aplikacje do pracy.
- Otworzyć stronę
/change-passwordi wprowadzić nowe hasło. - Odświeżyć stronę i skopiować nazwę użytkownika administratora.
- Wylogować się ze strony, zalogować na konto administratora i przejść do panelu administracyjnego.
- Zaakceptować zgłoszenie aplikacji do pracy.
- Zalogować się ponownie na swoje konto i otworzyć stronę
/ticket, gdzie w wiadomości od administratora znajdziesz flagę.