Burlando Filtros
No todo el tiempo, podremos introducir nuestro código JavaScript de forma tan directa y levantar una alerta de forma sencilla, como lo hemos visto en anteriores ejemplos, esto se debe a que los programadores o los administradores, incorporan como medida de seguridad y prevención filtros o reglas, los cuales tienen la finalidad de evitar las vulnerabilidades XSS.
Existe gran variedad de filtros anti-xss, algunos muy buenos, desarrollados como pequeños script en PHP. Existen varias funciones en PHP que pueden ser usadas como: str_replace(), str_ireplace(), strip_tags() y htmlentities().
Un ejemplo de un filtro de xss con PHP utilizando la función str_replace().
$entrada = $_GET["datos"]; $filtrar = array("<script>","</script>","<iframe>", "etc"); $filtro = str_replace($filtrar,"",$entrada); print $filtro;
Sin embargo los filtros pueden ser evadidos al igual que las funciones de PHP. Tomemos por ejemplo el filtro con la funcion srt_replace(), esta función es muy sensible al tratar con las mayúsculas y minúsculas, por lo que si analizamos el script de la parte superior, nos daremos cuenta que basta con poner algo en mayúscula y listo, evadimos el filtro y listo.
Pero que pasaría si tenemos el siguiente filtro:
$entrada = $_GET["datos"]; $filtrar = array("<script>","</script>","<iframe>","<SCRIPT>","</SCRIPT>", "etc");
$filtro = str_replace($filtrar,"",$entrada); print $filtro;
A pesar de que, ahora este filtro, bloquea las etiquetas en mayúsculas, burlarlo es completamente igual, a continuacion tenemos un ejemplo "practico" burlando un filtro anti-xss con la funcion str_replace en WebForPentesters.
Al momento de ingresar nuestro payload <script>alert(“XSS”)</script> y no resulta, no muestra la alerta.
Como podemos ver, el filtro bloquea las etiquetas <script></script> lo cual quiere decir que puede estar utilizando la funcion str_replace, si recordamos un poco sabemos que esta funcion, es sensible a las letras mayusculas, por lo cual probamos con el siguiente script: <sCripT>alert("hacked")</ScrIpt>
Como podemos ver el filtro, ha sido evadido, y hemos logrado levantar un alerta, posiblemente en la parte del servidor, exista un script en php el cual utilice la funcion str_replace() y que bloquee las etiqueas <script></script> y <SCRIPT></SCRIPT>.
Otras de las funciones es : str_ireplace().
$entrada = $_GET["datos"]; $filtrar = array("<script>","</script>","<iframe>", "etc"); $filtro = str_ireplace($filtrar,"",$entrada); print $filtro;
Esta función, si lograría filtrar, nuestro payload anterior, sin embargo burlar este filtro es muy sencillo, pues vasta con poner un espacio dentro de la etiqueta, algo como <script>alert("hacked")</script >.
Algunos otros utilizan otras etiquetas dentro de otras, por ejemplo: <scr<script>ipt>alert("xss");</scr</script>ipt> y logran pasar el filtro, levantado la alerta.
De esta manera logramos pasar el filtro. Las funciones strip_tags() y htmlentities(), las veremos en un próximo post, un poco mas practico.
Existen librerías, diseñadas especialmente para ayudarnos a proteger nuestras aplicaciones de XSS como bien lo seria; AntiXSS Library.
No soy pentester ni hacker, soy desarrollador y en el tiempo que llevo en el oficio jamas he visto usar esas funciones como filtro contra xss, siempre veo expresiones regulares bastante robustas o como mínimo con un html_entities, como información esta perfecto.
ResponderBorrarHola gracias por comentar.
BorrarEvidentemente el uso de estas funciones, como medida de protección contra vulnerabilidades XSS es prácticamente nulo, por la forma tan sencilla de burlarlos, por eso casi no se ven implementados.
Este post, podemos verlo como algo básico.
Qué tal, gracias por la información sobre XSS. Tengo una duda, supongamos que creo mi función para hacer la sanitización o uso las de php, por ejemplo str_replace(). Suponiendo que de igual forma lograron inyectar el código JS en mi base de datos (por ejemplo un comentario almacenado que luego será visto por otros)... ¿No podría yo solo validar los datos de salida y ahí eliminar la etiqueta "script" que no logré eliminar en el almacenamiento?
ResponderBorrarY otra duda, que no me queda al 100% claro. ¿Forzosamente se requiere poner las etiquetas de "< script >" para hacer XSS? Es decir, mis validaciones tienen que estar enfocadas en no permitir la etiqueta "< script >" en la entrada y salida de datos?
Borrar