Categories
CSRF Seguridad

Vulnerabilidades CSRF en aplicaciones web

Desde hace algún tiempo quería explicar el daño e impacto que pueden llegar a causar este tipo de vulnerabilidades -las cuales son generalmente obviadas por muchos de los que desarrollamos aplicaciones Web; pero por el tiempo y otros problemas, lamentablemente no pude hacerlo 🙂

Patxi, ha publicado un extenso artículo sobre este tema: ¿qué es?, ¿cómo funciona?, medidas de protección. Si entre la audiencia existen desarrolladores de aplicaciones Web que no conocen sobre CSRF, recomiendo que le den una lectura al mencionado artículo.

Categories
.NET Seguridad Sql Injection WTF

Administrar comillas utilizando el método Replace de la clase String

El título hace referencia a un artículo -bastante preocupante por cierto- publicado en el sitio web de El Guille, en el que se presenta una función para evitar el problema con las comillas simples cuando se concatenan sentencias SQL.

En este ejemplo veremos cómo utilizar el método Replace de la clase String. Este ejemplo reemplaza comillas simples entre dos comillas simples adyacentes para asegurarse de que los datos tienen el formato correcto cuando se concatenan valores para una instrucción SQL.

El código que se muestra es el siguiente (en mi opinión, código candidato para WTF):

csharp:

public string QuitarApostrofe(string vCadena)
{
    vCadena = vCadena.Replace("'", "''");
    return vCadena;
}

public void e50factu()
{
    //Cadena a la cual se le va a sustituir la comilla.
    string MiCadena = QuitarApostrofe("WARNER'S DE MEXICO SA DE CV ");
    //Abro la conexion
    ConecServer.Open();
    OleDbCommand mycmd = ConecServer.CreateCommand();
    OleDbTransaction Trans;
    Trans = ConecServer.BeginTransaction(IsolationLevel.ReadCommitted);
    mycmd.Connection = ConecServer;
    mycmd.Transaction = Trans;
    try
    {
        strSQL = "INSERT INTO e50factu(serie50,numero50,descri50) " +
            "VALUES ('" + clsVariables.vSerie + "'," + 20356 + ",'" + MiCadena + "')";
        mycmd.CommandText = strSQL;
        mycmd.ExecuteNonQuery();
        strSQL = "INSERT INTO A50COTI(folio,factura,usuario,hora,serie)" +
            "VALUES(" + 1 + "," + 20356 + "," + "evallejo" + ",'" + "12:00" + "','" + "B" + "')";
        mycmd.CommandText = strSQL;
        mycmd.ExecuteNonQuery();
        Trans.Commit();
    }
    catch (System.Exception error)
    {
        try
        {
            Trans.Rollback();
            MessageBox.Show("Ocurrio un error, no se realizo ningún cambio en la base de datos" +
                error.Message,
                "Guardar Factura", MessageBoxButtons.OK, MessageBoxIcon.Error);
        }
        catch (OleDbException ex)
        {
            if (Trans.Connection != null)
            {
                MessageBox.Show("Ha ocurrido una excepción grave de tipo " + ex.GetType());
            }
        }
    }
    finally
    {
        ConecServer.Close();
    }
}

Personalmente creo que el hecho de que se publiquen o dejen pasar este tipo de recursos en un sitio bastante popular, puede hacer daño a aquellos que recién empiezan y consideran que todo lo que se publica ahí sea información útil y fiable.

Categories
Desarrollo de Software Seguridad Software Libre Web WordPress XSS

Múltiples vulnerabilidades XSS en WordPress y el plugin Akismet

Actualización (09/03/2007): Finalmente ya existe un parche oficial para el problema reportado el lunes pasado (Secunia Advisory SA24430, Ticket WordPress), como había comentado estos fallos afectaban a la rama 2.x y a la última versión de desarrollo, adicionalmente se han hecho correcciones en otros archivos más:

  • Rama 2.0
    • wp-admin/admin-functions.php (equivale al problema reportado en wp-admin/import/mt.php)
  • Rama 2.1
    • wp-admin/admin-functions.php
    • wp-admin/custom-header.php
    • wp-admin/upload-functions.php (no reportado previamente)
    • wp-includes/script-loader.php (no reportado previamente)
  • Versión en desarrollo
    • wp-admin/admin-functions.php
    • wp-admin/custom-header.php
    • wp-admin/upload-functions.php (no reportado previamente)
    • wp-includes/script-loader.php (no reportado previamente)

El fallo todavía persiste en el plugin akismet, hasta que lo solucionen pueden usar la versión modificada que puse hace unos días.


Desde los casi tres años que vengo usando WordPress, es la primera vez que veo que se reportan con mayor frecuencia fallos de seguridad en este CMS, imagino que esto se debe a la popularidad que alcanzó y también a nuevas características que se añaden en cada versión mayor.

Por otro lado, uno de los aspectos que hace de WordPress una aplicación muy extensible y a la vez bastante insegura son los plugins, puesto que los que alguna vez desarrollamos uno de éstos, probablemente hayamos introducido algún fallo de tipo SQL Injection, XSS o el menos tomado en cuenta CSRF, que entre otras cosas van a comprometer la instalación principal de WordPress e inclusive el servidor donde se aloja éste.

Me parece que alguien debería evangelizar la escritura de plugins seguros por el daño que pueden causar sin son mal programados -de nada sirve que los desarrolladores de este CMS se "rompan el lomo" añadiendo características para hacer más seguro el core, si en los plugins casi nadie más las usa por desconocimiento o falta de documentación.

En fin, hago el comentario anterior, puesto gran parte de los plugins que actualmente estoy usando, tienen problemas de seguridad* (XSS y CSRF principalmente), que en la medida de lo posible, intentaré reportarlo a sus autores.

Luego de la larga y aburrida queja, paso a comentar que existen vulnerabilidades de tipo XSS en los siguientes archivos.

  1. wp-admin/edit-comments.php: no se escapan parámetros arbitrarios al momento de realizar la paginación. Prueba de concepto.
  2. wp-admin/import/mt.php: no se escapa la url que se genera para el atributo action del formulario para importar un blog del tipo Movable Type. Prueba de concepto.
  3. wp-admin/custom-header.php: el mismo problema de validación de datos, no pongo una prueba de concepto porque no se puede acceder directamente a esta página.
  4. wp-content/plugins/akismet/akismet.php: el mismo problema del punto 1 al momento de paginar los comentarios de tipo spam, la prueba de concepto es parecida, sólo hay que agregar el parámetro page=akismet-admin.

Al momento de publicar esta entrada programada, seguramente ya habrá un parche oficial en la página de reporte de incidencias de WordPress (aunque hice el reporte a través de security@wordpress.org), pero para los impacientes pongo una solución temporal (**).

Actualización (06/03/2007): Los fallos en wp-admin/edit-comments.php y wp-admin/custom-header.php sólo se pueden reproducir a partir de la rama 2.1.x, el de wp-admin/import/mt.php y akismet me parece que a partir de la rama 2.0.x.

*: Si, también los plugins que desarrollé tienen estos problemas 😀 , pero estoy aprendiendo.
**: Los archivos modificados corresponden a la versión 2.1.2 (ver diferencias), úsenlo bajo vuestra responsabilidad.

Categories
CSRF Seguridad Sql Injection Web XSS

Sistemas de estadísticas Web y datos sobre las búsquedas

Your Traffic stats
Frecuencia con que reviso las estadísticas de acceso a este blog 😀 (Fuente isopixel)

Debido a que estos últimos meses en estuve comentando algunos temas relacionados sobre seguridad, ahora recibo unas cuantas visitas de gente buscando información sobre XSS, Sql Injection, CSRF, etc; entre estas visitas también hay algunos que buscan algunos exploits que siguen unos patrones determinados.

Al igual que un caso anterior, esta vez mientras revisaba las estadísticas de acceso al blog en Reinvigorate, un pequeño mensaje salió a la vista:

XSS Message

Al mirar más detenidamente la fuente de ese mensaje, ví que alguien al parecer estaba buscando(*) erróneamente servidores vulnerables o más información sobre un bug reportado por Stefan Esser en el Mes de los Bugs de PHP.

Es interesante como este tipo de búsquedas pueden ayudar a encontrar bugs de manera imprevista 🙂 .

(*) El texto que buscaban era http://www.google.com.ar/search?q=?a[]=<script>alert(/XSS/);</script>

Categories
PHP Seguridad Sql Injection XSS

Filtros genéricos y la seguridad

Hace algún tiempo ya había comentado que este tipo de funciones en general son de poca utilidad y dan una falsa sensación de seguridad a los que las usan.

php:

function antiinjection($str) {
        $banwords = array ("'", ",", ";", "--", " or ", ")", "(", " OR ", " and ", " AND ","\n","\r");
        if ( eregi ( "[a-zA-Z0-9]+", $str ) ) {
                $str = str_replace ( $banwords, '', ( $str ) );
        } else {
                $str = NULL;
        }
        $str = trim($str);
        $str = strip_tags($str);
        $str = stripslashes($str);
        $str = addslashes($str);
        $str = htmlspecialchars($str);
        return $str;
}

¿Qué problemas le encuentran al código mostrado?