Frontend zdradził
mapę backendu.
Techniczne case study z pentestu Next.js: __NEXT_DATA__, bundle JavaScript, ukryte endpointy, nadmiarowe propsy, request/response i rekomendacje dla zespołów dev.
w źródle
w bundle
odpowiadała
propsów
Frontend potrafi zdradzić architekturę backendu
Next.js, SSR i hydratacja są świetne dla UX, ale z perspektywy pentestera mają jedną cechę: dużo stanu aplikacji trafia do HTML albo bundle JavaScript. Nie wszystko jest podatnością. Ale nadmiarowe dane w __NEXT_DATA__, feature flagach i propsach potrafią odsłonić endpointy, role, identyfikatory, logikę biznesową i czasem tokenopodobne wartości.
Ten case jest zanonimizowany i syntetyczny. Nie pokazujemy prawdziwego HTML klienta, nazw API, hostów ani wartości. Pokazujemy metodykę, przykładowe wzorce i to, jak z pozornie nudnego HTML-a zrobić sensowny rekonesans techniczny.
Pierwszy request bez logowania
Na tym etapie nie ma jeszcze „luki”. Jest mapa. Wiemy, gdzie jest API, jakie flagi istnieją, jakie filtry obsługuje backend i jak aplikacja nazywa role. To skraca rekonesans i pozwala pisać celowane testy zamiast ślepego fuzzingu.
Szukamy danych, których nie powinno być w HTML
Dobre znaleziska to nie „znaleźliśmy słowo admin”. Dobre znalezisko to np. endpoint eksportu, który nie jest widoczny w UI, ale istnieje w propsach; flaga funkcji wewnętrznej; ID tenantów; nazwy ról; ukryte statusy workflow; albo dane użytkowników, które nie są renderowane, ale są w stanie strony.
Routing i endpointy z klienta
Bundle JavaScript to dokumentacja API napisana przez frontend. Nie jest problemem sam fakt istnienia tras. Problem zaczyna się wtedy, gdy backend ufa temu, że trasy „nie są w UI”.
Endpoint ukryty w bundle nie oznacza podatności. Trzeba go sprawdzić.
Tu pojawił się realny problem: endpoint zwracał dane procesu wewnętrznego zwykłemu użytkownikowi. Źródłem rekonesansu był Next.js, ale podatność była klasyczna: brak autoryzacji i nadmiarowe dane w API.
Waga zależy od pól. Same feature flagi to zwykle informacja pomocnicza. Dane wewnętrzne, statusy moderacji, notatki, e-maile, telefony, identyfikatory tenantów lub endpointy eksportu mogą podnieść ryzyko do High.
To mapa, która pokazuje, gdzie scanner ma patrzeć.
Checklist pentestera dla Next.js/SSR
Nadmierne propsy
Czy HTML zawiera pola niewidoczne w UI: e-maile, telefony, role, statusy, notatki, ceny, ID tenantów.
Endpointy z bundle
Czy trasy znalezione w JS mają poprawną autoryzację i walidację po stronie serwera.
Feature flags
Czy flagi ujawniają funkcje wewnętrzne, nazwy eksperymentów, segmenty klientów albo logikę płatności.
Build artifacts
Czy sourcemapy, stare buildy, preview deployments albo publiczne assety nie odsłaniają kodu i komentarzy.
Nie walcz z Next.js. Walcz z nadmiarem danych.
1. Minimalizuj pageProps. Do HTML wysyłaj tylko to, co konieczne do renderowania bieżącego widoku.
2. Autoryzuj każdy endpoint. Ukrycie endpointu w UI nie jest zabezpieczeniem. Backend musi sprawdzać rolę, właściciela i tenant.
3. Wyłącz sourcemapy publicznie. Jeżeli sourcemapy są potrzebne, ogranicz dostęp i kontroluj proces publikacji.
4. Przeglądaj bundle przed release. Automatyczny grep po słowach typu internal, admin, token, secret, apiBase, featureFlags potrafi wyłapać regresje.
Masz Next.js, React SSR albo frontend z dużym bundle?
Sprawdzimy, czy frontend nie publikuje mapy backendu, danych wewnętrznych, endpointów i funkcji, których nie powinien widzieć zwykły użytkownik.
Zamów test bezpieczeństwa →