TL; DR Un atacante no puede ver nada más allá del dominio.
Estructura de una solicitud HTTP
HTTP funciona enviando dos cosas a un sitio web: el método , y el headers . Los métodos más comunes son GET
, POST
y HEAD
, que recupera una página, transfiere datos o solicita solo encabezados de respuesta, respectivamente. TLS cifra la totalidad del tráfico HTTP, incluidos los encabezados y el método. En HTTP, la ruta en la URL se envía junto con el cuerpo del encabezado. Tome este ejemplo, con wget cargando la página foo.example.com/some/page.html
:
GET /some/page.html HTTP/1.1
User-Agent: Wget/1.19.1 (linux-gnu)
Accept: */*
Accept-Encoding: identity
Host: foo.example.com
El servidor responderá con un HTTP código de estado , algunos headers propios , y opcionalmente algunos datos (como HTML). Un ejemplo, dando una redirección 301 y un texto simple como respuesta, puede ser:
HTTP/1.1 301 Moved Permanently
Date: Wed, 27 Dec 2017 04:42:54 GMT
Server: Apache
Location: https://bar.example.com/new/location.html
Content-Length: 56
Content-Type: text/plain
Thank you Mario, but our princess is in another castle!
Lo que le diría al cliente que la ubicación correcta está en otro lugar.
Estos son los encabezados enviados directamente al sitio a través de TCP. TLS funciona en una capa diferente, haciendo todo esto encriptado. Esto incluye la página a la que está accediendo con el método GET
. Tenga en cuenta que, aunque el encabezado Host
también se encuentra en el cuerpo del encabezado y, por lo tanto, está cifrado, el host todavía se puede obtener a través de rDNS busque en la dirección IP, o marcando SNI , que transmite el dominio en texto sin formato.
Estructura de una URL
https://foo.example.com/some/page.html#some-fragment
| proto | domain | path | fragment |
-
proto : solo hay dos protocolos de uso común, HTTP y HTTPS.
-
domain : el dominio es
example.com
y *.example.com
, detectable con rDNS o SNI.
-
ruta : la ruta está completamente encriptada y solo puede ser leída por el servidor de destino.
-
fragmento : el fragmento es visible solo para el navegador web y no se transmite.
Lo que un atacante puede ver
Entonces, ¿qué puede ver un atacante si realiza una solicitud a través de HTTPS? Tomemos la solicitud hipotética anterior desde la perspectiva de un intruso pasivo en la red. Si quisiera saber a qué está accediendo, solo tengo opciones limitadas:
- Veo que estás realizando una solicitud web cifrada con HTTPS que va a
203.0.113.98
.
- Veo que el puerto de destino es 443, que sé que se usa para HTTPS.
- Realizo una búsqueda rDNS y veo que se usa IP para
example.com
y example.org
.
- Miro el registro SNI y veo que te estás conectando a
foo.example.com
.
Esto es todo lo que pude hacer. No podría ver la ruta que está solicitando, ni siquiera qué método está utilizando, salvo el análisis heurístico basado en el tamaño de los datos que se envían y reciben, llamados ataques de análisis de tráfico . Para un servicio grande como Wikipedia, no tengo idea de qué artículo está viendo solo por el análisis de los datos no cifrados.
Una nota importante sobre los remitentes en navegadores antiguos
A pesar de que HTTPS cifra la ruta a la que está accediendo, si hace clic en un hipervínculo dentro de ese sitio que va a una página sin cifrar, la ruta completa se puede filtrar en el encabezado referer
. Esto es ya no es el caso para muchos navegadores más nuevos, pero los navegadores más antiguos o no compatibles pueden tener este comportamiento. al igual que los sitios web que configuran la metaetiqueta de referencia HTML5 para enviar siempre la información. Un ejemplo enviado sin cifrar por un cliente para saltar de https://example.com/private/details.html
a http://example.org/public/page.html
en tal caso sería:
GET /public/page.html
Referer: https://example.com/private/details.html
User-Agent: Wget/1.19.1 (linux-gnu)
Accept: */*
Accept-Encoding: identity
Host: example.org
Como tal, navegar desde una página HTTPS a una página HTTP puede filtrar la URL completa (excluyendo el fragmento) de la página anterior, así que ten eso en cuenta.