DEV Community

Vay3t
Vay3t

Posted on • Originally published at vay3t.Medium

Protocolo HTTP — Comprendiendo las tecnologías Web

Image description

Que es el protocolo HTTP?

El protocolo HTTP (Hypertext Transfer Protocol) es un conjunto de reglas que permite la comunicación y el intercambio de información entre computadoras en la World Wide Web (la red de Internet).

El protocolo HTTP utiliza TCP (Protocolo de Control de Transmisión) porque TCP proporciona una comunicación confiable y orientada a la conexión. Esto significa que TCP garantiza la entrega de datos en el orden correcto y sin errores, lo cual es esencial para asegurar que las páginas web y otros recursos se carguen correctamente y sin problemas en los navegadores.

Diferencia entre HTTP y HTTPS

La principal distinción entre HTTP y HTTPS radica en la protección de la comunicación. Mientras HTTPS encripta y asegura la información transmitida, HTTP no lo hace, exponiendo los datos a riesgos y espionaje. Por ello, se aconseja emplear HTTPS en la medida de lo posible, sobre todo en páginas web que gestionan información delicada o privada.

Modelo de comunicación HTTP

El protocolo HTTP es un modelo de comunicación cliente — servidor utilizado en la web. El cliente, como un navegador web, envía solicitudes (Requests) a un servidor que aloja y administra recursos. El servidor procesa las solicitudes (Requests) y responde (Response) con la información o acciones solicitadas. Este modelo facilita el intercambio de información en la web, permitiendo una separación clara de responsabilidades entre clientes y servidores.

Esquema de conexión Cliente — Servidor

+-----------+                               +------------+
|           |        172.16.18.2:80         |            |
|           |  +------------------------->  |            |
|           |            Request            |            |
|  Cliente  |                               |  Servidor  |
|  Firefox  |                               |    Web     |
|           |      172.16.20.34:36894       |            |
|           |  <-------------------------+  |            |
|           |            Response           |            |
+-----------+                               +------------+
*172.16.20.34*                              *172.16.18.2*
Enter fullscreen mode Exit fullscreen mode

Los puertos comunes usados en servidores web son los siguientes 80/81/443/8000/8080/8443/8888

Que servidores y clientes existen?

En el contexto de la web y el protocolo HTTP, hay varios servidores y clientes disponibles. Estos son algunos ejemplos de cada tipo:

Servidores web:

  1. Apache HTTP Server: Un servidor web de código abierto muy popular y ampliamente utilizado.

  2. Nginx: Un servidor web de alto rendimiento, también utilizado como proxy inverso y balanceador de carga.

  3. Microsoft Internet Information Services (IIS): Un servidor web desarrollado por Microsoft, integrado en sus sistemas operativos Windows Server.

  4. Caddy: Un servidor web moderno, escrito en Go, que se centra en la facilidad de uso y la seguridad. Incluye soporte automático para HTTPS utilizando Let’s Encrypt.

  5. Tomcat: Un servidor web y contenedor de servlets Java desarrollado por la Apache Software Foundation. Tomcat se utiliza principalmente para desplegar aplicaciones web basadas en Java.

  6. Gunicorn: Un servidor web WSGI para Python, utilizado para servir aplicaciones web basadas en Python, como aquellas creadas con Django o Flask.

Clientes web

  1. Navegadores web: Como por ejemplo Google Chrome, Mozilla Firefox, Apple Safari, Microsoft Edge, Opera que permiten a los usuarios navegar por la web y acceder a recursos en línea.

  2. Aplicaciones móviles: Muchas aplicaciones móviles actúan como clientes HTTP al solicitar y recibir información de servidores web. Algunos son Instagram, GMail, Whatsapp, Telegram, Uber, Netflix, y un sin fin…

  3. Herramientas de línea de comandos: Programas como curl o wget que permiten enviar solicitudes HTTP desde la línea de comandos en un sistema operativo.

  4. Bibliotecas y frameworks: Lenguajes de programación como Python, Java, JavaScript, entre otros, cuentan con bibliotecas y frameworks que permiten a los desarrolladores crear aplicaciones que funcionen como clientes HTTP.

Que es una URL?

Una URL (Uniform Resource Locator) es una dirección única que identifica un recurso en la web, como una página web, una imagen o un archivo. La URL especifica la ubicación del recurso y cómo acceder a él mediante protocolos como HTTP.

Estructura de una URL

Si descomponemos la estructura de una URL podríamos ordenarlo de la siguiente forma:

<protocolo>://<dominio>:<puerto><path><parametros>

http://vay3t.org:81/hello?name=nch&message=wspmdf

- protocolo = http
- dominio = vay3t.org
- puerto = 81
- path = /hello
- parametros = ?name=nch&message=wspmdf
  - variables = name,message
  - valores = nch,wspmdf
Enter fullscreen mode Exit fullscreen mode

Estructura del protocolo

Image description

Ya, pero que significa todo esto?

Los headers, verbos/métodos, códigos de estados y MIME types son componentes importantes en la comunicación basada en el protocolo HTTP.

Request

Image description

  1. Verbo/Método
  2. Path
  3. Versión del estándar HTTP
  4. Navegador Web Cliente
  5. Idioma cliente
  6. Headers

Response

Image description

  1. Versión del estándar HTTP
  2. Status code
  3. Versión del servidor (ahí podría ir Apache/1.1 o cosas así)
  4. Largo del contenido del response
  5. Cuerpo del response

Un poco de detalle… (Modo: DEBUG)

A continuación, se explica brevemente cada uno de estos componentes:

Image description

Image description

Webs modernas, las APIs

Image description

Backend y frontend

El backend y el frontend son dos componentes principales en el desarrollo de aplicaciones web y móviles. Ambos trabajan juntos para ofrecer una experiencia completa al usuario.

  • Frontend: Es la parte visible e interactiva de la aplicación, con la que el usuario interactúa directamente. El frontend se encarga de la presentación y la interacción, utilizando tecnologías como HTML, CSS y JavaScript. Su principal objetivo es proporcionar una interfaz atractiva y fácil de usar.

  • Backend: Es la parte oculta que gestiona la lógica de negocio, el procesamiento de datos y la comunicación con bases de datos o servicios externos. El backend suele estar compuesto por servidores, bases de datos y APIs. Los lenguajes de programación comunes para el backend incluyen Python, Java, Ruby, PHP y Node.js.

REST / SOAP

REST y SOAP son dos protocolos ampliamente utilizados en la comunicación entre sistemas, particularmente en el desarrollo de servicios web, específicamente a nivel de backend.

REST (Representational State Transfer) es un estilo arquitectónico basado en HTTP que utiliza verbos comunes como GET, POST, PUT y DELETE para realizar operaciones en recursos identificados por URLs. Utiliza una estructura JSON (presentado en la imagen anterior a la izquierda).

SOAP (Simple Object Access Protocol) es un protocolo basado en XML (presentado en la imagen anterior a la derecha) diseñado para mejorar la comunicación y la interoperabilidad entre sistemas, puede ser usado en servicios web. Permite a las aplicaciones intercambiar información de manera estandarizada.

Los dos cumplen el mismo objetivo que es estandarizar las comunicaciones para interactuar con el backend web, con la diferencia que actualmente es más usado REST por ser más ligero, simple y fácil de implementar que SOAP.

Estilos arquitectónicos existentes

Image description

Conceptos a entender

Un endpoint es una dirección URL en un servicio web o API que permite enviar solicitudes y recibir respuestas. Actúa como punto de entrada para interactuar con funciones o recursos específicos y se identifica mediante un método HTTP y una URL única.

La documentación de una API es un conjunto de recursos e información que explica cómo utilizar e interactuar con la API, incluyendo detalles sobre autenticación, endpoints, ejemplos de código y manejo de errores (presentado en la imagen anterior al medio). Es esencial para que los desarrolladores puedan integrarla eficientemente en sus aplicaciones.

Usando la terminal

HTTPBin es un proyecto de código abierto que proporciona un conjunto de endpoints para realizar pruebas y depurar clientes HTTP. Es una API RESTful que ofrece varios endpoints para realizar diferentes tipos de solicitudes HTTP y analizar sus respuestas.

GitHub logo postmanlabs / httpbin

HTTP Request & Response Service, written in Python + Flask.

cURL

cURL es una herramienta de línea de comandos y biblioteca que permite transferir datos a través de diversos protocolos. Se utiliza principalmente para realizar solicitudes HTTP, acceder a APIs, depurar y automatizar procesos en aplicaciones web. Es compatible con múltiples plataformas y sistemas operativos, y su biblioteca está disponible en varios lenguajes de programación.

Comando (request)

curl -i https://httpbin.org/post -X POST -d "name=nch&message=wspmdf"
Enter fullscreen mode Exit fullscreen mode

Response

HTTP/2 200
date: Wed, 12 Apr 2023 05:34:40 GMT
content-type: application/json
content-length: 454
server: gunicorn/19.9.0
access-control-allow-origin: *
access-control-allow-credentials: true

{
  "args": {},
  "data": "",
  "files": {},
  "form": {
    "message": "wspmdf",
    "name": "nch"
  },
  "headers": {
    "Accept": "*/*",
    "Content-Length": "23",
    "Content-Type": "application/x-www-form-urlencoded",
    "Host": "httpbin.org",
    "User-Agent": "curl/7.81.0",
    "X-Amzn-Trace-Id": "Root=1-643642f0-1ac9239a66e04bc20b27036a"
  },
  "json": null,
  "origin": "x.x.x.x",
  "url": "https://httpbin.org/post"
}
Enter fullscreen mode Exit fullscreen mode

Con un poco de Bash se pueden hacer muchas cosas como lo que escribí en un post anterior:

Conclusión

Objetivo en la seguridad ofensiva

La importancia de entender el protocolo HTTP desde una perspectiva del atacante te permitirá identificar y explotar con mayor facilidad y efectividad proyectos web, realizando ataques sofisticados y personalizados, logrando de esta forma un mayor impacto.

Mucho texto, a mimir

Image description

Autores

NCH & OpenAI

Top comments (0)