Description du Projet 📝
Ce dépôt contient une extraction structurelle (Dump) et une analyse de vulnérabilité d'un système de borne interactive (Kiosk) utilisé en environnement de production par une enseigne majeure du multimédia (Secteur Europe/Suisse). Le but est pédagogique : exposer des patterns d'implémentation et des erreurs fréquentes en environnement retail.
Failles de sécurité identifiées (CWE)
- CWE-798 — Use of Hard-coded Credentials : mot de passe admin exposé côté client / code.
- CWE-312 — Cleartext Storage of Sensitive Information : mots de passe / identifiants stockés en clair dans
data/product.json. - CWE-200 — Exposure of Sensitive Information to an Unauthorized Actor : fichiers de configuration et dumps lisibles sur FS.
- CWE-78 — Improper Neutralization of Special Elements used in an OS Command (OS Command Injection) : exécution de scripts locaux (.bat / powershell) — potentielle / non confirmée : évaluer le risque si des entrées utilisateur sont utilisées.
- CWE-276 — Incorrect Default Permissions : fichiers JSON et assets potentiellement accessibles/modifiables par le processus web sans durcissement.
Stack technique observé 🧰
- Frontend / UI :
web/product.php(single-file PHP rendering), CSS/JS embarqués. - Stockage local :
data/product.json(JSON plat) et fichiers texte (ex :web/assets/selected_image.txt). - Assets :
web/assets/(images, badges, promos). - Scripts / runtime :
php/(binaires PHP fournis dans l'arborescence) et scripts Windows (quit_kiosk.bat), PowerShell utiles pour déploiement local. - Environnement ciblé : Windows (kiosk mode) / Edge en mode kiosque.
Structure du dump (extrait) 🗂️
data/product.json— données produit, paramètres et translations par langue.web/product.php— point d'entrée de l'UI, logique d'administration et sauvegarde.web/assets/— images et ressources.web/quit_kiosk.bat— script de terminaison du kiosque (Windows).php/— binaires redistribués (serveur local).
Recommandations (remédiations) 🛠️
- Retirer les mots de passe codés en dur et ne jamais les exposer côté client ; implémenter authentification serveur (session).
- Ne jamais stocker un mot de passe en clair : utiliser
password_hash()/password_verify()(PHP) et restreindre l'accès fichier (ACL/permissions). - Restreindre les permissions FS du dossier
data/(owned by kiosk user, chmod minimal). - Éviter d'exécuter directement des commandes OS depuis le code applicatif ; isoler ce comportement dans un service sécurisé ou utiliser API OS limitée.
- Ajouter journalisation et alerting, surveiller accès et modifications de
product.json. - Valider et encoder toutes les entrées utilisateur (même dans l'admin local).
Méthodologie 🔬
- Analyse statique du code source disponible, inspection des fichiers dumpés et des scripts.
- Pas de tests d'intrusion actifs ni d'exploitation en production dans ce dépôt — l'analyse est limitée au contenu fourni.
Impact 📉
- Hard-coded credentials & mots de passe en clair : sévérité élevée — accès administrateur facile si l'attaquant peut lire les fichiers ou accéder à l'UI.
- Exposition des données produit : sévérité moyenne (confidentialité, fuite de pricing).
Limitations ⚖️
- Audit basé sur artefacts statiques fournis dans le dépôt ; état réel du système en production (permissions OS, réseaux, politiques de déploiement) non vérifié.
Disclaimer ⚖️
Ce projet est une étude de cas en cybersécurité. Tous les noms de marques, identifiants réels et données sensibles ont été anonymisés ou modifiés ([Enseigne originale] -> YellowKiosk). L'auteur n'encourage aucune activité illégale et décline toute responsabilité quant à l'usage de ces informations.
Licence / Usage 📚
Usage éducatif seulement — voir badge Licence en entête.
Mode d'emploi (Kiosk — FR) 🧭
- Mot de passe admin (par défaut):
Admin_1025. Si vous changez le mot de passe via l'interface admin, la nouvelle valeur est persistée dans data/product.json soussettings.admin_pwd. - Accès au panneau admin: triple-cliquez sur le titre du produit (haut à gauche). Une boîte de saisie de mot de passe s'ouvre ; saisissez le mot de passe admin pour afficher le panneau d'édition.
- Changer le mot de passe admin: dans le panneau admin, onglet "Accès Administration", renseignez un nouveau mot de passe dans le champ "Modifier le mot de passe admin" puis cliquez sur "💾 Mettre à jour l'étiquette" pour sauvegarder.
- Modifier le produit: depuis le panneau admin (formulaire), vous pouvez modifier et sauvegarder les champs suivants (chemins JSON entre parenthèses) :
- Code Article (SKU):
article.code_article - Désignation / Titre affiché (par langue):
article.designationettranslations[<lang>].article.designation - Taille Écran (par langue):
article.ecranettranslations[<lang>].article.ecran - RAM:
pc.ram_gb - Système (par langue):
pc.systemeettranslations[<lang>].pc.systeme - Processeur (par langue):
pc.processeurettranslations[<lang>].pc.processeur - Carte Graphique (par langue):
pc.carte_graphiqueettranslations[<lang>].pc.carte_graphique - Stockage (par langue):
pc.stockageettranslations[<lang>].pc.stockage - Accessoires (par langue):
pc.accessoiresettranslations[<lang>].pc.accessoires - Chargeur: valeur canonique dans
pc.chargeur_key(ex:included) et étiquette localisée danspc.chargeur/translations[<lang>].pc.chargeur - Prix de base / Prix promo:
article.prix_yellowkiosk,article.prix_promo - Type de prix: clé canonique dans
article.type_prix_key(libellés localisés) - Devise d'affichage:
settings.devise(chfoueur) - Langue d'administration:
settings.lang(fr,en,de,es) — changer la langue pré-remplit les champs depuistranslations[lang]si disponibles.
- Code Article (SKU):
- Sauvegarde: le bouton "💾 Mettre à jour l'étiquette" envoie les modifications au serveur (
POSTversweb/product.php) qui met à jourdata/product.jsonetweb/assets/selected_image.txtde façon atomique. - Images: placer les images dans
web/assets/; la sélection se fait dans le panneau admin.web/assets/selected_image.txtcontient les deux images sélectionnées (haut / bas). - Changer la langue côté affichage:
- Temporaire (URL): ajouter
?lang=fr|en|de|esà l'URL. - Permanent: sélectionner la langue dans le panneau admin et sauvegarder (
settings.lang).
- Temporaire (URL): ajouter
- Devise d'affichage:
- URL:
?devise=chf|eurforce l'affichage en CHF ou EUR. - Permanent: sélectionner la devise dans le panneau admin et sauvegarder (
settings.devise).
- URL:
- Quitter le kiosque: bouton "Quitter le kiosk" → confirmation → déclenche
POST quit_kioskversweb/product.php. Sur Windows,web/quit_kiosk.batest exécuté pour forcer l'arrêt demsedge.exe,php.exeetcmd.exe.⚠️ Action destructive. - Démarrer localement:
# depuis la racine du dépôt (si php dans le PATH)
cd web
php -S localhost:8000ou sous Windows avec le binaire fourni :
cd web
..\\php\\php.exe -S localhost:8000- Sécurité / Remarques importantes:
- Le mot de passe admin est stocké en clair dans
data/product.json: risque majeur. Pour un déploiement sécurisé, utiliserpassword_hash()/password_verify(), restreindre les permissions FS et ne jamais exposer les secrets côté client. - L'action "Quitter le kiosk" exécute des commandes système ; vérifier les droits et l'environnement avant d'exposer cette fonctionnalité.
- Le mot de passe admin est stocké en clair dans
Project Description 📝
This repository contains a structural extraction (dump) and a vulnerability analysis of an interactive kiosk system used in production by a major multimedia retailer (Europe/Switzerland). The work is academic/pedagogical and highlights common insecure patterns.
Identified security issues (CWE)
- CWE-798 — Use of Hard-coded Credentials.
- CWE-312 — Cleartext Storage of Sensitive Information.
- CWE-200 — Exposure of Sensitive Information to an Unauthorized Actor.
- CWE-78 — OS Command Injection (potential) when executing local scripts.
- CWE-276 — Incorrect Default Permissions.
Observed stack 🧰
web/product.php(single-file PHP app), local JSON data store, assets folder, Windows batch/PowerShell scripts, PHP runtime packaged in repository.
Dump structure (excerpt) 🗂️
data/product.json— product data, settings, translations.web/product.php— UI and admin endpoints.web/assets/— images.web/quit_kiosk.bat— shutdown helper script.
Recommendations 🛠️
- Remove hard-coded and client-exposed credentials; implement server-side auth and session management.
- Never store plaintext passwords; use secure hashing and protect file permissions.
- Harden file/directory permissions and limit write access to the kiosk service account.
- Avoid executing arbitrary shell commands; if required, run through hardened privileged service.
Methodology 🔬
Static code review + artifact inspection. No active exploitation performed.
Disclaimer ⚖️
This is a case study. All brand names and sensitive data have been anonymized. No illegal actions are endorsed.
Usage Instructions (Kiosk — EN) 🧭
- Default admin password:
Admin_1025. If changed via the admin panel, the new value is persisted indata/product.jsonundersettings.admin_pwd. - Access the admin panel: triple-click on the product title (top left). A password input box appears; enter the admin password to open the edit panel.
- Change the admin password: in the admin panel, "Administration Access" tab, fill in the new password and click "💾 Update label" to save.
- Edit the product: from the admin panel, the following fields can be edited (JSON paths in parentheses):
- SKU:
article.code_article - Designation / Display title (per language):
article.designationandtranslations[<lang>].article.designation - Screen size (per language):
article.ecranandtranslations[<lang>].article.ecran - RAM:
pc.ram_gb - OS (per language):
pc.systemeandtranslations[<lang>].pc.systeme - CPU (per language):
pc.processeurandtranslations[<lang>].pc.processeur - GPU (per language):
pc.carte_graphiqueandtranslations[<lang>].pc.carte_graphique - Storage (per language):
pc.stockageandtranslations[<lang>].pc.stockage - Accessories (per language):
pc.accessoiresandtranslations[<lang>].pc.accessoires - Charger: canonical key in
pc.chargeur_key(e.g.included), localized label inpc.chargeur/translations[<lang>].pc.chargeur - Base price / Promo price:
article.prix_yellowkiosk,article.prix_promo - Price type: canonical key in
article.type_prix_key(localized labels) - Display currency:
settings.devise(chforeur) - Admin language:
settings.lang(fr,en,de,es) — changing language pre-fills text fields fromtranslations[lang]if available.
- SKU:
- Save: the "💾 Update label" button sends changes to the server (
POSTtoweb/product.php), which atomically updatesdata/product.jsonandweb/assets/selected_image.txt. - Images: place images in
web/assets/; selection is done via the admin panel.web/assets/selected_image.txtholds the two selected images (top / bottom). - Change display language:
- Temporary (URL): append
?lang=fr|en|de|esto the URL. - Permanent: select language in admin panel and save (
settings.lang).
- Temporary (URL): append
- Display currency:
- URL:
?devise=chf|eurforces CHF or EUR display. - Permanent: select currency in admin panel and save (
settings.devise).
- URL:
- Quit kiosk: "Quit kiosk" button → confirmation → triggers
POST quit_kiosktoweb/product.php. On Windows,web/quit_kiosk.batis executed to force-killmsedge.exe,php.exeandcmd.exe.⚠️ Destructive action. - Run locally:
# from the repository root (if php is in PATH)
cd web
php -S localhost:8000Or on Windows with the bundled binary:
cd web
..\\php\\php.exe -S localhost:8000- Security notes:
- The admin password may be stored in plaintext in
data/product.json— major risk. For secure deployment, usepassword_hash()/password_verify(), restrict FS permissions and never expose secrets client-side. - The "Quit kiosk" action executes system commands; verify rights and execution environment before exposing this feature.
- The admin password may be stored in plaintext in
Projektbeschreibung 📝
Dieses Repository enthält einen strukturellen Dump und eine Verwundbarkeitsanalyse eines interaktiven Kiosk-Systems, eingesetzt in Produktion bei einem großen Multimedia-Händler (Europa/Schweiz). Ziel ist die Aufdeckung typischer Sicherheitsfehler.
Gefundene Schwachstellen (CWE)
- CWE-798 — Hard-coded Credentials.
- CWE-312 — Speicherung sensibler Daten im Klartext.
- CWE-200 — Offenlegung sensibler Informationen.
- CWE-78 — Potentielle OS-Befehls-Injektion beim Ausführen lokaler Skripte.
- CWE-276 — Falsche Standardberechtigungen.
Beobachteter Stack 🧰
PHP (single-file UI), lokale JSON-Daten, Windows-Batch/PowerShell-Skripte, Assets-Ordner.
Empfehlungen 🛠️
- Entfernen von Hard-coded-Credentials, sichere Server-seitige Authentifizierung.
- Keine Speicherung sensibler Passwörter im Klartext; Hashing + restriktive Dateiberechtigungen.
Haftungsausschluss
Dieses Projekt ist eine Fallstudie; Markennamen und sensible Daten wurden anonymisiert.
Bedienungsanleitung (Kiosk — DE) 🧭
- Standard-Admin-Passwort:
Admin_1025. Bei Änderung über das Admin-Panel wird der neue Wert indata/product.jsonuntersettings.admin_pwdgespeichert. - Admin-Panel öffnen: dreifach auf den Produkttitel (oben links) klicken. Ein Passwortfeld erscheint; Admin-Passwort eingeben, um das Bearbeitungspanel zu öffnen.
- Passwort ändern: im Admin-Panel, Tab "Zugang Administration", neues Passwort eingeben und "💾 Etikett aktualisieren" klicken.
- Produkt bearbeiten: folgende Felder sind über das Admin-Formular editierbar (JSON-Pfade in Klammern):
- SKU:
article.code_article - Bezeichnung / Angezeigter Titel (pro Sprache):
article.designationundtranslations[<lang>].article.designation - Bildschirmgröße (pro Sprache):
article.ecranundtranslations[<lang>].article.ecran - RAM:
pc.ram_gb - Betriebssystem (pro Sprache):
pc.systemeundtranslations[<lang>].pc.systeme - Prozessor (pro Sprache):
pc.processeurundtranslations[<lang>].pc.processeur - Grafikkarte (pro Sprache):
pc.carte_graphiqueundtranslations[<lang>].pc.carte_graphique - Speicher (pro Sprache):
pc.stockageundtranslations[<lang>].pc.stockage - Zubehör (pro Sprache):
pc.accessoiresundtranslations[<lang>].pc.accessoires - Ladegerät: kanonischer Schlüssel in
pc.chargeur_key(z.B.included), lokalisiertes Label inpc.chargeur/translations[<lang>].pc.chargeur - Basis-/Aktionspreis:
article.prix_yellowkiosk,article.prix_promo - Preistyp: kanonischer Schlüssel in
article.type_prix_key(lokalisierte Labels) - Anzeigewährung:
settings.devise(chfodereur) - Admin-Sprache:
settings.lang(fr,en,de,es) — Sprachwechsel füllt Textfelder austranslations[lang]vor, falls verfügbar.
- SKU:
- Speichern: Schaltfläche "💾 Etikett aktualisieren" sendet Änderungen an den Server (
POSTanweb/product.php), derdata/product.jsonundweb/assets/selected_image.txtatomar aktualisiert. - Bilder: Bilder in
web/assets/ablegen; Auswahl erfolgt im Admin-Panel.web/assets/selected_image.txtenthält die zwei ausgewählten Bilder (oben / unten). - Anzeigesprache ändern:
- Temporär (URL):
?lang=fr|en|de|esan die URL anhängen. - Permanent: Sprache im Admin-Panel auswählen und speichern (
settings.lang).
- Temporär (URL):
- Anzeigewährung:
- URL:
?devise=chf|eurerzwingt CHF- oder EUR-Anzeige. - Permanent: Währung im Admin-Panel auswählen und speichern (
settings.devise).
- URL:
- Kiosk beenden: Schaltfläche "Kiosk beenden" → Bestätigung → löst
POST quit_kioskanweb/product.phpaus. Unter Windows wirdweb/quit_kiosk.batausgeführt, ummsedge.exe,php.exeundcmd.exezu beenden.⚠️ Destruktive Aktion. - Lokal starten:
# vom Repository-Stammverzeichnis (wenn php im PATH)
cd web
php -S localhost:8000Oder unter Windows mit dem mitgelieferten Binary:
cd web
..\\php\\php.exe -S localhost:8000- Sicherheitshinweise:
- Das Admin-Passwort kann im Klartext in
data/product.jsongespeichert sein — hohes Risiko. Für sichere Deploymentspassword_hash()/password_verify()verwenden, FS-Berechtigungen einschränken und Secrets niemals client-seitig exponieren. - Die Aktion "Kiosk beenden" führt Systembefehle aus; Rechte und Ausführungsumgebung vor Einsatz prüfen.
- Das Admin-Passwort kann im Klartext in