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:

  1. Aprire il file php.ini
  2. 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"

 

  1. Dichiarare in formato stringa una particolare query
  2. Impostare quali saranno i parametri
  3. Ricostruire la query in modo da non poter "elidere" eventuali parti.
  4. Esecuzione

PHP Protections

/end

... grazie per l'attenzione.

CSLESS2

By frafolo

CSLESS2

  • 216