Preorder drugiego tomu książki sekuraka: Wprowadzenie do bezpieczeństwa IT. -15% z kodem: sekurak-book
Github: dla pewnych kont można było wysyłać e-maile z resetem hasła na… inne adresy mailowe
Ciekawy przykład, który w zasadzie może wystąpić w każdej aplikacji webowej. Otóż przy próbie resetu hasła, GitHub podany adres mailowy najpierw robił lowercase, a później porównywał z tym w bazie. W czym problem? W Unicode.
Przykład?
’ß’.toLowerCase() === ’SS’.toLowerCase() // true
// Note the Turkish dotless i
’John@Gıthub.com’.toUpperCase() === ’John@Github.com’.toUpperCase()
Czyli jeśli założyłem sobie maila z np. tureckim i w nazwie, toLowerCase() normalizował to do zwykłego 'i’. A następnie wysyłał maila z tokenem umożliwiającym reset hasła do oryginalnego maila.
Innymi słowy zakładam np. konto mıchal@popularna-domena.com i zgarniam token, który powinien dostać michal@popularna-domena.com. Przy waszych testach warto sprawdzić też triki typu: domena gmaıl.com, inne tego typu „dziwne” litery czy inne miejsca niż e-mail, w których możliwe jest użycie Unicode.
–ms
Ciekawy temat, i chyba nawet na czasie. Nasza kochana Poczta; i możliwość komunikowania się przez nią. Pan pośrednik, zaglądający przez ramię? Jest on, czy go niema? Jaka poczta jest najlepsza; w domyśle, najbezpieczniejsza?
Problem jak zwykle w dającym raka Javascripcie. Mroczne czasy.
Ale przecież „problem” jest w Unicode, a nie w danym języku programowania ;)
Przecież GitHub jest napisany w Ruby…
Problem nie leży w Unicode, tylko w jego leniwej implementacji. https://en.wikipedia.org/wiki/Dotted_and_dotless_I#In_computing – Unicode jest projektowane tak, żeby tego typu znaki, mimo tego, że graficznie identyczne, miały inne kody. Problem z ß jest ten sam, ale leniwa interpretacja podobno dotyczy Chrome – testowałem kilka języków i przeglądarek (bez Chrome) i nie znalazłem takiej, która by przerabiała ß na ss. https://en.wikipedia.org/wiki/%C3%9F#Keyboards_and_encoding – problem interpretacji tym bardziej widać po tym, że Wasze ß już jest małą literą. W mojej przeglądarce 'ẞ’.toLowerCase() === „ß”
Na te podatnosc nalozyl sie grzeszek Githubowcow – porownac, porownali, ale token wysylali na adres podany przez usera, a nie ten odnaleziony w bazie.
nice one :]