Ho trovato una vulnerabilità che consente l'iniezione SQL. Ecco il codice:
$rate = key_check($_REQUEST['q']);
$tbl = key_check($_REQUEST['tbl']);
$ntitle = key_check($_REQUEST['ntitle']);
$ids = key_check($_REQUEST['ids']);
if (empty($ntitle))$ntitle=1;
$numbers=0;
unset($alb);
if (!empty($tbl) && !empty($ids) && is_numeric($ids)){
$query="SELECT * FROM $GLOBALS[wcpref]".key_check($tbl)." where id='$ids'";
#echo "<h2>$query</h2>";
$result_vote=MYSQL_QUERY($query) or die("Error <br>". mysql_error()."<br>".basename(__FILE__)." ".__LINE__." <br><b>$query</b>");
$numbers=MYSQL_NUM_ROWS($result_vote);
$alb = MYSQL_FETCH_ARRAY($result_vote);
}
Ed ecco la funzione di filtro:
function key_check($key) {
if ($key == '') { return ''; }
$key = preg_replace("/[^\w\xB2-\xB4\xBF-\xFF\xA5\xA8\xAA\xAF\xB8\xBA\s]/", "", $key );
if ($key =='_SERVER' OR $key =='_SESSION' OR $key =='_FILES' OR $key =='_REQUEST' OR $key =='GLOBALS') die("<h3>Error variable ".basename(__FILE__)." ".__LINE__."</h3>");
else return $key;
}
Non è possibile capire esattamente quali caratteri sta filtrando, ma nessuna virgola, i segni di uguale e le parentesi sono disponibili nella query SQL di destinazione. Il risultato della query non viene generato nella pagina, quindi probabilmente un attacco deve essere basato sull'errore.
C'è un modo per aggirare il filtro e ottenere dati dal database?