name - ¿Para qué está reservado el punto y coma en las URL?
meta name keywords (6)
Desde 2014, se sabe que los segmentos de ruta contribuyen a los ataques de Descarga de archivos reflejados . Supongamos que tenemos una API vulnerable que refleja todo lo que le enviamos (la URL era real aparentemente, ahora corregida):
https://google.com/s?q=rfd%22||calc||
{"results":["q", "rfd/"||calc||","I love rfd"]}
Ahora, esto es inofensivo en un navegador ya que es JSON, por lo que no se va a procesar, pero el navegador ofrecerá descargar la respuesta como un archivo. Ahora aquí están los segmentos de ruta para ayudar (para el atacante):
https://google.com/s;/setup.bat;?q=rfd%22||calc||
Todo lo que ;/setup.bat;
entre punto y coma ( ;/setup.bat;
) no se enviará al servicio web, sino que 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:
- desinfecte la entrada de su API (en este caso, deberían permitir solo alfanuméricos); escapar no es suficiente
- agregar
Content-Disposition: attachment; filename="whatever.txt"
Content-Disposition: attachment; filename="whatever.txt"
en las API que no se van a representar; A Google le faltaba la parte delfilename
que realmente facilitaba el ataque - agregar
X-Content-Type-Options: nosniff
encabezadoX-Content-Type-Options: nosniff
a las respuestas de la API
El URI de RFC 3986: la especificación de sintaxis genérica enumera un punto y coma como un carácter reservado (sub-delim):
reserved = gen-delims / sub-delims
gen-delims = ":" / "/" / "?" / "#" / "[" / "]" / "@"
sub-delims = "!" / "$" / "&" / "''" / "(" / ")"
/ "*" / "+" / "," / ";" / "="
Cuál es el propósito reservado del ";" 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 "=")?
Encontré 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 usar una de estas referencias de entidad de caracteres en un documento HTML o XML, ingrese un ampersand seguido del nombre de la entidad y un punto y coma, por ejemplo, & para el signo y ("&").
Apache Tomcat 7 (¿o versiones más recientes ?!) lo path parameter
como path parameter
:
https://superevr.com/blog/2011/three-semicolon-vulnerabilities
Apache Tomcat es un ejemplo de un servidor web que admite "Parámetros de ruta". 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 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 una página de error.
El esquema URI divide el MIME y los 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 IIS5 e IIS6 para eludir las restricciones de carga de archivos:
https://www.owasp.org/index.php/Unrestricted_File_Upload
Extensiones de archivo de la lista negra Esta protección puede ser anulada por: ... agregando un 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 use puntos y comas en las URL o podría generar accidentalmente una entidad HTML o un esquema de URI.
Existen algunas convenciones en torno a su uso actual que son interesantes. Estos hablan de cuándo usar un punto y coma o una coma. Del libro "Servicios web RESTful":
Use los signos 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.
Hay una explicación al final de la sección 3.3.
Aparte de los segmentos de punto en las rutas jerárquicas, un segmento de ruta se considera opaco por la sintaxis genérica. Las aplicaciones que producen URI a menudo usan los caracteres reservados permitidos en un segmento para delimitar los subcomponentes específicos del esquema o del manejador de desreferencia. Por ejemplo, los caracteres reservados de punto y coma (";") e iguales ("=") a menudo se utilizan para delimitar parámetros y valores de parámetros aplicables a ese segmento. El carácter reservado de coma (",") a menudo se usa 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 indicar lo mismo. Los tipos de parámetros se pueden definir por 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.
En otras palabras, está reservado para que las personas que quieran una lista delimitada de algo en la URL puedan usar de manera segura ;
como un delimitador incluso si las partes contienen ;
, siempre que los contenidos estén codificados en porcentajes. En otras palabras, puedes hacer esto:
foo;bar;baz%3bqux
e interpretarlo como tres partes: foo
, bar
, baz;qux
. Si el punto y coma no era un carácter reservado, el ;
y %3b
sería equivalente, por lo que el URI se interpretaría incorrectamente como cuatro partes: foo
, bar
, baz
, qux
.
La intención es más clara si vuelve a las versiones anteriores de la especificación:
path_segments = segment *( "/" segment )
segment = *pchar *( ";" param )
Cada segmento de ruta puede incluir una secuencia de parámetros, indicada por el punto y coma ";" personaje.
Creo que tiene su origen en FTP URI s.
La Sección 3.3 cubre esto : es un delimitador opaco que una aplicación que produce URI puede usar si es conveniente:
Aparte de los segmentos de punto en las rutas jerárquicas, un segmento de ruta se considera opaco por la sintaxis genérica. Las aplicaciones que producen URI a menudo usan los caracteres reservados permitidos en un segmento para delimitar los subcomponentes específicos del esquema o del manejador de desreferencia. Por ejemplo, los caracteres reservados de punto y coma (";") e iguales ("=") a menudo se utilizan para delimitar parámetros y valores de parámetros aplicables a ese segmento. El carácter reservado de coma (",") a menudo se usa 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 indicar lo mismo. Los tipos de parámetros se pueden definir por 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.