HTTP/S Protocol Fundamentals
Introduction to HTTP
HTTP Protocol
HTTP (Hypertext Transfer Protocol) es un protocolo de capa de aplicación sin estado que se utiliza para la transmisión de recursos como datos de aplicaciones web y se ejecuta sobre TCP.
Fue diseñado especÃficamente para la comunicación entre navegadores web y servidores web.
HTTP utiliza la arquitectura tÃpica de cliente-servidor para la comunicación, en la que el navegador es el cliente y el servidor web es el servidor.
Los recursos se identifican de forma única con una URL/URI.
HTTP tiene 2 versiones: HTTP 1.0 y HTTP 1.1.
HTTP 1.1 es la versión más utilizada de HTTP y tiene varias ventajas sobre HTTP 1.0, como la capacidad de reutilizar la misma conexión y puede solicitar múltiples URI/recursos.
HTTP Protocol Basics

HTTP Protocol Basics
Durante la comunicación HTTP, el cliente y el servidor intercambian mensajes, que normalmente se clasifican como solicitudes y respuestas HTTP.
El cliente envÃa solicitudes al servidor y recibe respuestas.

Quiz: Introduction to HTTP

HTTP Requests
HTTP Request Components
Request Line
El Request Line es la primera lÃnea de una solicitud HTTP y contiene los siguientes tres componentes:
Método HTTP (p. ej., GET, POST, PUT, DELETE, etc.): indica el tipo de solicitud que se está realizando.
URL (Uniform Resource Locator): la dirección del recurso al que el cliente desea acceder.
Versión HTTP: la versión del protocolo HTTP que se está utilizando (p. ej., HTTP/I.I).
Request Headers
Los encabezados proporcionan información adicional sobre la solicitud. Los encabezados comunes incluyen:
User-Agent: información sobre el cliente que realiza la solicitud (por ejemplo, tipo de navegador).
Host: el nombre de host del servidor.
Accept: los tipos de medios que el cliente puede manejar en la respuesta (por ejemplo, HTML, JSON).
Authorization: credenciales para autenticación, si es necesario.
Cookie: información almacenada en el lado del cliente y enviada de vuelta al servidor con cada solicitud.
Request Body (Optional)
Algunos métodos HTTP (como POST o PUT) incluyen un cuerpo de solicitud donde se envÃan los datos al servidor, generalmente en formato JSON o de formulario.
HTTP Request Example
Examinemos una solicitud HTTP en detalle. A continuación, se muestran los datos que contiene una solicitud que enviamos cuando navegamos a www.google.com con un navegador web.

Se inicia una solicitud HTTP a www.google.com. Lo que se ve aquà son los encabezados (HTTP Request Headers) para esta solicitud.
Tenga en cuenta que se inicia una conexión a www.google.com en el puerto 80 antes de enviar comandos HTTP al servidor web.

Los métodos de solicitud HTTP (HTTP Verbs) proporcionan una forma estandarizada para que los clientes y servidores se comuniquen e interactúen con los recursos en la Web. La elección del método adecuado depende del tipo de operación que se debe realizar en el recurso.
GET es el método de solicitud predeterminado que se utiliza cuando se realiza una solicitud a una aplicación web; en este caso, estamos intentando conectarnos a www.google.com.

HTTP Request Methods Explained
GET
El método GET se utiliza para recuperar datos del servidor. Solicita el recurso especificado en la URL y no modifica el estado del servidor. Es un método seguro e idempotente, lo que significa que realizar la misma solicitud GET varias veces no deberÃa tener efectos secundarios.
POST
El método POST se utiliza para enviar datos para que los procese el servidor. Normalmente incluye datos en el cuerpo de la solicitud y el servidor puede realizar acciones en función de esos datos. Las solicitudes POST pueden provocar cambios en el estado del servidor y no son idempotentes.
PUT
El método PUT se utiliza para actualizar o crear un recurso en el servidor en la URL especificada. Reemplaza todo el recurso con la nueva representación proporcionada en el cuerpo de la solicitud. Si el recurso no existe, PUT puede crearlo.
DELETE
El método DELETE se utiliza para eliminar el recurso especificado por la URL del servidor. Después de una solicitud DELETE exitosa, el recurso ya no estará disponible en esa URL.
PATCH
El método PATCH se utiliza para aplicar modificaciones parciales a un recurso. Es similar al método PUT, pero solo actualiza partes especÃficas del recurso en lugar de reemplazar el recurso completo.
HEAD
El método HEAD es similar al método GET, pero solo recupera los encabezados de respuesta y no el cuerpo de la respuesta. Se suele utilizar para comprobar los encabezados en busca de elementos como la existencia de un recurso o las fechas de modificación.
OPTIONS
El método OPTIONS se utiliza para recuperar información sobre las opciones de comunicación disponibles para el recurso de destino. Permite a los clientes determinar los métodos y encabezados compatibles con un recurso en particular.
HTTP Request URL/Path
La dirección del recurso/URL al que el cliente desea acceder.
La página de inicio de un sitio web siempre es 1'/"t. Por supuesto, se pueden solicitar otras páginas, por ejemplo: /downloads/index.php.
Su solicitud siempre hace referencia a la carpeta raÃz para especificar el archivo solicitado (de ahà el "/" inicial).

HTTP Request Protocol
Esta es la versión del protocolo HTTP con el que su navegador desea comunicarse (HTTP 1.0/HTTP 1.1).

HTTP Request Host Header
Este es el comienzo de los HTTP Request Headers. Los HTTP Headers tienen la siguiente estructura: Heade r -name : Heade r -Value.
El Host header permite que un servidor web aloje varios sitios web en una única dirección IP. Nuestro navegador especifica en el encabezado Host qué sitio web le interesa.

Después de cada encabezado de solicitud, encontrará el valor correspondiente. En este caso, queremos acceder al host www.google.com.
Nota: El valor del host + Path se combinan para crear la URL completa que está solicitando: la página de inicio de www.google.com/
HTTP Request User-Agent Header
El User-Agent se utiliza para especificar y enviar su navegador, la versión del navegador, el sistema operativo y el idioma al servidor web remoto.
Todos los navegadores web tienen su propia cadena de identificación de User-Agent. Asà es como la mayorÃa de los sitios web reconocen el tipo de navegador en uso.

HTTP Request Accept Header
Su navegador utiliza el encabezado Accept para especificar qué tipos de documentos/archivos se espera que se devuelvan desde el servidor web como resultado de esta solicitud.

HTTP Request Accept-Encoding Header
El Header Accept-Encoding es similar a Accept y se utiliza para restringir la codificación de contenido aceptable en la respuesta. La codificación de contenido se utiliza principalmente para permitir que un documento se comprima o transforme sin perder el formato original y sin perder información.

HTTP Request Connection Header
Al utilizar HTTP 1.1, puede mantener o reutilizar la conexión al servidor web remoto durante un perÃodo de tiempo no especificado utilizando el valor "keep-alive".
Esto indica que todas las solicitudes al servidor web se seguirán enviando a través de esta conexión sin iniciar una nueva conexión cada vez (como en HTTP 1.0).

Quiz: HTTP Requests




HTTP Responses
HTTP Response Components
Response Headers
De manera similar a los encabezados de solicitud, los encabezados de respuesta brindan información adicional sobre la respuesta. Los encabezados comunes incluyen:
Content-Type: el tipo de medio del contenido de la respuesta (p. ej., text/html, application/json).
Content-Length: el tamaño del cuerpo de la respuesta en bytes.
Set-Cookie: se utiliza para establecer cookies en el lado del cliente para solicitudes posteriores.
Cache-Control: directivas para el comportamiento de almacenamiento en caché.
Response Body (Optional)
El cuerpo de la respuesta contiene el contenido real de la respuesta. Por ejemplo, en el caso de una página HTML, el cuerpo de la respuesta contendrá el marcado HTML.
HTTP Request Response Example
Ahora que sabemos de qué se compone una solicitud HTTP, examinemos las respuestas HTTP.

En respuesta a la solicitud HTTP, el servidor web responderá con el recurso solicitado, precedido por un conjunto de nuevos encabezados de respuesta HTTP.
Estos nuevos encabezados de respuesta del servidor web serán utilizados por su navegador web para interpretar el contenido incluido en el contenido/cuerpo de la respuesta.
HTTP Response Example
El fragmento de código que aparece a continuación es un ejemplo de una respuesta tÃpica de un servidor web.
Nota: Se ha omitido el cuerpo de la respuesta o el contenido de la página, ya que no es relevante en este momento.
Examinemos algunos de estos encabezados de respuesta HTTP con mayor detalle.

HTTP Response Status-Line
La primera lÃnea de una respuesta HTTP es la lÃnea de estado (Status-Line), que consta de la versión del protocolo (HTTP 1.1) seguida del código de estado HTTP (200) y su significado textual relativo (0K).

Common HTTP Status Codes
200 0K
La solicitud se realizó correctamente y el servidor ha devuelto los datos solicitados.
301 Moved Permanently
El recurso solicitado se ha movido de forma permanente a una nueva URL y el cliente debe utilizar la nueva URL para todas las solicitudes futuras.
302 Found
El recurso solicitado se encuentra temporalmente en una URL diferente. Este código se utiliza habitualmente para redirecciones temporales, pero suele ser mejor utilizar 303 o 307 en su lugar.
400 Bad Request
El servidor no puede procesar la solicitud debido a un error del cliente (por ejemplo, sintaxis de solicitud mal formada).
401 Unauthorized
Se requiere autenticación y el cliente debe proporcionar credenciales válidas para acceder al recurso solicitado.
403 Forbidden
El servidor entendió la solicitud, pero el cliente no tiene permiso para acceder al recurso solicitado.
404 Not Found
No se pudo encontrar el recurso solicitado en el servidor.
500 Internal Server Error
El servidor encontró un error al procesar la solicitud y no se proporciona la causa especÃfica.
HTTP Response Date Header
El encabezado "Date" de una respuesta HTTP se utiliza para indicar la fecha y la hora en que el servidor generó la respuesta.
Ayuda a los clientes e intermediarios a comprender la actualidad de la respuesta y a sincronizar la hora entre el servidor y el cliente.

HTTP Response Cache-Control Header
Los encabezados de caché permiten que el navegador y el servidor se pongan de acuerdo sobre las reglas de almacenamiento en caché. Permiten a los servidores web indicar a los clientes durante cuánto tiempo pueden almacenar en caché la respuesta y en qué condiciones deben volver a validarla con el servidor.
Esto ayuda a optimizar el rendimiento y la eficiencia de las aplicaciones web al reducir las solicitudes de red innecesarias.

Cache-Control Directives
Public
Indica que la respuesta puede ser almacenada en caché por cualquier caché intermedio (como servidores proxy) y compartida entre diferentes usuarios.
Private
Especifica que la respuesta está destinada a un usuario especÃfico y no debe ser almacenada en caché por cachés intermedios.
no-cache
Indica al cliente que vuelva a validar la respuesta con el servidor antes de usar la versión almacenada en caché. No impide el almacenamiento en caché, pero requiere la revalidación.
no-store
Indica al cliente y a los cachés intermedios que no almacenen ninguna versión de la respuesta. Garantiza que la respuesta no se almacene en caché en ningún formato.
max-age=<SECONDS>
Especifica la cantidad máxima de tiempo en segundos que el cliente puede almacenar en caché la respuesta. Después de este perÃodo, el cliente debe volver a validar con el servidor.
HTTP Response Content-Type Header
El encabezado "Content-Type" en una respuesta HTTP se utiliza para indicar el tipo de contenido del medio de la respuesta.
Le indica al cliente qué tipo de datos está enviando el servidor para que el cliente pueda manejarlos adecuadamente.

HTTP Response Content-Encoding Header
El encabezado "Content-Encoding" de una respuesta HTTP se utiliza para especificar la codificación de compresión aplicada al contenido de la respuesta.
Le indica al cliente cómo ha codificado el servidor los datos de respuesta, lo que permite al cliente decodificarlos y descomprimirlos correctamente.

HTTP Response Server Header
El encabezado "Server" muestra el banner del servidor web, por ejemplo, Apache, Nginx, IIS, etc.
Google utiliza un banner de servidor web personalizado: gvvs (Google VVeb Server).

Quiz: HTTP Responses



HTTP Basics Lab
Existe dos tipos de comunicaciones que se realiza durante una navegacion web, uno es atravez del la conexion htpp (rquest/response) y otro es a nivel de TCP
Demo: HTTP Basics Lab
Wireshark
Antes de inicializar una comunicacion http, primero se inicia una conexion TCP, como se observa en la siguiente imagen.

Una vez que la conexion a nivel de TCP sea exitosa, se procede a la conexion a nivel de http, en el mismo se ve un paquete con la solicitud "GET", y si ingresamos al paquete en la sección "Hypertext Transfer Protocol" podremos observar todas las cabeceras del cuerpo de la solicitud

Si le da follow a los paquetes de TCP Stream, podra obserbar que tiene paquetes tanto de solicitud como respuestas, y podrá observar como funciona los paquetes de gzip, desde la descargar hasta que los mismos se descomprimen.

Los archivos gzip generalmente se encuentran codificados, pero desde wireshark se puede decodificar y descargar. Menu > File > Export Objects > HTTP

Curl
curl -v http://192.191.151.3/
A continuación se presenta un ejemplo de cómo podrÃa verse la salida del comando curl -v http://192.191.151.3/
:
* Trying 192.191.151.3:80...
* Connected to 192.191.151.3 (192.191.151.3) port 80 (#0)
> GET / HTTP/1.1
> Host: 192.191.151.3
> User-Agent: curl/7.68.0
> Accept: */*
>
* Mark bundle as not supporting multiuse
< HTTP/1.1 200 OK
< Date: Mon, 02 Oct 2023 12:34:56 GMT
< Server: Apache/2.4.41 (Ubuntu)
< X-Powered-By: PHP/5.5.9-1ubuntu4.25
< Set-Cookie: PHPSESSID=4kdjee8snv5s820pemr41p6973; path=/
< Expires: Thu, 19 Nov 1981 GMT
< Cache-Control: no-store, no-cache, must- revalidate, post-check=0,
< Pragma: no-cache
< Vary: Accept -Encoding
< Content-Length: 1234
< Content-Type: text/html; charset=UTF-8
<
<!doctype html>
<html>
<head><title>Example Page</title></head>
<body>
<h1>Hello World!</h1>
<p>This is an example response from the server.</p>
</body>
</html>
* Connection #0 to host 192.191.151.3 left intact
En este ejemplo, curl
establece una conexión con el servidor, envÃa una solicitud GET, y recibe una respuesta HTTP 200 junto con contenido tipo text/html
.
Descripción de las Cabeceras HTTP
Las cabeceras HTTP proporcionan información adicional sobre la solicitud o respuesta. A continuación se describen algunas de las cabeceras presentes en el ejemplo:
Date
: Indica la fecha y hora en la que se generó la respuesta en formato GMT.Server
: Especifica el software que está sirviendo la solicitud, en este caso, Apache versión 2.4.41 en Ubuntu.X-Powered-By
: Muestra la tecnologÃa detrás del servidor, aquà PHP versión 5.5.9.Set-Cookie
: Asigna una cookie al cliente, aquà con el valorPHPSESSID
que identifica la sesión.Content-Type
: Define el tipo de contenido de la respuesta, en este casotext/html
con charset UTF-8.Content-Length
: Indica el tamaño del cuerpo de la respuesta en bytes.Cache-Control
yPragma
: Controlan el almacenamiento en caché de la respuesta.Vary
: El uso de esta cabecera permite al servidor indicar que puede devolver diferentes respuestas con base en ciertos parámetros del request, comoAccept-Encoding
.
Estas cabeceras permiten manejar aspectos como el almacenamiento de datos, la seguridad, y la presentación del contenido.
curl -v -I http://192.191.151.3/
Utilizando el comando curl
, puedes inspeccionar las cabeceras de una respuesta HTTP sin necesidad de descargar el cuerpo completo. En el ejemplo proporcionado, el comando curl -v -I http://192.191.151.3/
realiza una solicitud HEAD al servidor, mostrando exclusivamente las cabeceras HTTP. Esta práctica es útil para verificar la configuración del servidor y depurar problemas sin transferir datos innecesarios.
Las cabeceras HTTP juegan un papel crucial en el manejo de la interacción entre cliente y servidor, y entender sus caracterÃsticas permite optimizar el rendimiento de aplicaciones web, mejorar la seguridad y garantizar una experiencia de usuario consistente.
curl -v -X OPTIONS http://192.191.151.3/
En este contexto, la respuesta a una solicitud OPTIONS
proporciona información crucial sobre los métodos HTTP permitidos por el servidor, tales como GET
, HEAD
, y OPTIONS
mismos. Esto es vital para asegurar que las aplicaciones que interactúan con el servidor estén alineadas con las capacidades de procesamiento previstas. Al conocer qué solicitudes son aceptadas, los desarrolladores pueden adecuar sus implementaciones para evitar errores y optimizar las interacciones con el servidor.
curl -v -X PUT http://192.191.151.3/
For casos en los que necesitas enviar datos al servidor para actualizar un recurso existente, el método PUT
es el adecuado. Utilizando curl
, puedes enviar una solicitud PUT
de la siguiente manera, para actualizar datos en el recurso especificado por la URL:
curl -v -X PUT -d "param1=value1¶m2=value2" http://192.191.151.3/resource
Este comando envÃa los datos especificados en -d
, que puede ser en formato clave-valor o incluso un archivo JSON, dependiendo de lo que el servidor espera. Asegúrate de verificar que el servidor permite las solicitudes PUT
revisando la respuesta a una solicitud OPTIONS
como se explicó anteriormente.
Si el método no es aceptado por el servidor, recibirás una respuesta con el código de estado HTTP 405 Method Not Allowed
. Esta respuesta incluirá una cabecera Allow
que enumera los métodos permitidos para el recurso solicitado. Un ejemplo de cómo se verÃa esta respuesta es:
HTTP/1.1 405 Method Not Allowed
Allow: GET, POST, OPTIONS
Content-Type: text/html
Content-Length: 178
...
<html>
<head><title>405 Method Not Allowed</title></head>
<body>
<h1>Method Not Allowed</h1>
<p>The requested method PUT is not allowed for the URL /resource.</p>
</body>
</html>
Es crucial monitorear la respuesta OPTIONS
para adaptar tus solicitudes adecuadamente.
Burpsuit


En caso de que se detecte un directorio donde se pueda subir archivos.
dirb http://192.191.151.3


Subiar archivo con malware utilizando curl
curl http://192.191.151.3/uploadse/ --upload-file /usr/share/webshell/php/simple-backdoor.php

Eliminar el archivo que se subió


Quiz: HTTP Basics Lab

HTTPS
Ahora que comprende cómo funciona HTTP, analicemos cómo se protege.
De manera predeterminada, las solicitudes HTTP se envÃan en texto sin formato (clear-text) y un atacante puede interceptarlas o alterarlas fácilmente durante el camino hacia su destino.
Además, HTTP no proporciona una autenticación sólida entre las dos partes que se comunican.
HTTPS (Hypertext Transfer Protocol Secure) es una versión segura del protocolo HTTP que se utiliza para transmitir datos entre el navegador web de un usuario y un sitio web o una aplicación web.
HTTPS proporciona una capa adicional de seguridad al cifrar los datos transmitidos a través de Internet, lo que los hace más seguros y los protege del acceso no autorizado y la interceptación.
HTTPS también se conoce comúnmente como HTTP Secure.
HTTPS es la forma preferida de usar y configurar HTTP e implica ejecutar HTTP sobre SSL/TLS.
SSL (Secure Sockets Layer) y TLS (Transport Layer Security) son protocolos criptográficos que se utilizan para proporcionar una comunicación segura a través de una red informática, más comúnmente Internet.
Son esenciales para establecer una conexión segura y cifrada entre el navegador web o la aplicación de un usuario y un servidor web.
Esta técnica de capas proporciona confidencialidad, protección de integridad y autenticación al protocolo HTTP.

HTTPS Advantages
Cifrado de datos en tránsito: uno de los principales beneficios de HTTPS es el cifrado de datos durante la transmisión. Cuando los datos se envÃan a través de una conexión HTTPS, se cifran mediante algoritmos criptográficos sólidos. Esto garantiza que, incluso si un atacante intercepta los datos mientras están en tránsito, no podrá descifrarlos ni leer su contenido.
Protección contra escuchas clandestinas: HTTPS evita que terceros no autorizados puedan espiar los datos intercambiados entre el navegador del usuario y el servidor web. Esto es especialmente crucial cuando los usuarios ingresan información confidencial, como credenciales de inicio de sesión, números de tarjetas de crédito o datos personales.
HTTPS Security Considerations
El protocolo HTTPS no protege contra fallas en aplicaciones web. Diversos ataques a aplicaciones web seguirán funcionando independientemente del uso de SSL/TLS. (Ataques como XSS y SQLi seguirán funcionando)
La capa de cifrado agregada solo protege los datos intercambiados entre el cliente y el servidor y detiene los ataques contra la propia aplicación web.
Quiz: HTTPS


Last updated