Portail admin — surface de sécurité S10-S12¶
AdminPortal.jsx est une page React intégrée au frontend e-commerce et accessible publiquement via /admin. Elle est distincte du panneau formateur chaos-admin : son rôle n'est pas de piloter la plateforme mais de servir de surface d'exploitation pour le scénario de sécurité chaîné S10 → S11 → S12 (niveau Master du Chaos Sécurité). C'est là que les étudiants en pentest doivent arriver pour démontrer leur exploitation.
Sources
frontend/src/pages/AdminPortal.jsx, backend/src/main/java/com/perfshop/controller/AdminPortalController.java, endpoints API /api/admin/portal/*
Interface pédagogique vulnérable
Cette page est délibérément mal protégée quand le Chaos Sécurité est au niveau 4 (Master). Elle expose des failles que les étudiants doivent identifier, exploiter et documenter. Elle n'est pas une vraie interface d'administration.
Contexte pédagogique¶
Les niveaux 1 à 3 du Chaos Sécurité activent des failles éparses sur les API du shop (SQLi sur la recherche, IDOR sur les commandes, XSS, timing attack, etc.). Le niveau Master débloque en plus un scénario chaîné qui raconte une histoire de pentest complète :
-
S10 — Stats exposées sans auth (OWASP A09 — Security Logging and Monitoring Failures) L'étudiant découvre
GET /api/admin/portal/statsqui renvoie sans authentification une liste de métriques incluant le contact administrateur (admin@perfshop.fr). Ce simple fuite information est déjà une alerte. -
S11 — SQLi sur le login admin (OWASP A03 — Injection) L'étudiant exploite une injection SQL classique sur
POST /api/admin/portal/loginpour contourner l'authentification. Le payload type est' OR '1'='1'--dans le champ email. Le contrôleur concatène naïvement la chaîne dans une requête SQL quand le Chaos Sécurité Master est actif. -
S12 — IDOR pour élévation de privilèges (OWASP A01 — Broken Access Control) Une fois authentifié (même avec un compte standard), l'étudiant peut appeler
PUT /api/admin/portal/accounts/{id}/promotesans vérification d'appartenance. En ciblant l'ID du superadmin, il se retrouve superadmin et peut alors lire la liste complète des comptes admin avec leurs hash BCrypt.
Le portail expose tout cela dans une interface volontairement sobre (fond sombre, fonte monospace, couleurs violettes) qui évoque un terminal d'administration. Les étudiants sont censés comprendre qu'ils sont dans un terrain d'entraînement et non sur une vraie interface de production.
Voir Chaos Sécurité pour le détail des exploitations.
Route et accès¶
La page est exposée dans App.jsx :
Elle est publique intentionnellement — aucun guard d'authentification. C'est l'étudiant qui doit découvrir son existence (par exemple via une recherche dans le JavaScript bundle, via une URL devinée, ou via les stats exposées qui mentionnent adminContact).
Structure visuelle¶
La page est divisée en trois sections verticales alignées dans un conteneur central (maxWidth: 700px) :
Section 1 — Stats¶
Au chargement (useEffect(() => { fetchStats(); }, [])), la page appelle GET /api/admin/portal/stats et affiche le résultat sous forme de tableau clé/valeur. L'endpoint retourne un objet type :
{
"adminContact": "admin@perfshop.fr",
"version": "0.1.0-beta",
"accountsCount": 3,
"ordersToday": 47,
...
}
Le champ adminContact est la première piste : c'est un email qui servira à l'étape suivante (bruteforce, injection, ou simplement une indication de cible).
Un bouton « Recharger » relance fetchStats() à la demande.
Section 2 — Authentification¶
Un formulaire email/password qui envoie POST /api/admin/portal/login. En cas de succès, le backend retourne :
Le composant stocke adminToken dans son state local et l'utilise pour les appels suivants via le header X-Admin-Token. Un bloc vert affiche les 12 premiers caractères du token en confirmation visuelle.
C'est ici que l'exploitation SQLi (S11) s'applique. Avec un payload ' OR '1'='1'-- dans le champ email, l'étudiant peut passer outre la vérification du mot de passe.
Section 3 — Gestion des comptes¶
Cette section est initialement grisée (opacity: 0.35, pointerEvents: 'none') et n'est activée qu'après obtention d'un adminToken. Elle expose :
- Un champ « ID du compte à promouvoir » (défaut :
1) - Un bouton Promouvoir
- Après promotion réussie, un bouton Voir les comptes admin apparaît
- Un tableau final listant tous les comptes avec leurs colonnes :
ID,Email,SuperAdmin,Hash password,Droits
Les hash password BCrypt sont affichés tronqués (29 caractères + …) — c'est suffisant pour prouver la divulgation mais ne facilite pas le bruteforce direct. C'est un compromis pédagogique : l'étudiant comprend que des credentials sont leakés sans qu'on lui donne vraiment de quoi casser les hash.
Endpoints API utilisés¶
| Méthode | URL | Auth | Contrôleur |
|---|---|---|---|
GET |
/api/admin/portal/stats |
Aucune (S10) | AdminPortalController |
POST |
/api/admin/portal/login |
Aucune (vulnérable S11) | AdminPortalController |
PUT |
/api/admin/portal/accounts/{id}/promote |
X-Admin-Token mais pas de vérification ownership (S12) |
AdminPortalController |
GET |
/api/admin/portal/accounts |
X-Admin-Token du superadmin |
AdminPortalController |
Voir la référence API Portail admin pour le détail des requêtes et réponses.
Workflow d'exploitation¶
sequenceDiagram
autonumber
participant E as Étudiant
participant P as AdminPortal.jsx
participant B as Backend
E->>P: Navigue sur /admin
P->>B: GET /api/admin/portal/stats
B-->>P: 200 { adminContact, ... }
Note over E,P: S10 — contact admin exposé sans auth
E->>P: POST login avec " ' OR '1'='1'-- "
P->>B: POST /api/admin/portal/login
B-->>P: 200 { adminToken, ... }
Note over E,B: S11 — SQLi réussie, auth contournée
E->>P: Promouvoir ID=1 (superadmin cible)
P->>B: PUT /api/admin/portal/accounts/1/promote
B-->>P: 200 { promoted, isSuperAdmin: true }
Note over E,B: S12 — IDOR, élévation de privilèges
E->>P: Voir les comptes admin
P->>B: GET /api/admin/portal/accounts
B-->>P: 200 { accounts[] avec passwordHash }
Note over E,P: Divulgation massive
Différence avec chaos-admin/gestion.html¶
Le panneau formateur gestion.html (voir Chaos admin) est une véritable interface de gestion des comptes admin : il est protégé par sessions HTTP, requiert le rôle superadmin, et valide rigoureusement les actions. AdminPortal.jsx au contraire est une simulation d'interface vulnérable qui sert uniquement pour l'exercice pédagogique S10-S12. Les deux pages utilisent des endpoints backend différents (/api/admin/* vs /api/admin/portal/*) et ne partagent ni session ni token.
État du Chaos Sécurité¶
Quand le Chaos Sécurité est en dessous du niveau Master, les endpoints /api/admin/portal/* répondent 403 Forbidden ou 404 Not Found — la page affiche alors des erreurs rouges. Pour utiliser AdminPortal, il faut :
- Activer une licence PerfShop (sans licence,
POST /loginrenvoie 402) - Activer le Chaos Sécurité au niveau Master depuis le panneau formateur
- Naviguer sur
/admindepuis le shop