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().

<?php $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:

<?php $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().

<?php $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.