Enter a domain you own (e.g. yourdomain.com).
Substitutes Latin letters with visually identical Cyrillic/Greek glyphs and
shows the real xn-- punycode form you'd have to
register at a registrar.
Paste any email or domain — see the true codepoint of every character, non-ASCII flags, Unicode block, and which Latin letter it's impersonating.
The bug is an inconsistency: the database folds the puny character, SMTP doesn't, and the app emails the string as typed.
xn--gmil-1sa.com
(renders as gmăil.com). No account on the target is needed.victim@gmăil.com. SMTP would deliver this to the attacker —
that's the whole point.WHERE email = 'victim@gmăil.com' runs under an accent-insensitive
collation (MySQL default *_ai_ci): gmăil == gmail →
it matches the victim's real row → token issued against the victim.victim@gmăil.com —
which DNS resolves to the attacker's mail server. Victim's token,
attacker's inbox.Why WordPress is immune even with the same risky
collation: it queries the DB with user input but emails the address pulled
from the DB row. Both halves matter. This lab has toggles for each half:
FOLD_COLLATION (DB folds / exact) and
EMAIL_FROM (UserInput ⚠ / EmailFromDB ✓).
Same inconsistency also bites OAuth flows when an identity provider returns
a puny email the app trusts (the writeup: GitLab does — Google doesn't).