2010-01-29 11 views
27

La especificación RFC 3986 URI: Generic Syntax enumera un punto y coma como un (sub-delim) carácter reservado:¿Para qué se reserva el punto y coma en las URL?

reserved = gen-delims/sub-delims 

gen-delims = ":"/"/"/"?"/"#"/"["/"]"/"@" 

sub-delims = "!"/"$"/"&"/"'"/"("/")" 
      /"*"/"+"/","/";"/"=" 

Cuál es el propósito de la reservada ";" del punto y coma en URIs? Para el caso, ¿cuál es el propósito de los otros subdelims (solo conozco los propósitos de "&", "+" y "=")?

Respuesta

34

Hay una explicación al final de la sección 3.3.

Aparte de punto-segmentos en caminos jerárquicos, un segmento de trazado es considera opaco por la sintaxis genérica . Las aplicaciones de producción de URI a menudo usan los caracteres reservados permitidos en un segmento para delimitar esquema-específico o subcomponentes deespecíficos del manejador de dereferencia. Por ejemplo, los caracteres reservados punto y coma (";") e iguales ("=") se usan a menudo para delimitar los parámetros y los valores del parámetro aplicables a ese segmento. El carácter reservado de coma (",") es de uso frecuente para fines similares. Por ejemplo, un productor de URI podría usar un segmento como "nombre; v = 1.1" para indicar una referencia a la versión 1.1 de "nombre", mientras que otro podría usar un segmento como "nombre, 1.1" para indican lo mismo. Los tipos de parámetro se pueden definir por semántica específica de esquema , pero en la mayoría de los casos la sintaxis de un parámetro es específica de la implementación del algoritmo de desreferenciación del URI.

En otras palabras, que está reservado para que las personas que quieren una lista delimitada de algo en la URL pueden utilizar con seguridad ; como delimitador incluso si las partes contienen ;, siempre y cuando los contenidos son ciento codificados. En otras palabras, se puede hacer esto:

foo;bar;baz%3bqux 

e interpretarlo como tres partes: foo, bar, baz;qux. Si el punto y coma no fuera un carácter reservado, el ; y el %3b serían equivalentes, por lo que el URI se interpretaría incorrectamente como cuatro partes: foo, bar, baz, qux.

+3

En resumen, reservado, pero para nada en particular. Lo usamos para codificar cierta información en consultas RESTful. –

+0

Gracias por el ejemplo, eso realmente ayuda. – Nicole

+1

¿Alguien puede compartir un ejemplo de esto utilizado en servicios web de palabras reales? – Winny

4

Section 3.3 covers this - Es un delimitador opaca una aplicación URI productoras puede utilizar si conveniente:

Aparte de punto-segmentos en caminos jerárquicos, un segmento de trazado es considera opaco por la sintaxis genérica . Las aplicaciones de producción de URI a menudo usan los caracteres reservados permitidos en un segmento para delimitar esquema-específico o subcomponentes deespecíficos del manejador de dereferencia. Por ejemplo, los caracteres reservados punto y coma (";") e iguales ("=") se utilizan a menudo para parámetros de delimitación y para los valores de parámetro aplicables a ese segmento. El carácter reservado de coma (",") es que a menudo se utiliza para fines similares. Para el ejemplo , un productor de URI podría usar un segmento como "nombre; v = 1.1" a indicar una referencia a la versión 1.1 de "nombre", mientras que otro podría usar un segmento como "nombre, 1.1" para indique lo mismo. Los tipos de parámetros pueden ser definidos por la semántica específica del esquema, , pero en la mayoría de los casos la sintaxis de un parámetro es específica de la implementación del algoritmo de desreferenciación del URI .

7

La intención es más clara si volver a older versions de la especificación:

path_segments = segment *("/" segment) 
    segment  = *pchar *(";" param) 

Cada segmento de ruta puede incluir una secuencia de parámetros, indicado por el punto y coma ";" personaje.

Creo que tiene su origen en FTP URI s.

4

Existen algunas convenciones sobre su uso actual que son interesantes. Estos hablan de cuándo usar un punto y coma o una coma. Del libro "Servicios web RESTful":

Utilice caracteres de puntuación para separar varias piezas de datos en el mismo nivel de jerarquía. Usa comas cuando importa el orden de los elementos, ... Usa punto y coma cuando el orden no importa.

0

Desde 2014 se sabe que los segmentos de ruta contribuyen a Reflected File Download attacks. Supongamos que tenemos una API vulnerables que refleje lo que enviamos a ella (la URL fue real, al parecer, ha sido arreglado):

https://google.com/s?q=rfd%22||calc|| 

{"results":["q", "rfd\"||calc||","I love rfd"]} 

Ahora bien, esto es inofensivo en un navegador, ya que es JSON por lo que no va a ser prestados pero el navegador ofrecerá descargar la respuesta como un archivo. Ahora aquí están los segmentos de trazado venido a ayudar (para el atacante):

https://google.com/s;/setup.bat;?q=rfd%22||calc|| 

Todo entre punto y coma (;/setup.bat;) será no enviaron al servicio web, pero en cambio el navegador lo interpretará como el nombre del archivo. .. para guardar la respuesta de la API. Ahora, un archivo llamado setup.bat se descargará y ejecutará sin preguntar sobre los peligros de ejecutar archivos descargados de Internet (porque contiene la palabra "setup" en su nombre). El contenido se interpretará como archivo por lotes de Windows y se ejecutará el comando calc.exe.

Prevención:

  • desinfectar la entrada de su API (en este caso sólo deberían permitir caracteres alfanuméricos); escaparse no es suficiente
  • agregar Content-Disposition: attachment; filename="whatever.txt" en las API que no se van a procesar; Google faltaba la parte filename que en realidad hizo el ataque más fácil
  • añadir X-Content-Type-Options: nosniff cabecera a las respuestas del API
0

He encontrado los siguientes casos de uso:

Es el carácter final de una entidad HTML:
https://en.wikipedia.org/wiki/List_of_XML_and_HTML_character_entity_references

Para utilizar una de estas referencias de entidades de caracteres en un documento HTML o XML , introduzca un símbolo de unión siguió b y el nombre de la entidad y un punto y coma , por ejemplo, & para el símbolo comercial ("&").

Apache Tomcat 7 (o versiones más recientes ?!) nosotros como path parameter:
https://superevr.com/blog/2011/three-semicolon-vulnerabilities

Apache Tomcat es un ejemplo de un servidor web que soporte "Path Parámetros". Un parámetro de ruta es contenido adicional después de un nombre de archivo, , separado por un punto y coma. Cualquier contenido arbitrario después de un punto y coma no afecta a la página de inicio de un navegador web . Esto significa que http://example.com/index.jsp;derp aún devolverá index.jsp, y no alguna página de error.

URI escisiones esquema por el que el MIME y datos:
https://en.wikipedia.org/wiki/Data_URI_scheme

Puede contener un parámetro de juego de caracteres opcional, separado de la parte precedente por un punto y coma (;).

<img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUA 
AAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO 
9TXL0Y4OHwAAAABJRU5ErkJggg==" alt="Red dot" /> 

Y hubo un error en IIS 5 y IIS6 eludir las restricciones de carga de archivos:
https://www.owasp.org/index.php/Unrestricted_File_Upload

extensiones de archivo listas negras Esta protección podría ser anulada por: ... mediante la adición de una carácter de punto y coma después de la extensión prohibida y antes de la permitida (por ejemplo, "archivo.asp; .jpg")

Conclusión:
No utilice punto y coma en las URL o podrían producir accidentalmente una entidad HTML o un esquema de URI.

Cuestiones relacionadas