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?