Visualizzazione dei risultati da 1 a 2 su 2

Discussione: Test SQL injection

  1. #1

    Test SQL injection

    Ciao a tutti ho eseguito un test su un sito che sto facendo per testarne le vulnerabilita' e il programma che uso mi ha dato i seguenti risultati:



    Ovviamente i valori che prendo con "$_REQUEST" vengono trattate con "intval" o "addslashes" a seconda del tipo, ma nonostante questo mi vengono fuori queste vulnerabilita'.

    Qualcuno potrebbe aiutarmi?

    Grazie.

  2. #2
    addslashes non risolve il problema, intval lo aggira solo in alcuni contesti

    innanzi tutto devi togliere le slash che PHP inserisce in automatico (se le inserisce in automatico) quindi qualcosa tipo

    codice:
    // Verifica se il magic quote è attivo
    if (get_magic_quotes_gpc())
    {
        // Effettua lo stripslashes ricorsivo su tutti i valori in ingresso
        $_GET       = stripslashes_recursive($_GET);
        $_POST      = stripslashes_recursive($_POST);
        $_COOKIE    = stripslashes_recursive($_COOKIE);
        $_FILES     = stripslashes_recursive($_FILES);
        $_SERVER    = stripslashes_recursive($_SERVER);
    }
    ove la stripslashes_recursive è la seguente funzione
    codice:
    function stripslashes_recursive($Array, $Deep = 0)
    {
        // Verifica la profondità
        if ($Deep >= 10)
        {
            // Se viene superato il valore limite di profondità di 10, eventualmente il
            // valore va cambiato nell'if sopra, in automatico il codice si blocca perché
            // l'array è troppo profondo e si rischiano problemi con la ricorsione o possibili
            // (D)DoS
            throw new Exception(sprintf('Can\'t strip slashes from a so deep array', $Deep));
        }
        
        // Cicla l'array
        foreach($Array as $key => $value)
        {
            // Verifica se è un array
            if (is_array($value))
            {
                // Effettua uno strip slashes ricorsivo
                $Array[$key] = stripslashes_recursive($value, $Deep + 1);
            }
            else
            {
                // Effettua un normale strip slashes
                $Array[$key] = stripslashes($value);            
            }
        }
        
        // Ritorna il valore
        return $Array;
    }
    Questo è importante perché ti permette di avere dati "puliti" in ingresso e ti permette di poterci lavorare su

    Il secondo punto è controllare SEMPRE i dati che ricevi, quindi se sai che il campo id ti arriva da GET ed è sempre numerico devi innanzi tutto controllare $_GET e non $_REQUEST e poi fare qualcosa tipo
    codice:
    $errors = array();
    
    if (isset($_GET['id']) == false)
    {
    $errors[] = "l'id non è stato passato";
    }
    
    else if (is_numeric($_GET['id']) == false)
    {
    $errors[] = "l'id non è numerico
    }
    else if ((int)$_GET['id'] == 0)
    {
    $errors[] = "l'id deve essere maggiore di zero
    }
    else
    {
        // Visto che sono passati i controlli sull'integrità, il sistema verifica che esista la
        // corrispondenza sul database estraendo la riga ed i dati annessi
        // In realtà ho una mia classe facente parte del mio framework che mi permette di
        // estrarre anche le singole righe oltre a lanciare le query, ma preferisco postare del
        // codice "semplificato" :)
        $query = db_query("SELECT * FROM tabella WHERE id = %d LIMIT 1", (int)$_GET['ìd']);
        $riga = false;
        while($row = mysql_fetch_assoc($query))
        {
            $riga = $row;
        }
        mysql_free_result($query);
        
        if ($riga == false)
        {
            $errors[] = "il record richiesto non esiste";
        }
    }
    
    // Vengono effettuate le operazioni esclusivamente se non ci sono errori
    if (count($errors) == 0)
    {
        // fai quello che ti serve qui!
    }
    infine, la funzione db_query, te la posto di seguito
    codice:
    public function db_query($SQL)
    {
        // Acquisisce i parametri
        $parameters = func_get_args();
        
        // Elimina l'sql dall'elenco dei parametri
        array_shift($parameters);
        
        // Cicla i parametri ed effettua l'escape dei parametri
        foreach($parameters as $key => $value)
        {
            // Effettua l'escape dei parametri
            $parameters[$key] = mysql_real_escape_string($value);
        }
        
        // Costruisce l'SQL con i parametri
        if (($sqlWithParameters = @vsprintf($SQL, $parameters)) === false)
        {
            // Visualizza l'errore e termina l'esecuzione
            trigger_error("Errore nei parametri della query: " . $SQL, E_USER_ERROR);
            return false;
        }
        
        // Esegue una query bufferizzata
        $result = @mysql_query($sqlWithParameters);
        
        // Controlla il risultato
        if ($result === false)
        {
            trigger_error("Errore durante l'esecuzione della query " . $sqlWithParameters . ": " . mysql_error(), E_USER_ERROR);
            return false;
        }
        
        // Restituisce il risultato
        return $result;
    }
    utilizza la funzione vsprintf per sostituire ad i vari %d, %s, %f e via dicendo i relativi valori ottenendo in automatico anche la conversione del valore stesso ... prima però effettua l'escape di mysql (che aggiunge gli slash a vari elementi, non solo gli apici) dai parametri passati alla funzione

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.