@Arminio lo cubrió bastante bien. Pero hay excepciones dependiendo del atributo HTML. Aquí hay solo dos ejemplos (existen otros, en su mayoría relacionados con las URL, pero onX
y algunos otros atributos también son casos especiales; además, con el uso de marcos JS también se pueden usar gadgets de script ).
atributo href:
// user-supplied link:
<a href="[user_input]">click</a>
ataque:
javascript:alert'1'
meta atributo:
// user-supplied link for redirect:
<meta http-equiv="refresh" content="0;url=[user_input]">
ataque:
data:text/html;base64,PHNjcmlwdD5hbGVydCgndGVzdDMnKTwvc2NyaXB0Pg