MFA Done Right
MFA stops the password dump. The wrong second factor still lets a decent phish walk straight through.
What you will learn
- -Rank the common second factors by how well they survive phishing
- -Explain why origin-bound WebAuthn defeats a real-time phishing proxy
- -Name the bypasses that beat SMS, TOTP, and push
In September 2022 an attacker had an Uber contractor's from a dump and could not past . So they spammed push notifications for an hour, then sent a message pretending to be IT support. The contractor tapped approve. MFA was on the entire time. It still failed, because the factor was one a tired human could be talked through at 1am.
Start with the categories, because real MFA means combining different ones. Something you know: password, PIN. Something you have: a phone, a hardware . Something you are: fingerprint, face. Two passwords is not MFA. A password plus a code from an app is, because the code proves possession of the phone.
Not all second factors are equal, and the gap between them is enormous. Ranked from weakest up:
SMS one-time codes. Phishable and SIM-swappable. the victim's number or sweet-talk the carrier and the code arrives on your phone. NIST 800-63B has discouraged SMS as a factor for years.
from an authenticator app. Better, no SIM to swap, still phishable in real time. A proxy phishing kit shows the victim a fake login, relays whatever six digits they type, and signs in inside the 30-second window.
Push approval. Kills typing but adds fatigue. Bomb someone with prompts long enough and one gets tapped. Number matching, where the app makes you type a two-digit code shown on the real login screen, fixes the blind-tap problem and is the minimum acceptable bar for push today.
Then the category that actually resists phishing: FIDO2 and WebAuthn. Hardware security keys like a YubiKey, and passkeys built on the same .
Why WebAuthn resists phishing
The is bound to the origin. When you a security key to https://login.example.com, the key ties that credential to that RP ID. At sign-in the browser signs a challenge that includes the real origin, and the key only answers for the the credential was registered under.
That one design choice is the whole win. A phishing proxy sitting on login-example-secure.com asks the key to authenticate, the origin does not match, and the key produces nothing the real site will accept. There is no code to relay, because there is no code. The human cannot be tricked into approving the wrong domain, because the browser and the key check the domain, not the person's judgment.
$evilginx2 -> reverse proxy in the middle -> steals the session cookie after MFAThe bypasses map cleanly onto the weak factors. Real-time phishing proxies beat any code-based or push factor by stealing the - , so the second factor happens and the attacker just walks off with the session. MFA fatigue beats plain push. And the quiet one is fallback: an account with a shiny security key that still allows SMS is only as strong as that SMS. Attackers go straight for the weakest enrolled factor and the reset flow, so an MFA rollout that leaves SMS as a backup has mostly kept the hole open.
Standing up evilginx2 or a phishlet against real users is a social engineering attack and needs explicit written every time, even inside your own company. To learn the mechanics, target accounts you own on a test IdP, or try the demo at webauthn.io to feel the origin binding yourself. Pointing a phishing proxy at anyone without signed is illegal and career-ending.
Why does a FIDO2 security key defeat a real-time phishing proxy that happily captures TOTP codes?