За кукитата на WordPress

November 21, 2007

Репортнат е WordPress bug, че ако потребител има read-only достъп до базата може да си създаде валиден логин за блога (от коментарите в блога на Слави).

Грешката ме впечатли с принципността си, въпреки че е абсолютно безобидна, т.е. не налага да се плашите и да ъпгрейдвате.

По принцип паролите се съхраняват криптирани еднопосочно, чрез някакъв алгоритъм, примерно md5 (един от първите ми блог постове беше на тази тема). Идеята е вместо mygreatpass в базата да седи 7100fc8f0012fd8c342e082b5e2fbd50, като от 7100fc8f0012fd8c342e082b5e2fbd50 не може да се получи обратно mygreatpass по никакъв друг начин, освен с налучкване. Така ако някой по някакъв начин, примерно със SQL Injection види паролата, да не може да логне с нея. Едно е да имаш достъп до информацията за малко, друго – достъп до 1 или 100 000 работещи пароли, които ще продължат да работят, докато юзърите не си ги сменят.

От друга страна, почти всички сайтове предлагат опция да ви помнят логина. Т.е. в cookie в браузъра се записва текст, който замества едновременно юзъра и паролата. Какво са направили от wordpress? Сложили са cookie-то да е двойно md5 на паролата. Това обаче превръща md5 стринга в реална парола, защото е напълно достатъчно да знаеш него, за да логнеш…

Какво решение измислих аз, още докато пишех за пръв път такова нещо и грам теория не бях чувал: за cookie използвах md5 на комбинация от user, pass, microtime и 10-тина случайни символа. Вероятно в wordpress 2.3.2 ще има подобно решение.

В случая на Слави, по някакъв начин в блогрола му започнали да се появяват връзки за възбуждащи лекарства и наркотици и като сменил паролата се оправило. Ми да – ако си сложиш за юзър admin и за парола qwerty, никое софтуерно решение не може да ти помогне. За съжаление, работя и с 1 база с пароли в явен вид и имам наблюдения (ха ха, ето защо паролите трябва да са криптирани) какво ползват хората за пароли и на база това мога само да ви кажа:

Ползвайте:

– главни и малки букви едновременно
– цифри
– специални символи
– над 10 символа парола

Ако имате и най-малкото съмнение, че даден сайт е долнопробен или не се поддържа – отделна парола за него.

Важно е да се знае, че md5, при все широката си употреба, вече не е достатъчна защита.

Причината за това е, че от md5 hash-a може чрез програма за да се намери алтернативен текст, който е да служи за парола. Вместо mygreatpass ще намери стринг от сорта на QFKv/zцjFAfejzFZfe, но вас това не ви вълнува, защото от гледна точка на съответния сайт, ефектът ще е същия. Не съм виждал реална програма, която прави това, не знам и за колко време се справя (някой по-грамотен в областта на сигурността може да каже повече). Ако сега ми се наложи да пиша нов сайт с нови логини, бих се спрял на нещо новичко – sha512 – hash(). Sha1, за който бях писал по-рано, всъщност също е разбит вече (10x AquilaX).

Публикувано в: Гърнето с боба 11 коментара RSS 2.0

Ако постът ви харесва, цъкнете на сърцето:

Коментари

11 коментара на “За кукитата на WordPress”

  1. smn on November 21st, 2007 20:16

    Съществуват доста сайтове, на които можеш да събмитнеш MD5 хеш, сървърчето да си го бори, и ти от време на време да рефрешваш страницата дали случайно не го е декриптнало.

    Доста неприятно ми стана, когато видях на един такъв сайт, че хеша на паролата, която най-често използвам е вече разбит. Моментално я смених, разбира се, но мисля си, че освен подбирането на добра парола, от голяма важност е тя да се сменя по-често.

    Което води до друг проблем – забравянето 🙂

  2. dzver on November 21st, 2007 21:06

    Аз смятам постепенно да мигрирам към sha1. Доста е трудоемко, за съжаление.

  3. AquilaX on November 21st, 2007 23:23

    Един хубав постинг в Coding Horror по темата с едно просто но в повечето случай ефективно решение на проблема с таблиците с хешове.

  4. dzver on November 22nd, 2007 00:32

    Идеята да съхраняваш паролите криптирани със салт е много ценна, не знаех за rainbow tables, мерси 🙂

  5. николай on November 22nd, 2007 01:07

    dzver,
    За съжаление проблемът няма да се реши с просто добавяне на приозволна „сол“. Солта ще трябва да се пази някъде в базата, което значи, че ако атакувашият се добере до нея пак ще може да си направи fake login. Е, няма да му е толкова лесно да използва rainbow за да разбере истинските пароли, но пак ще може да си джитка из сайта.

    Решението е солта да е динамична и да съдържа криптирана версия на паролата, като по-подробни схеми има описани във връзката към bug-чето, която вече си дал.

  6. Pharaon on November 22nd, 2007 01:37

    “- главни и малки букви едновременно
    – цифри
    – специални символи
    – над 10 символа парола
    Ако имате и най-малкото съмнение, че даден сайт е долнопробен или не се поддържа – отделна парола за него”

    Моите пароли с в синхрон със всички твои препоръки, освен 10-те символа! Защото има неща (програми, сайтове), които не поддържат повече от 8. Има и неща, които не поддържат специални символи. Така да приемеме че използваш една дума, една и съща навсякъде, плюс една различна отзад, специфична за конкретното нещо. И ако имаш пароли в 50 неща, как подяволите ще запомниш кое позволяваше спциални символи, КОЕ НЕ, кое с повече символи кое с по-малко…. става една каша. Но при правилна и логична паролна политика горе-доле се менажират нормално нещата! Но само повече от 10 символа няма какд а го впиша в универсалната, но добре защитена парола 😛
    А е закон за сайт, на който нямаш доверие, или при който админа лесно може да се добере до паролата ти (особено ако ти е познат и му нямате доверие) и да разгадае логиката ви да си имаш отделна парола. Но стават много трудни за запомняне и записването е неизменно…

  7. николай on November 22nd, 2007 10:06

    Pharaon, аз си пазя едно, криптирано с gpg, файлче с пароли. Ако съм забравил — гледам там. Разбира се, има и доста специални инструменти за пазене на пароли, които ще те улеснят много. Дори някой да ми открадне файлчето ще му коства доста усилия, за да разбере някоя парола 🙂

    Като стана дума за сложни/дълги пароли, много ме ядосват сайтове, които не ми дават да слагам разни специални символи вътре. Ограничаването на символите за пароли трябва да е просто върху ASCII (код < 128), за да не пишат случайно хората пароли на собствената си клавиатурна подредба и после да се чудят защо не могат да влязат. Обаче да не ми дават да слагам $ или # не е много приятно.

  8. dzver on November 22nd, 2007 10:33

    !@#$%^&*()_=~` не са ЧАК ТОЛКОВА специални символи. Да, повишават сигурността на паролата, но друго си е да ползваш нещо наистина различно 🙂 ▓▓▓▒░

    В сайтовете, на които нямам доверие въобще не си правя труда да помня паролите – давам им да ме логне с cookie и ако някой ден се изгуби и вече не помня паролата – искам си нова по mail. Примерно правил съм поне 3 пъти това с news.bg 🙂

    В случая на уърдпрес и двойното md5, rainbow tables не би сработило (32 символа е паролата преди повторното криптиране). Проблемът е и в надеждността на самия алгоритъм.

  9. николай on November 22nd, 2007 12:21

    Май базите от данни с мд5 суми са доста напред с материала. В една, която намерих, имаше доста двойни хешове на кратки думи. Например успя да ми хване хеша на хеша на „baba“.

  10. dzver on November 22nd, 2007 12:42

    mysql> select md5(‘a╡’);
    +———————————-+
    | md5(‘a╡’) |
    +———————————-+
    | 7d7a24cc38c38979fe33a1b2c95e746a |
    +———————————-+

    HASH NOT FOUND ;-P

    Аз все пак ще експериментирам с php hash() sha256 или нещо по-едро.

  11. николай on December 18th, 2007 10:20

    Ryan скоро coommit-на новият протокол за cookie-та. В блога си е описал промените по-подробно.

    В моя блог карам на trunk и не съм имал проблеми с новите cookie-та.

Оставете отговор