Se usate MySQL per qualche app, vi consiglio di configurare una collation che riconosce punycode. Molte applicazioni sono vulnerabili per esempio con password reset, ed e’ molto facile fare account takeover con password reset :p
L’importante e’ che quella che usi supporta tutti i caratteri Unicode, incluso il full range di code points necessario per pjunycode che lo standard utf8 non supporta. utf8mb4 oppure utf8mb4_0900_bin per binary-safe storage e confronto, oppure utf8mb4_0900_ai_ci per access insensitive, case insensitive.
MySQL, con la default uft8 collation non distingue tra caratteri normali e varianti punycode. Per esempio, la lettera punycode ḻ viene misinterpretata come la normale lettera l, e questo non va bene per la sicurezza. Per esempio supponiamo che un utente si sia registrato con l’indirizzo email [email protected]. Un attacker potrebbe provare a fare il password reset con l’indirizzo vittima@bḻah.com. Se
MySQL ha una normale utf8 collation
Il backend fa un lookup per vedere se l’account con la email normale esiste
Ma usa l’email passata come parametro per inviare l’email
Il risultato e’ che la email con il link per il password reset (che include un token) viene inviato all’attacker invece che alla vittima. L’attacker puo’ dunque fare password reset e entrare nell’account della vittima.
Per fare questo l’attacker deve semplicemente registrare versioni punycode di domini che altri utenti usano. Per esempio io ho varie varianti di gmail.com, outlook.com, icloud.com e altri.
Una verifica veloce direttamente in MySQL:
select 'ȃ' = 'a';
Se il risultato e’ 1, allora e’ probabile che sei vulnerabile a seconda di come il backend e’ implementato.
ma in teoria chi sviluppa l’app e il frontend dei check di “sanificazioni” o normalizzare/canonizzare dei dati in input che un utente può mettere va fatto, tra l’altro cmq per le versioni recenti di MySQL non dovrebbe esserci questo problema, c’è in quelle più vecchiotte… in quel caso sei stronzo che non aggiorni sta cosa dal 2018 minimo.
anche se usi mysql aggiornato e relativi collation potresti esser vittima se il backend non è fatto bene, es. invece di usare la mail che trova nel db poi usa quella passata dall’utente per spedire la mail.
con wordpress tra l’altro devi mettere un append alfanumerico casuale al posto del wp_ davanti al nome delle tabelle se no ti bucano il db di wordpress il giorno dopo in fase di build del db iniziale