Necesito XSS que funcione con un espacio después del signo menor que ( <
).
Entrada: < img src=x onerror=alert(1)>
Salida: < img src="x" onerror="alert(1)">
Eso no es posible.
La especificación de sintaxis HTML5 requiere una letra ASCII minúscula o mayúscula después de un soporte de ángulo de apertura.
Aquí está el estado del tokenizador HTML5 después de un <
(el " Etiqueta de estado abierto "):
Consume the next input character: "!" (U+0021) Switch to the markup declaration open state. "/" (U+002F) Switch to the end tag open state. Uppercase ASCII letter Create a new start tag token, set its tag name to the lowercase version of the current input character (add 0x0020 to the character's code point), then switch to the tag name state. (Don't emit the token yet; further details will be filled in before it is emitted.) Lowercase ASCII letter Create a new start tag token, set its tag name to the current input character, then switch to the tag name state. (Don't emit the token yet; further details will be filled in before it is emitted.) "?" (U+003F) Parse error. Switch to the bogus comment state. Anything else Parse error. Switch to the data state. Emit a U+003C LESS-THAN SIGN character token. Reconsume the current input character.
Como puede ver, solo los caracteres en [a-zA-Z]
harán que el tokenizador emita un token de etiqueta , es decir, abra una etiqueta real. Cualquier otra cosa solo convertirá el corchete en un literal <
y no podrá XSS en ningún navegador que cumpla con la especificación.
¿Por qué no probar con la codificación url% 20 por espacio? Hay otras opciones de codificación que también pueden satisfacer esto, como la codificación base10 o base64 que puedes probar.
Lea otras preguntas en las etiquetas xss