exploit document.write con entrada de usuario no saneada

1

Estoy tratando de inyectar javascript en un archivo de script js pero no funciona.

Tengo la siguiente configuración:

archivo html con javascript-file include (¡todos los js en línea están bloqueados!)

Welcome, <script src="js/domxss.js" type="text/javascript"></script>

fuente javascript de js / domxss.js:

var pos=document.URL.indexOf("user=")+5;
var userInput=document.URL.substring(pos,document.URL.length);
document.write(unescape(userInput));

Obviamente solo pude solicitar

domain.com/index.html?user=<script>alert(1)</script> 

y se ejecutaría, pero todos los js en línea están siendo bloqueados por mi Política de Seguridad de Contenido. Entonces, lo que estoy tratando de hacer es salir de

document.write((userInput));

con algo como esto:

domain.com/index.html?user=bob); alert(1

para que pueda obtener algo como esto:

document.write(bob);alert(1);

¿Alguien tiene una idea de cómo podría lograr eso? No estoy obligado a document.write, solo estoy buscando un ejemplo de XSS basado en DOM donde pueda inyectar JS directamente en el archivo de script en lugar de imprimirlo como código en línea.

Lo siento si parece una pregunta básica pero no estoy muy familiarizado con JS.

Gracias por la ayuda :)

    
pregunta mohrphium 02.03.2014 - 20:31
fuente

1 respuesta

2

En pocas palabras, no puedes porque tu carga útil bob); alert(1 es una cadena, y JavaScript sabe que es una cadena para que no la ejecute. Los paréntesis y los caracteres de punto y coma pueden estar dentro de la cadena sin ser ejecutados. Este código podría ser vulnerable si, por ejemplo, intentara concatenar la carga útil en una declaración eval() . Esto se debe a que eval ejecutará el código dentro de la cadena resultante.

var pos=document.URL.indexOf("user=")+5;
var userInput=document.URL.substring(pos,document.URL.length);
eval("document.write('" + decodeURI(userInput) + "');");

Luego, domain.com/index.html?user=bob');%20alert('1 dará como resultado que la siguiente cadena se ejecute como JavaScript:

document.write('bob'); alert('1');

( Esta es la razón por la que eval () es generalmente una mala idea )

Sin embargo, una buena Política de seguridad de contenido probablemente también bloquearía la entrada del usuario en eval (), por lo que es posible que este método no funcione. Depende de la política devuelta por el servidor o de los controles predeterminados que el navegador podría cargar si no se especifica uno.

Alternativas a eval ()

Otras formas peligrosas en las que un desarrollador podría evaluar accidentalmente los datos controlables por el usuario sin desinfección o validación ( podría no ser detectado por un CSP predeterminado o un filtro XSS del lado del cliente).

El constructor de la función (puede definir el cuerpo de la función como una cadena):

var pos=document.URL.indexOf("user=")+5;
var userInput=document.URL.substring(pos,document.URL.length);
var terribleFunction = new Function( "document.write('" + decodeURI(userInput) + "');" );
terribleFunction();

A URI de datos :

var pos=document.URL.indexOf("user=")+5;
var userInput=document.URL.substring(pos,document.URL.length);
var terribleScript = document.createElement('script');
terribleScript.src = 'data:text/javascript,' + encodeURIComponent("document.write('" + decodeURI(userInput) + "');");
document.body.appendChild( terribleScript );

setTimeout (aunque creo que este método es esencialmente el mismo que eval ()):

var pos=document.URL.indexOf("user=")+5;
var userInput=document.URL.substring(pos,document.URL.length);
setTimeout( "document.write('" + decodeURI(userInput) + "');" , 100 );
    
respondido por el itscooper 02.03.2014 - 21:59
fuente

Lea otras preguntas en las etiquetas