Giovedì, 24 Gennaio 2019 17:24

Esempio di SQL Injection in PHP (parte 2)

Scritto da

Un altro esempio sull'argomento delle SQL Injection dopo l'articolo gia visto precedentemente con la form di login che potete rileggere qui. Questa volta invece di compilare la form in modo malevolo, sfruttiamo una possibile vulnerabilità del PHP: il passaggio di parametri attraverso URL e la funzione GET[].

Predisponiamo una prova sfruttando il db precedente di cui useremo la tabella prodotti. Creiamo uno script php che possiamo chiamare prodotti.php

<?php
$mysql_host = 'localhost';
$mysql_user = 'test';
$mysql_pass = 'test';
$mysql_db = 'test';
/* Connessione e selezione del database */
$connessione = mysqli_connect($mysql_host,$mysql_user,$mysql_pass);
if(mysqli_connect_errno())
  die("Connessione non riuscita: " . mysqli_error($connessione));
$db_select= mysqli_select_db($connessione,$mysql_db);
if (!$db_select)
  die("Selezione del database non riuscita");

//passa il parametro via link http://127.0.0.1/prodotti.php?idp=1
$idp = $_GET["idp"];
$sql = "select codice, descrizione, prezzo from prodotti where idp = $idp ";
print $sql;
$res = mysqli_query($connessione,$sql) or die("Errore in check.php : " . mysqli_error($connessione));
while ($row = mysqli_fetch_array($res, MYSQLI_ASSOC))
{
  print "<div style=’margin-left:30px; margin-top:30px; width:400px; padding:30px; border: 1px solid brown; font-family:Helvetica’>";
  print "Scheda prodotto : <br>";
  print "CODICE: <b>{$row["codice"]}</b><br>";
  print "DESCRIZIONE: <b>{$row["descrizione"]}</b><br>";
  print "PREZZO: <b>{$row["prezzo"]}</b><br>";
  print "</div>";
}
?>

Come possiamo vedere, lo script semplicemente si collega al db, reperisce un prodotto e ne stampa le informazioni tabellate. Per esempio, potremmo lanciare lo script opportunamente piazzato nella directory del nostro server web con il seguente URL

http://127.0.0.1/prodotti.php?idp=1 equivalente a http://localhost/prodotti.php?idp=1

Questo potrebbe essere un link che si lancia da un'altra pagina in modo ingenuo. Un attaccante malevolo potrebbe provare ad inserire un frammento di codice sql malevolo come il seguente

http://localhost/prodotti.php?idp=1 union select username, password, 0 from users;

Come possiamo vedere, il codice malevolo non opportunamente confinato crea un bug che permette all'attaccante di visualizzare le credenziali del nostro database! 

Come difenderci da questi attacchi?

Esistono funzioni predefinite, ovviamente a prova di errore come mysqli_real_escape_string che eliminano alcuni caratteri non ammissibili come le virgolette, chiocciole, cancelletti. 

Un esempio di codice potrebbe essere il seguente:

$idp_sicuro = mysqli_real_escape_string($con, $_GET['idp']);

Altri sistemi utilizzatissimi sono sicuramente le funzioni:

$pulito = $trim($variabile); //toglie gli spazi
$piupulito = stripslashes($pulito); //toglie gli slash
$quasiperfetto = htmlspecialchars($piupulito); //toglie i caratteri malevoli, apici, &, < e >

Altri sistemi utilizzati per "ripulire" una variabile possono essere di controllare o forzare una tipologia di dato atteso da quella varibile. E' indicato quando si sta passando con GET o POST un dato numerico, ad esempio action.php?idp=1234

//forzare il cast cast (int)$idp o intval($idp)
$idp = (int)$_GET["idp"]

oppure

if (is_numeric($_GET["idp"]))
    echo "ok è solo numero";

//oppure
if (is_numeric($_GET["idp"]) 
    echo "ok!";  

//oppure ancora
if ($idp > 0 || $idp <100) ... 

 

 

 

Letto 288 volte
Prof. Alfredo Centinaro

Docente di "Scienze e tecnologie informatiche", "Tecnologie e progettazione di sistemi informatici", "Sistemi e Reti" presso IIS Alessandrini-Marino (Teramo), consulente e sviluppatore web. Ha collaborato per anni come sviluppatore presso MHT - Treviso, assistente Sistemi ed elaborazione dell'informazione in UniTE Corso di laurea in Scienze del turismo culturale, tutor presso Telecom Italia Learning Services (L'Aquila)

Joomla SEF URLs by Artio