Sicurezza Informatica

Esercitazioni, Competizioni e Test:
LABORATORIO DI SICUREZZA INFORMATICA
a cura di: Francesco (Galt) Faloci
Web Security
-
Web Security
- SQL injection
- Access control
- XSS
Web Sec-... ?
- Attacchi tipici di SQL-Injection
- Contromisure adottate da PHP
- Metodi alternativi per effettuare le query su DB
SQL Injection
- E’ una tecnica di "code injection" usata per attaccare applicazioni di gestione dati
- Vengono inserite delle stringhe di codice SQL malevole all'interno di campi di input in modo che queste ultime vengano poi eseguite
- Sfrutta le vulnerabilità di sicurezza del codice di un'applicazione, ad esempio quando l'input dell'utente non è correttamente filtrato da "caratteri speciali" contenuti nelle stringhe SQL
SQL Injection: Threats
- Effettuare spoof identify
- Modificare dati esistenti
- Causare "repudiation issues" come l'annullamento di transazioni o la modifica dei bilanci
- Ottenere tutti i dati sul sistema; eliminare dati; oppure fare in modo che non siano accessibili
- Diventare amministratori del database server
Web Service
Accessibile tramite la VM precedentemente installata...
Web Service
- Il codice che compone il nostro web Service è al percorso: "/var/www/SQL/Collabtive"
- I file principali che analizzeremo sono
"/var/www/SQL/Collabtive/include/class.user.php"
"/etc/php5/apache2/php.ini"
- Questi file sono modificabili solo da root!
Web Service
- Il database a cui fa riferimento si chiama
"sql_collabtive_db"
- Per accedervi, basta aprire un terminale e digitare:
- mysql -u root -pseedubuntu
- use sql_collabtive_db
- show tables;
- SELECT * FROM user;
PHP Protection
La prima cosa da fare è disattivare una protezione che ha il php5 contro questo tipo di attacchi
Per fare questo bisogna:
- Aprire il file php.ini
- Sostituire il campo magic_quotes_gpc = On con Off
PHP Protection
Per rendere effettiva la modifica, bisogna riavviare il servizio!
Web Service: challenge 1
Ora proviamo ad autenticarci nel sito con
l’account avente user alice
- Lo scopo è aggirare la query al db che effettua la verifica delle credenziali
- La funzione è contenuta nel file class.user.php
... individuare la query vulnerabile!
Web Service: challenge 1
Web Service: challenge 2
La query che vorremmo ottenere dovrà essere di questo tipo:
SELECT [...] FROM user WHERE (name = ‘alice’)
Per fare questo bisognerà commentare tutto ciò che viene dopo alice’)
Consiglio: i commenti in SQL si fanno
con # o con - - seguito da uno spazio
Web Service: challenge 2
Web Service: challenge 2
Web Service: challenge 3
Proviamo ora a concatenare due query in modo da:
- Loggare tramite l’account alice
- Modificare il db inserendo nel campo email dell’utente ted l’email: ted@syr.edu
Consiglio: la query ideale sara qualcosa come:
alice’); UPDATE user SET email='ted@syr.edu' WHERE name = 'ted' #
Web Service: challenge 3
Web Service: challenge 3
La query fallisce in quanto l’applicazione utilizza
per fare la query la funzione mysql_query()
- Questa funzione impedisce l’esecuzione di query multiple
- Per questo motivo trova un errore e impedisce anche il login
Web Service
Non possiamo quindi modificare il DB tramite la pagina di log
Spostiamoci dentro la pagina di modifica dell’utente di Alice
- Qui possiamo vedere tutti i campi modificabili per l’account alice
- La query che sta dietro alla modifica di questi dati è...
Web Service
Web Service
Web Service: challenge 4
Modificare l'utente ted in modo che abbia
- mail = ciao@mail.it
- country = italy
Consiglio: si possono utilizzare differenti approcci
... ma perché non logare come ted?
Web Service: challenge 4
Web Service: challenge 4
Web Service: challenge 4
PHP Protections
Ristabiliamo la contromisura principale.
Impostiamo di nuovo ad Off il magic quotes sul file php.ini
Resettiamo Apache...
- Utilizzeremo la funzione mysql_real_escape_string()
Questa funzione ci consente di escludere da user e password i caratteri speciali
- Per attivarla andiamo quindi nel file class.user.php ed apportiamo le seguenti modifiche
PHP Protections
PHP Protections
PHP Protections
Come ultima contromisura utilizzeremo la logica dichiarative dei "prepare statements"
- Dichiarare in formato stringa una particolare query
- Impostare quali saranno i parametri
- Ricostruire la query in modo da non poter "elidere" eventuali parti.
- Esecuzione
PHP Protections
/end

... grazie per l'attenzione.
CSLESS2
By frafolo
CSLESS2
- 216