Неякісне використання MD5 у веб додатках

22:44 10.08.2010

Алгоритм шифрування MD5 (Message-Digest algorithm 5), що призначений для створення хешів, активно використовується в програмуванні, зокрема при розробці веб додатків, в якості секюріті інструмента. Окрім його використання для хешування паролів, також MD5 використовується для інших задач, що стосуються безпеки (про які йтиметься у даній статті). Наприклад, для генерації паролів при інсталяції чи створенні нових акаунтів, або при створенні випадкових рядків для імен файлів чи папок.

При використанні MD5 алгоритму в секюріті цілях можливе неякісне його використання, що призведе по погіршення безпеки веб додатків і до появи уразливостей в них. Дані недоліки використання MD5 алгоритму я назвав MD5-string атакою. В 2007-2008 роках я знайшов два таких випадки, що стосуються WordPress (інші веб додатки також можуть мати подібні уразливості).

Як я вже зазначав в 2008 році - вихідний алфавіт алгоритму MD5 має 16 символів. Тому при використанні, наприклад, функції md5 (в PHP), на її виході ви отримаєте рядок, що складається з 16 символів md5-алфавіту. І при використанні короткого рядка, його надійність вийде невилика, якщо використовувати цей рядок для захисних механізмів (тому що його можна буде відносно легко підібрати).

Кількість можливих комбінацій в залежності від довжини md5-рядка:

16^1 = 16
16^2 = 256
16^3 = 4096
16^4 = 65536
16^5 = 1048576
16^6 = 16777216
16^7 = 268435456

Тільки при довжині md5-рядка в 7 символів, його надійність буде прийнятною (при використанні для захисних механізмів). Якщо довжина md5-рядка менше 7 символів, то її можна відносно швидко підібрати.

Приклади MD5-string атак.

1. Використання md5-рядків для створення паролів.

Як я писав стосовно Weak Password уразливості в WordPress, в даному движку (в версіях WordPress 2.0.x і потенційно до 2.3.3 включно), при інсталяції задається слабкий пароль.

Він складається з 6 символів md5-алфавіту. А так як на виході функції md5 маємо алфавіт в 16 символів, то даний пароль має 16777216 можливих комбінацій. І брутфорсом його можна відносно швидко підібрати.

2. Використання md5-рядків в якості шляху до важливих ресурсів.

Як я писав стосовно Information Leakage та Full path disclosure уразливостей в WordPress, в плагіні WordPress Database Backup функція md5 використовується для створення папки для бекапів.

Ім’я папки має вигляд “backup-xxxxx” - це “backup-” та 5 символів md5-алфавіту. І це всього 1048576 можливих комбінацій. Що можна відносно швидко підібрати.

Так що при використанні MD5 алгоритму для захисних механізмів у веб додатках потрібно враховувати його алфавіт. Тому що у випадку коли використовується короткий md5-рядок для створення паролю (як у WP), або для назви папки з бекапами БД (як у плагіні WordPress Database Backup), то це можна відносно швидко забрутфорсити.

P.S.

Як показали мої дослідження роботи різних хеш-функцій (на додаток до md5), в результаті роботи таких хеш-функцій як gost, lm, md4, mysql323, mysql411, ntlm, ripemd128, ripemd160, ripemd256, ripemd320, sha1, sha224, sha256, sha384, sha512, tiger128_3, tiger128_4, tiger160_3, tiger160_4, tiger192_3, tiger192_4 та whirlpool видається рядок, що також є шістнадцятирічним числом (як і в md5). Тому даний рядок також має алфавіт з 16 символів. І тому всі застереження щодо довжини рядка в функції md5 (при використанні даного рядка для захисних механізмів) в рівній мірі відносяться до даних функцій.


3 відповідей на “Неякісне використання MD5 у веб додатках”

  1. MustLive каже:

    You can read this article on English: Faulty using of MD5 in web applications.

  2. MustLive каже:

    Як я зазначив в коментарях стосовно даної статті, використання md5 для створення випадкових рядків для захисних цілей є ненадійним. Зокрема при невеликій довжині рядка, що видно по наведеним мною прикладам. Але як я зазначав, при достатній довжині md5-рядка (від 7 до 32 символів) його надійність буде достатньою.

    І в своєму коментарі я навів приклади коректного використання MD5 - з достатньою довжиною md5-рядка. Це використання функції md5 для генерації анти-CSRF токенів: в WordPress (в версії 2.0.3 і вище) використовується md5-рядок довжиною в 10 символів, а в Drupal (як мінімум в 6.x) використовується md5-рядок довжиною в 32 символа. Що є цілком надійно.

  3. MustLive каже:

    Додав в статтю інформацію про тестування різних хеш-функцій (що я провів з використанням сервісу rehash.dustinfineout.com).

Leave a Reply

You must be logged in to post a comment.