Man-in-the-Middle Attacks in the Wild: How HTTPS and HSTS Protect Your App Data

A few months ago, I was working from a crowded coffee shop in downtown Seattle. I connected to the shop’s public WiFi, labeled "Coffee_Shop_Guest". Being a security professional, I immediately started up a Virtual Private Network (VPN) before checking my emails or accessing client code. However, I decided to run a quick test. I fired up Wireshark, a popular network packet analyzer, and began monitoring the traffic passing through the airwaves.

What I saw was alarming. Within minutes, I was capturing plaintext API requests from other patrons' laptops. People were accessing their banking sites, submitting login credentials, and loading developer API keys—all completely exposed to the network. An attacker sitting in the corner could have easily intercepted these packets, read their sensitive session data, and hijacked their accounts.

This is the classic **Man-in-the-Middle (MITM)** attack. In this guide, we will analyze how MITM attacks operate on public networks, how HTTPS secures data in transit, and how the critical **HTTP Strict Transport Security (HSTS)** header prevents certificate-bypass exploits.

The Mechanics of a Man-in-the-Middle Attack

On a local network (like a public WiFi hotspot), data is routed using the Address Resolution Protocol (ARP). ARP maps IP addresses to physical MAC addresses. Because ARP was designed in the early days of the internet without built-in authentication, it is highly vulnerable to a technique called **ARP Spoofing**.

An attacker on the same network can broadcast malicious ARP packets stating, *"My MAC address is the router's IP address!"* The other computers on the network believe this claim and begin routing all of their outbound internet traffic directly through the attacker’s machine instead of the real router. The attacker silently inspects or modifies the data packets before forwarding them to the real gateway, acting as a middleman.

⚠️
The Danger of Plain HTTP: If an application communicates over unencrypted HTTP (non-secure), every request and response—including cookies, headers, and payloads—is sent across the network in raw, human-readable text. Any router or device along the connection path can read and record the credentials.

How HTTPS Secures the Channel

To secure network communications, we use **HTTPS** (HTTP Secure), which is standard HTTP encapsulated inside a **TLS** (Transport Layer Security) cryptographic tunnel. HTTPS guarantees three core security principles:

  1. Encryption: Data is encrypted symmetrically (usually with AES-GCM or ChaCha20) so that even if a MITM captures the packets, they only see garbled, mathematically unreadable bytes.
  2. Data Integrity: Packets are cryptographically signed. If a MITM attempts to modify the data in transit, the signature check fails, and the browser aborts the connection instantly.
  3. Authentication: HTTPS uses **SSL/TLS Certificates** issued by trusted Certificate Authorities (CAs) to verify that the website you are connecting to is actually the genuine site (e.g. that `yourbank.com` is owned by the bank, not the attacker's server).

The SSL-Strip Exploit: Why HTTPS Alone is Not Enough

Even if your server supports HTTPS, you are still vulnerable to a dangerous MITM attack called **SSL Stripping** (popularized by security researcher Moxie Marlinspike).

When a user types `ayacorporation.online` into their browser, the browser defaults to making a plain HTTP request: `http://ayacorporation.online`. Under normal circumstances, the server receives this HTTP request and responds with a `301 Redirect` header telling the browser to reconnect securely via HTTPS: `https://ayacorporation.online`.

In an SSL-stripping attack, the MITM intercepts that initial HTTP request. Instead of forwarding it to the secure site, the attacker makes the HTTPS connection to the real server themselves. The attacker receives the secure page, strips all `https://` links, converts them back to `http://`, and sends the unencrypted plain HTML page back to the user.

The user’s browser displays the page successfully, but the lock icon in the address bar is missing. Since the connection between the user and the attacker is plain HTTP, all usernames, passwords, and sessions entered by the user are captured by the attacker in plaintext.

The Ultimate Shield: HTTP Strict Transport Security (HSTS)

To completely close the SSL-stripping vulnerability, we use **HSTS** (HTTP Strict Transport Security). HSTS is an HTTP header sent by the server that instructs the browser to **never communicate over plain HTTP.**

When the browser receives this header, it records the directive. For all future visits to that domain (for the duration specified in the header), if the user types `http://example.com` or clicks an insecure link, the browser **automatically upgrades the connection to HTTPS locally** before sending any data over the network.

How to Implement the HSTS Header

To enable HSTS, configure your server to return the `Strict-Transport-Security` header. Here is a secure config in Nginx and Node.js Express:

# HSTS Configuration in Nginx
add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" always;
// HSTS Configuration in Node.js Express using Helmet middleware
const express = require('express');
const helmet = require('helmet');
const app = express();

app.use(
  helmet.hsts({
    maxAge: 63072000, // 2 years in seconds
    includeSubDomains: true,
    preload: true
  })
);

Breaking Down the HSTS Parameters

  • max-age: Specifies how long (in seconds) the browser should remember to enforce HTTPS. 2 years (63072000 seconds) is the recommended standard.
  • includeSubDomains: Applies this rule to all subdomains (e.g. `api.example.com` and `dev.example.com`).
  • preload: Submits your domain to the global HSTS Preload List maintained by Google. Once listed, browsers ship with your domain pre-registered as HTTPS-only, securing the very first connection attempt.

Conclusion: Zero Trust Networking

Network security is a fundamental pillar of web application development. When deploying your APIs, portals, and tooling, assume that the user's local network is hostile. By enforcing HTTPS, configuring strong TLS parameters, and deploying HSTS headers, you defend your users from credential sniffing and session hijacking, ensuring their data remains secure from end to end.

A

Abdul-Muqaddam

Full-Stack Developer & Security Researcher

Abdul-Muqaddam is a software developer specializing in web application security, cryptographic architectures, and secure client-side tooling. As the core architect of Aya Corporation, he has built over 86 client-side utilities with a zero-trust, privacy-first design model.

Applied Cryptography Web Security JavaScript / Node.js API Architecture
View GitHub Profile ↗