¿Explotando XSS en jQuery sin el mismo carácter?

7

Este es un código de JavaScript vulnerable:

$(document).ready(function(){
    var payload = unescape(document.location.hash.substr(1));
    $(payload);
    document.body.innerText = "The payload is: " + payload;
});

Cuando intenté explotarlo con esta entrada

http://localhost/xss.html#<img src=x onerror=alert(0)>

funcionó bien, apareciendo la alerta. Mi caso es ligeramente diferente, hay un pequeño filtro que impide la explotación:

$(document).ready(function(){
    var payload = unescape(document.location.hash.substr(1));
    payload = payload.split('=')[0];  // <------- The new filter
    $(payload);
    document.body.innerText = "The payload is: " + payload;
});

Trunca todo después del carácter "=", lo que significa que no puedo inyectar atributos. Ya probé lo siguiente, pero no funcionó:

  • HTML codifica el carácter igual ( onerror&equal;alert() )
  • <script>alert(0);</script>

¿Alguien tiene una idea de lo que puedo hacer para omitir este filtro?

    
pregunta AlmightyGoat 08.04.2018 - 20:10
fuente

4 respuestas

1

Creo que es seguro decir en este punto que no hay un bypass trivial / de libro de texto para este filtro que usa un navegador moderno. Compartí este fragmento de código con un grupo de amigos y colegas que considero competentes en XSS y ninguno de ellos pudo construir un bypass.

    
respondido por el EdOverflow 30.11.2018 - 14:25
fuente
-2

Puede probar el carácter codificado equivalente a lo que intenta ingresar. Intente utilizar la codificación de URL en la parte de carga útil de su entrada para omitir este filtro.

Por ejemplo, puede codificar URL "=" a %3D o codificar URL <img src=x onerror=alert(0)> a %3Cimg+src%3Dx+onerror%3Dalert%280%29%3E

Esto omitirá el filtro si está esperando "="

Como alternativa, dado que parece que lo está ejecutando en su host local, use una herramienta proxy como Burp Suite para interceptar sus solicitudes / respuestas, puede jugar con diferentes cargas útiles para probar sus cargas útiles XSS.

    
respondido por el geforceGTX480 26.09.2018 - 20:32
fuente
-4

Si aún no ha recibido una respuesta, ¿ha probado el equivalente ASCII de '=', & # 61? No tengo una forma práctica de probar, pero podría funcionar en su caso.

    
respondido por el xiphos71 24.04.2018 - 15:46
fuente
-5

deberías codificarlo. algo como esto funcionará:

 eval(String.fromCharCode(/*list of codes of payload*/))

necesitas dividir la carga útil en los caracteres y convertirlos uno por uno en ints. puedes hacer un script para ello.

también es posible que desee ver atob y btoa.

    
respondido por el Dmitry Lavochkin 07.11.2018 - 22:33
fuente

Lea otras preguntas en las etiquetas