untori
introduzione alla sql injection
Categories: Skills
informazioni a puro scopo didattico, ovviamente.

La SQL injection è una tecnica dell’hacking mirata a colpire le applicazioni web che si appoggiano su un database di tipo SQL. Questo exploit sfrutta l’inefficienza dei controlli sui dati ricevuti in input ed inserisce codice maligno all’interno di una query
SQL. Le conseguenze prodotte sono imprevedibili per il programmatore:
l’Sql Injection permette al malintezionato di autenticarsi con ampi
privilegi in aree protette del sito (ovviamente, anche senza essere in
possesso delle credenziali d’accesso) e di visualizzare e/o alterare
dati sensibili.

Applicazione pratica [modifica]

Per un esempio pratico ricorreremo ad uno script in PHP (fate riferimento alla documentazione ufficiale di PHP) che si appoggia ad un database MySQL.
La tecnica che è alla base dell’Sql Injection è comunque identica anche
per altri tipi di namedatabase o di linguaggio (come l’ASP). Lo script utilizzato come esempio si occupa di autenticare un utente ed è diviso in due file: il primo è form.html (un semplice form per il login in html), il secondo login.php (che controllerà i dati e stabilirà, se consentito, il login. È in PHP). L’utente visualizza form.html e compila i dati, che verranno automaticamente inviati a login.php, che li memorizza sottoforma di variabile globale $_POST.


form.html

<form action='login.php' method='post'>
Username: <input type='text' name='user' />
Password: <input type='password' name='pwd' />
<input type='submit' value='Login' />
</form>

Il form è molto semplice: ha solo due campi, uno per l’username e uno per la password. I dati immessi verranno poi passati (come detto) a login.php, nelle variabili rispettive $_POST[‘user’] e $_POST[‘pwd’].
Una volta ricevuti questi dati, PHP effettua una query e li cerca
all’interno del database. Se verranno trovati procederà
all’autenticazione dell’utente.


login.php

<?php
//Prepara la query, in una variabile
$query = "SELECT * FROM users WHERE user='".$_POST['user']."' AND pwd='".$_POST['pwd']."'";
//Esegue la query (supponiamo che sia già aperta una connessione valida al database)
$sql = mysql_query($query);
//Conta il numero di righe trovate (se questo numero è maggiore di 0 i dati immessi sono corretti)
if(mysql_affected_rows($sql)>0)
{
//Esegue la convalidazione dell'autenticazione e permette l'accesso a pagine protette
}
?>

L’attacco di Sql-injection sta proprio nell’iniettare nello script
PHP dati arbitrari tramite il form in html. In questo caso, se lo
script non compie i dovuti controlli, basta immettere per esempio come
user pippo e come password 123′ OR ‘1’=’1 per accedere con le credenziali dell’utente pippo. La query per il database diventerà infatti:

SELECT * FROM users WHERE user='pippo' AND pwd='123' OR '1'='1'

La disgiunzione inclusiva OR è uguale al legame logico VEL
e restituisce TRUE se una delle due condizioni è vera. Siccome 1 è
sempre uguale ad 1 la condizione è sempre verificata e quindi il login
come utente pippo viene effettuato.

Proteggersi dalla SQL injection [modifica]

L’unica possibilità di protezione è un controllo sui dati ricevuti
da parte del programmatore, durante lo sviluppo del programma. Bisogna
cioè assicurarsi che l’input ricevuto rispetti le regole necessarie, e
questo può essere fatto in diversi modi:

  • controllare il tipo dei dati ricevuti (se ad esempio ci si aspetta
    un valore numerico, controllare che l’input sia un valore numerico);
  • forzare il tipo dei dati ricevuti (se ad esempio ci si aspetta un
    valore numerico, si può forzare l’input affinché diventi comunque un
    valore numerico);
  • filtrare i dati ricevuti attraverso le espressioni regolari (regex);
  • sostituire i caratteri pericolosi con equivalenti caratteri innocui (ad esempio in entità html, oppure utilizzando le funzioni addslashes e stripslashes di PHP);
  • effettuare l’escape dei dati ricevuti (ogni linguaggio, solitamente, mette a disposizione particolari funzioni per questo scopo).

Ovviamente, questi metodi possono essere applicati anche insieme
sullo stesso dato in input. La scelta varia proprio a seconda delle
tipologie di questi dati. Occorre, quindi, prestare particolare
attenzione a tutte le varianti di un input, tenendo conto di ogni
possibile (oppure improbabile) ipotesi.

Comments are closed.