inyección de SQL basada en error cuando se filtran caracteres especiales

0

Encontré una vulnerabilidad que permite la inyección de SQL. Aquí está el código:

$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);
}

Y aquí está la función de filtrado:

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;
}

No puedo realmente entender qué caracteres está filtrando, pero no hay comas, signos de igual y corchetes disponibles en la consulta SQL de destino. El resultado de la consulta no se envía a la página, por lo que es probable que un ataque tenga que estar basado en errores.

¿Hay alguna forma de omitir el filtro y obtener datos de la base de datos?

    
pregunta Alex Petrov 16.12.2017 - 15:15
fuente

0 respuestas

Lea otras preguntas en las etiquetas