Categories
Firefox Internet Explorer Seguridad Web XSS

XSS y las peculiaridades de los navegadores

Hay ocasiones en que la forma como interpreta HTML un navegador puede producir algunos problemas de seguridad, esto normalmente se debe a descuidos de un programador que asume cierta funcionalidad.

Veamos el siguiente ejemplo — basado en una aplicación del mundo real ™ — que muestra un caso de estos:

php:

<?php

if (empty($_GET['el'])) {
        die;
}
/* Función genérica que sirve para eliminar ciertos caracteres */
function clean_input_string($string) {
        return preg_replace('/[ <>\'"\r\n\t\\()]/', '', stripslashes($string));
}

$elemento = clean_input_string($_GET['el']);

?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
<head>
    <title>Demo</title>
        <script type="text/javascript">
            //<![CDATA[
            function ponerFoco(id){
                        var elemento = document.getElementById(id);
                        if (!elemento) return;
                        elemento.focus();
                }
            //]]>
        </script>
</head>

<body onload="ponerFoco('<?php echo $elemento; ?>')">   

        <form method="post" action="foo.php">
            <input type="text" name="usuario" id="usuario" />
                <input type="text" name="contrasena" id="contrasena" />
               
                <input type="submit" name="postback" value="Entrar »" />
        </form>
</body>

</html>

Como se puede observar, el código lo único que hace es intentar poner el foco en el elemento que se especifique en el parámetro el, éste valor antes es filtrado (elimina los caracteres espacio, <, >, ', ", \r, \n, \t, (, ) y \ ) por la función de propósito general clean_input_string — la aplicación de donde se tomó el código hace uso de esa función en varias partes.

Puesto que se eliminan los caracteres \, (, ) y ', en circunstancias normales no debería ser posible ejecutar javascript en el ejemplo mostrado; si el contiene ');alert(document.cookie)// entonces lo que llega al navegador es <body onload="ponerFoco(';alertdocument.cookie//')">, valor completamente inofensivo para nuestros propósitos.

Haciendo unas pruebas con un valor parecido al anterior, pero esta vez usando entidades HTML en lugar de los caracteres que son eliminados por la función clean_input_string, se consiguen resultados interesantes. Por ejemplo, para el = &#39;&#41;;alert&#40;document.cookie&#41;//, el HTML generado es:

html:

<body onload="ponerFoco('');alert(document.cookie)//')">

A simple vista, parece igual de inofensivo que el anterior caso, sin embargo si esa página carga en Firefox o Internet Explorer (no probé con otros navegadores), además de ejecutarse la función ponerFoco, se mostrará un mensaje mostrando las cookies almacenadas.

Este tipo de problemas se pueden solucionar evitando en lo posible enviar directamente los valores que dependen del cliente, definiendo filtros más específicos (formatos de identificadores válidos) o separando la generación de javascript y HTML en documentos distintos.

Categories
Firefox Seguridad XSS

Cookies HttpOnly probablemente para Firefox 3

Finalmente, luego de algo más que cuatro años, se implementó el soporte para cookies con atributo HttpOnly.

HttpOnly cookies were designed by the Internet Explorer developers back in 2002 and implemented in IE 6sp1, unfortunately, uptake among other browsers was extremely slow, and it's been under-utilized in web applications. Well, the Firefox developers finally got around to implementing HttpOnly in Firefox, and Safari currently supports it based on my testing with 2.0.4 (anybody know when it first became supported -- it wasn't earlier last year). Unfortunately, Opera 9.10 still looks like it doesn't support HttpOnly cookies, and the fix in FF won't be public in a stable release until Firefox 3.0, so unless you're comfortable downloading and running the 3.0 alphas (called "Minefield, no less), we still have a ways to go before support becomes more ubiquitous.

Aunque al parecer Firefox 3 todavía no tiene una fecha definida para su versión final, como se comenta en la cita, pueden estar probando las versiones alpha.

Categories
.NET ASP.NET Firefox Internet Explorer Seguridad Web XSS

Mitigar el robo de cookies a través del atributo HttpOnly

El Service Pack 1 y las versiones posteriores de Microsoft Internet Explorer 6 admiten la propiedad HttpOnly para las cookies, que puede ayudar a mitigar las amenazas a las secuencias de comandos entre sitios que originan cookies robadas. Las cookies robadas pueden contener información confidencial que identifique al usuario en el sitio, como el id. de sesión de ASP.NET o el vale de autenticación mediante formularios, que el atacante puede reproducir para hacerse pasar por el usuario u obtener información confidencial. Cuando un explorador compatible recibe una cookie HttpOnly, ésta resulta inaccesible para la secuencia de comandos de cliente.

Establecer la propiedad HttpOnly no evita que un atacante con acceso al canal de la red obtenga acceso a la cookie directamente.

Tal como se puede observar en la cita, al usar este tipo de cookies se ofrece más protección para evitar robo de los mismos a través de ataques XSS, puesto que no es posible acceder a los valores marcados con este atributo desde javascript.

En ASP.NET 2, para habilitar esta característica, se puede hacer a nivel individual o para todas las cookies de la aplicación.

Para el primer caso, sólo es necesario asignar en true la propiedad Secure del cookie.

csharp:

Response.Cookies["test"].Secure = true;

Para que esta característica englobe a todas las cookies de la aplicación, simplemente hay que cambiar la propiedad httpOnlyCookies de la sección httpCookies del Web.config

xml:

<?xml version="1.0"?>
<configuration>
  <system.web>
    <compilation debug="false"/>
    <authentication mode="Forms">
      <forms name="__auth" defaultUrl="default2.aspx" cookieless="AutoDetect" path="/" loginUrl="default.aspx">
      </forms>
    </authentication>
    <authorization>
      <deny users="?"/>
    </authorization>
    <httpCookies httpOnlyCookies="true"/>
  </system.web>
</configuration>

Al hacer estos cambios, las cabeceras que se envían al cliente son las siguientes:

code:

HTTP/1.1 200 OK
Server: ASP.NET Development Server/8.0.0.0
Date: Tue, 13 Feb 2007 13:03:29 GMT
X-AspNet-Version: 2.0.50727
Set-Cookie: test=foo; path=/; secure; HttpOnly     ---> el atributo secure es por Response.Cookies["test"].Secure = true;
Set-Cookie: demo=5; path=/; HttpOnly
Cache-Control: private
Content-Type: text/html; charset=utf-8
Connection: Close

Si se quisiera utilizar este tipo de cookies desde otros lenguajes que no dan soporte para esta característica, lo único que se tiene que agregar en las cabeceras es el texto HttpOnly luego de definir nuevas cookies, por ejemplo en PHP podríamos hacer algo como lo que sigue*.

php:

setcookie('foo', 'test', null, '/;HttpOnly');

Por el momento esta característica está disponible de manera nativa sólo en Internet Explorer, para Firefox tenemos que hacer uso de extensiones como las de Stefan Esser, que en realidad sólo renombra las cookies y encripta el contenido de éstas.

* Al parecer en PHP 5.2 ya hay un soporte para esta característica.

Categories
Firefox Google JavaScript Varios

Google Analytics: urchinTracker is not defined

Muchos de los sitios que usan Google Analytics para manejar sus estadísticas, presentan un -pequeño- error en javascript cuando el visitante usa Firefox.

Google Analytics errors

Google Analytics errors

Para solucionar -realmente- este pequeño error, pueden usar una versión modificada del script de Google Analytics o cambiar lo siguiente para evitar que se muestre el error:

html:

<script src="http://www.google-analytics.com/urchin.js" type="text/javascript">
</script>

<script type="text/javascript">
_uacct = "....";
urchinTracker();
</script>

por:

html:

<script src="http://www.google-analytics.com/urchin.js" type="text/javascript">
</script>

<script type="text/javascript">
_uacct = "....";
if (typeof(urchinTracker) == 'function') {
  urchinTracker();
}
</script>

Categories
Firefox Seguridad

Evasión del filtro anti-phishing en Firefox 2.0

Al parecer la última versión de Firefox 2 hace una validación sencilla para comprobar si un sitio es falso o no.

Por ejemplo, al entrar a la siguiente dirección se muestra la advertencia indicando que es un sitio fraudulento: http://200.119.135.99/ebay/login5878/

Sin embargo, al ingresar a la misma dirección pero con el IP en formato hexadecimal, ya no aparece tal advertencia: http://0xc8.0x77.0x87.0x63/ebay/login5878/

Fuente: http://ha.ckers.org/