Ocultar carga útil XSS

0

Escenario: hay un XSS persistente en una página con la información del nombre de usuario. El nombre de usuario está presente tres veces en la página, está visible solo una vez y el visible se escapa correctamente.

  1. ¿Cómo ocultaría la carga útil para que no se vea cuando se muestra el nombre de usuario?

    • Mi primera idea fue cambiar el texto que se muestra dentro de la carga útil.
    • Segunda idea usando caracteres invisibles:

    Bob "> & nbsp; & nbsp; [...] PAYLOAD

  2. y si la carga útil no se puede ejecutar en una página específica, ¿cómo ocultaría la carga útil?

  3. ¿Cómo evitaría que su carga útil se ejecute más de una vez?

    • ¿Es posible usar algún tipo de variable global de javascript como indicador?
pregunta Techbrunch 01.08.2013 - 04:02
fuente

2 respuestas

3

Para responder a sus tres preguntas:

Corrección de la salida que se escapó correctamente:
Haga que su parche XSS sea el DOM para que el JavaScript que inyecte se elimine de esa etiqueta en particular. Por ejemplo, puede prefijar el XSS inyectado con un carácter como una canalización (es decir, | ) para ayudar a distinguir el nombre real:

var nameHtml = document.getElementById('username').innerHTML;
var parts = nameHtml.split("\">|", 2);
document.getElementById('username').innerHTML = parts[0];

Entonces, si tu XSS se ve así:

">|<script>alert(1);</script>

El código de arriba eliminará todo lo que está después e incluyendo el ">| .

Si no puedes ejecutar el código en esa página, ¿puedes hacer otra cosa?
Si aún puede inyectar HTML en la página, pero no puede obtener el XSS debido a una política de seguridad de contenido o algo similar, entonces podría inyectar CSS para ocultar el elemento de nombre de usuario por completo, usando display: none !important; para que anule todo. Si se trata de un XSS almacenado y puede CSRF enviar, eso también le ahorrará la molestia.

¿Cómo evitaría que su carga útil se ejecute más de una vez?
Hay muchas maneras de hacer esto, incluyendo:

  • Verifique la existencia de un elemento con un ID conocido en la página; si lo encuentra, no lo ejecute, de lo contrario, créelo.
  • Verifique la existencia de un atributo con nombre en un elemento que sabe que existe en la página de destino; si lo encuentra, no lo ejecute, de lo contrario, agréguelo.
  • Defina una clase o variable y verifique su existencia.
  • Si está intentando evitar que se ejecute nuevamente en las actualizaciones, configure una cookie.
respondido por el Polynomial 01.08.2013 - 14:42
fuente
0

Podrías usar el XSS para cambiar el nombre de usuario visible, para que se vea benigno. Por ejemplo, su script inyectado podría hacer algo como esto:

document.getElementById("displayedUsername").innerHTML = "john";

Para responder la segunda parte de su pregunta, sí, podría asegurarse de que su código solo se ejecute una vez, utilizando una variable global. El código se vería algo así:

var alreadyExecuted;
if (alreadyExecuted !== true) {
  alreadyExecuted = true;
  // your code here

}
    
respondido por el davidwebster48 01.08.2013 - 04:35
fuente

Lea otras preguntas en las etiquetas