it-swarm.dev

C'è qualche iniezione SQL per questo PHP?

Voglio scrivere un modulo di accesso e ho preso un esempio dal web. Voglio sapere, se c'è qualche iniezione SQL per questo codice? In caso affermativo, come potrebbe essere la voce del modulo Web dell'exploit?

Questa è la mia forma:

<form method="post" action="">
    <dt class="title"><label for="username">name:</label></dt>
    <dt><input type="text" name="username" id="username"  size="50"></dt>
    <dt class="title"><label for="password">pass:</label></dt>
    <dt><input type="password" name="password" id="password" size="50"></dt>
    <input type="hidden" name="post" value="1" />
    <input type="submit" name="submit" value="submit" class="button">
</form>

e questo è il mio assegno:

if (($post[username]) AND ($post[password])) 
    {
        $query = 'SELECT * FROM `config` WHERE `config_admin_username`="'.$post[username].'" AND `config_admin_password`=MD5("'.$post[password].'") LIMIT 1';
        $sql_user_check = $db->fetch($query);
        if (!$sql_user_check) { 
            $error .= "Wrong Entry.<br />";
        } else {
            $_SESSION[admin] = 1;
            header("Location:index.php");
            exit;
        }
    }

Sto usando phpmyadmin 3.2.0.1 su wamp 2.0i

9
sorroshsaket

Sei nel posto giusto. Benvenuto in sicurezza IT !

c'è qualche iniezione sql per questo codice?

se c'è qual è quella voce?

username: [any username from your website]" /*
password: sux0r")*/ OR ("1"="1

Verrà eseguita questa query:

SELECT * FROM `config` 
WHERE `config_admin_username`="[any username from your website]" /* 
      AND `config_admin_password`=MD5("sux0r")*/ OR ("1"="1") LIMIT 1'

Se rimuoviamo le parti commentate che il motore SQL non analizzerà, ciò si tradurrà in:

SELECT * FROM `config` 
WHERE `config_admin_username`="[any username from your website]" OR ("1"="1") LIMIT 1'

La query SQL verrà analizzata fino alla parte commentata (ho usato il /* e */ coppia start-comment/end-comment nel mio esempio e supponendo che tu stia usando MySQL , ma che può essere diverso a seconda dell'RDBMS utilizzato), disabilitando in modo efficace il controllo della password. Anche se i commenti in-SQL non sono supportati o disabilitati, le opzioni per sfruttare il tuo accesso sono davvero illimitate. Non entrerò nemmeno nella tua scelta di MD5 come algoritmo di hashing della password, poiché hai molte altre cose da considerare prima. Tuttavia, non è chiaramente l'algoritmo hash raccomandato per l'hash della password.

Hai fatto del bene per essere venuto su questo sito Web e che ti stai ponendo domande sulla sicurezza del tuo codice. Congratulazioni, sei già un migliore PHP di quanto non siano mai arrivati ​​finora! Ora tocca a te cosa imparerai da domande e risposte già esistenti qui. Alcuni tag per considera sono php , autenticazione , applicazione web , hash , ...

19
TildalWave

TildalWave ha un'ottima risposta, ma c'è una grande mediazione per l'iniezione SQL che mancava nella risposta. Dichiarazioni preparate. Come ha detto Tildal, l'intera istruzione con l'input dell'utente viene analizzata senza alcuna distinzione analizzabile tra variabili e parti costanti dell'istruzione. La soluzione sta inviando la parte costante dell'istruzione con segnaposto variabili, quindi le variabili. DOP è ciò che uso per la mia interazione SQL. Ecco la funzione che uso ...

function _SQL_QUERY($_base_request, $_request_arguments)
{
                $_DB_USERNAME = "bob"; $_DB_PASSWORD="secret"; $_DB_LOCATION="localhost"; $_DB_NAME="MYWICKEDDATABASE"; $_DB_SERVER_TYPE="mysql";
                if(!isset($_DATABASE_CONNECTION))
                {
                        $_DATABASE_CONNECTION = new PDO("$_DB_SERVER_TYPE:dbname=$_DB_NAME;Host=$_DB_LOCATION;charset=utf8", $_DB_USERNAME, $_DB_PASSWORD);
                        $_DATABASE_CONNECTION->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
                }
                $__STMT = $_DATABASE_CONNECTION->prepare($_base_request);
                if($__STMT->execute($_request_arguments))
                {
                        return $__STMT;
                }
                else
                {
/*
        //Helpful ONLY when debugging!!!
                        echo 'ERROR</ br>';
                        echo $_base_request;
                        echo '</ br>';
                        print_r($__STMT->errorInfo());
                        print_r($_request_arguments);
                        die('</ br>');
*/
                        return false;
                }
}

per usarlo devi solo eseguire questo

_SQL_QUERY("Select * FROM names WHERE name=:var1 AND age=:var2", array('var1'=>'jim','var2'=>50));

Ci sono molti miglioramenti da apportare (principalmente dal punto di vista funzionale) a questo, ma si tratta di un notevole miglioramento delle tradizionali funzioni SQL. A proposito, è importante sapere che se una riga ha un tentativo fallito di un'iniezione nei suoi dati, un backup e un ripristino potrebbero effettivamente riuscire a seconda del metodo utilizzato. Complimenti per fare un audit di sicurezza del tuo codice, se solo più persone imparassero a programmare con quella motivazione verso la sicurezza.

9
David