¿Está mostrando un encabezado de referencia HTTP no codificado vulnerable a XSS?

5

Considere el siguiente script PHP (podría ser cualquier otro idioma; elegí PHP por simplicidad):

<?php
echo $_SERVER['HTTP_REFERER'];
?>

¿Es vulnerable a XSS?

Por supuesto, puedo enviar una solicitud a la secuencia de comandos utilizando curl y establecer el referente en algo como <script>alert(document.cookie)</script> . Sin embargo, al menos algunos navegadores parecen codificar el remitente, por lo que si, por ejemplo, redirecciono a los usuarios a ese script desde la siguiente URL:

http://example.com/<script>alert(document.cookie)</script>

el navegador codifica el referente y, como resultado, el script PHP produce esto:

http://example.com/%3Cscript%3Ealert(document.cookie)%3C/script%3E

¿Hay navegadores que no codifiquen al remitente? Si no, ¿puede ser explotado de otra manera?

    
pregunta Michał Perłakowski 06.06.2016 - 22:38
fuente

1 respuesta

4

RFC

RFC 1945 - que menciona primero el encabezado del referente - especifica que los remitentes deben estar codificados en URL:

  

Referer="Referer" ":" (absoluteURI | relativeURI)

     

absoluteURI = esquema ":" (uchar | reservado)
  [...]
  uchar = sin reservas | escapar de   sin reservas = ALFA | DIGIT | caja fuerte extra | nacional
  escape="%" HEX HEX
  reservado=";" | "/" | "?" | ":" | "@" | "&erio;" | "=" | "+"
  extra="!" | "
" | "'" | "(" | ")" | ","
  seguro="$" | "-" | "_" | "."
unsafe = CTL | SP | < "> |" # "|"% "|" < "|" > "

Los RFC más actualizados, como el 7231, son un poco más difíciles de leer, ya que hacen muchas referencias cruzadas, pero no parece que hayan cambiado esta regla.

Por lo tanto, < , > y " deben estar codificados en URL, de acuerdo con los RFC relevantes. Este fue siempre el caso, por lo que incluso los navegadores muy antiguos deberían codificar la URL.

Tenga en cuenta que ' no necesita estar codificado (y no está codificado por los navegadores modernos) y, por lo tanto, puede usarse para ataques XSS (por ejemplo, <a href='[REFERER]'>go back</a> ).

En la práctica

A pesar de que los RFC especifican que < , > y " necesitan estar codificados en URL, sigue siendo una buena idea codificar el referente por sí mismo, por si acaso.

En este caso, los navegadores deben seguir los RFC y, en este caso, los navegadores principales, como Chrome y Firefox, pero es una buena idea seguir las mejores prácticas, es decir, la codificación, de su lado, en caso de que algunos navegadores no lo hagan, o en su caso. el RFC cambia en el futuro (aunque es poco probable).

    
respondido por el tim 06.06.2016 - 23:18
fuente

Lea otras preguntas en las etiquetas