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.