encodeURIComponent en un atributo HTML sin comillas

4

Mi intuición es que lo siguiente debería ser atacable:

$("<td><a href=somefile.php?url="+encodeURIComponent(somevar)+">Download Here</a></td>");

En contraste con

$("<td><a href=\"somefile.php?url="+encodeURIComponent(somevar)+"\">Download Here</a></td>");

Para un ataque de secuencias de comandos entre sitios si el usuario tiene control sobre somevar , parece que no puedo encontrar el ataque específico. ¿Estoy equivocado?

    
pregunta David Mulder 27.08.2014 - 17:25
fuente

1 respuesta

4

De MDN :

  

encodeURIComponent escapa a todos los caracteres excepto lo siguiente: alfabético, dígitos decimales,

     

- _ . ! ~ * ' ( )

Normalmente, necesitarías un carácter de espacio para agregar otro atributo (como onclick ), desafortunadamente esto se codificará como parte de la URI.

Sin embargo, desde OWASP XSS (Cross Site Scripting) Prevention Cheat Sheet :

  

Los atributos sin comillas se pueden dividir con muchos caracteres, incluidos    [space] % * + , - / ; < = > ^ and |

Por lo tanto, es posible que desee probar los caracteres - o * para intentar crear un nuevo atributo.

por ejemplo establece somevar en http://www.example.com-onclick=alert('xss') o http://www.example.com*onclick=alert('xss')

Su kilometraje puede variar entre los navegadores y, lamentablemente, = seguirá estando codificado en la URL, por lo que también tendrá que superar ese obstáculo. Por lo tanto, aunque el valor no se cotice ni se codifique correctamente, puede que no sea posible convertir este defecto de codificación en un exploit XSS.

Su segundo ejemplo es más seguro, aunque el valor realmente debería estar codificado en HTML:

$("<td><a href=somefile.php?url=\""+htmlEscape(encodeURIComponent(somevar))+"\">Download Here</a></td>");

donde htmlEscape es: -

function htmlEscape(str) {
    return String(str)
            .replace(/&/g, '&amp;')
            .replace(/"/g, '&quot;')
            .replace(/'/g, '&#39;')
            .replace(/</g, '&lt;')
            .replace(/>/g, '&gt;');
}
    
respondido por el SilverlightFox 28.08.2014 - 15:37
fuente

Lea otras preguntas en las etiquetas