Validación de datos – Solución

Continuando con la serie, ¿qué cosas se tienen que cumplir para que el siguiente código sea vulnerable a XSS?

php:
<?php
/* Evitar XSS a través de otros formatos */
header('Content-type: text/html; charset=utf-8;');

$color = '000';
if ( !empty($_GET['color']) ) {
        $color = htmlentities(strip_tags($_GET['color']));
}


?>
<html>

<head>
        <title>Anti XSS Page :D</title>
        <style type="text/css">
        #demo {
                width: 100%;
                height: 50px;
                background: #<?php echo $color;  ?>;
        }
        </style>
</head>

<body>

<div id="demo">

</div>

</body>

</html>

Actualización: Bien, luego de haber esperado un cierto tiempo, paso a comentar el problema:

La porción de código mostrada, es vulnerable a XSS solamente en Internet Explorer, puesto que este buen navegador :D, posee características que permiten ejecutar código javascript dentro de una hoja de estilos.

Microsoft Internet Explorer 5 offers an easy-to-use new feature that enables Web authors and developers to vastly improve the appearance and rendering of their Web pages. Using the power of dynamic properties, it is now possible to declare property values not only as constants, but also as formulas. The formulas used in a dynamic property can reference property values from other elements, thereby allowing authors unique flexibility when designing their Web pages.

Ahora que sabemos que se puede ejecutar javascript dentro de la hoja de estilos -en todas las versiones de IE, entonces lo único que tenemos que hacer es usar valores que no sean afectados por la función htmlentities, por ejemplo si se usa lo siguiente f00;left:expression(alert(String.fromCharCode(88,83,83))) (abrir con IE), se mostrará un mensaje con el texto XSS.

Si quieren encontrar más ejemplos (abrir con IE) de este tipo, pueden darse una vuelta por MSDN

15 Replies to “Validación de datos – Solución”

  1. Yo pienso que una forma de alterar la salida esperada, sería aumentandole ?color=F00;display:none;. ¿Eso entra dentro de la categoria XSS? o ¿necesariamente tiene que ser código javascript? 🙁

  2. De la definición de wikipedia:

    Cross-site scripting (XSS) is a type of computer security vulnerability typically found in web applications which allow malicious web users to inject HTML or client-side script into the web pages viewed by other users. An exploited cross-site scripting vulnerability can be used by attackers to bypass access controls such as the same origin policy. Recently, vulnerabilities of this kind have been exploited to craft powerful phishing attacks and browser exploits.

    Estrictamente hablando, lo que comentas no sería XSS 🙂 -pero la forma de explotarlo vá por ahí 😀

  3. Yo ni idea la verdad, pero me interesa mucho el tema.

    Ahora me pregunto, existe verdaderamente esto?
    Anti XSS Page 😀

    XD, es que cuaquier validacion que se me ocurre luego descubro(muchas veces por las anotaciones de este blog) que, de alguna manera, se puede saltar 🙁

    Seria interesante que entre tantos "quiz", hubiera una notita que aclare un poco el panorama a los mas novatines como yo... o igual tengo que irme a buscar a otro lado jeje.

    Saludos!

  4. Ahora me pregunto, existe verdaderamente esto?
    Anti XSS Page 😀

    jeje, el hecho de que una página sea vulnerable o no, en general puede depender de muchas cosas, así que siempre queda la duda 😀

    ¿qué tipo de notas crees que debería poner? en algunos "quiz" he puesto algunos consejos para evitar esos problemas, pero me parece que no es suficiente, talvez deba incluir un poco más de teoría :).

  5. Gracias por responder.

    Yo he buscado por ejemplo un afuncion que sea 100% confiable para "limpiar" los datos que llegan por $_POST y $_GET, pero la verdad, es que de las que vi por ahi como que no me dan mucha seguridad.

    No estaria nada mal algo de teoria (si gustas claro), pero lo que seria interesante es construir alguna funcion para limpiar cadenas de ingreso que de la mayor seguridad posible. Quiza entre todos los que pasamos por aqui, podamos poco a poco formar dicha funcion.

    Bueno, una idea nomas.

    Saludos!

  6. Federico, me gustaría saber a qué tipo de funciones te refieres, talvez podamos comentar y hacer aportes para mejorarlas.

    Sobre una función de las características que mencionas, existe un pequeño problema, que no todos los datos necesitan el mismo tratamiento al pasar por un filtro, talvez sería mejor enfocar esas funciones para escenarios específicos.

    Intentaré poner un poco más de teoría en las siguientes entradas.

    Saludos y gracias por las ideas

  7. Bueno... a ver si nos das tu respuesta.

    Creo que la mayoría de nosotros, estamos esperándola ansiosamente.

    Pues en el momento que este Post, desaparezca de portada, creo que le perderemos la pista.

    Enhorabuena por tu Web, es sencillamente excelente, sobre todo tus "problemas"

  8. Alex, bueno, creo que la teoria servira de mucho... yo al menos pensaba que se podia hacer una funcion que, por ejemplo, te quitara la preocupacion del xss con solo aplicarsela a la entrada de datos...

    Bueno ya ire leyendo mas. Gracias Alex

  9. Edu, gracias por el comentario, publicaré nuevamente el post una vez ponga la respuesta -que se demora a pedido de Victor 🙂

    Federico: gracias nuevamente por los comentarios, talvez podamos armar algo en los siguientes días o semanas

    Victor, otra pista: funciona solamente en IE y usa css no estandar

Comments are closed.