Il mio attuale compito è trovare una possibile iniezione SQL in una WebApp PHP. Mentre osservavo il codice sorgente, ho notato che il modo in cui lo script gestisce le statistiche preparate è strano.
$query = db::prepare("SELECT password FROM vault where id=%s", $_POST['id']);
$res = db::commit($query);
La parte interessante della funzione prepare
ha il seguente aspetto:
// escape
foreach ($args as &$value){
$value = static::$db->real_escape_string($value);
}
// prepare
$query = str_replace("%s", "'%s'", $query);
$query = vsprintf($query, $args);
return $query;
Ora, cercando un modo per aggirare questo, ho notato che le virgolette singole sono sfuggite, ovviamente a causa della funzione real_escape_string. Guardando da queste parti, ho trovato il seguente post che afferma che l'impostazione di% s nelle virgolette singole appare in modo molto sospetto . Tuttavia, non ho ancora trovato il modo di sfruttarlo o se è addirittura sfruttabile.
Qualcuno può dirmi se c'è qualcosa di sbagliato da evadere ed elaborare l'input dell'utente in questo modo? So che usare le funzioni di istruzioni preparate su mysqli / PDO originali è un'idea migliore, ma dato che questo non è il mio codice, sarebbe bello scoprire cosa c'è di sbagliato qui e perché non dovresti farlo in questo modo.