Безопасность веб-приложений: Что можно, а что нельзя делать при шифровании с использованием соли.
Источник: garage4hackers.com
Безопасность веб-приложений: Что можно, а что нельзя делать при шифровании с использованием соли
Обзор:
Вопрос безопасности баз данных стал более насущным по мере того, как базы данных становились более открытыми. Шифрование является одним из пяти основных факторов безопасности данных.
Небезопасной практикой является хранение такой важной информации, как пароль, номер кредитной карты в базе данных в незашифрованном виде. Эта статья охватывает различные возможности шифрования.
Даже в если вы зашифровали вашу информацию, это совершенно не значит, что она находится в полной безопасности. В этой статье рассматриваются действия со стороны злоумышленника.
Соль (Криптография)
http://en.wikipedia.org/wiki/Salt_(cryptography)
Предположим, что украден хешированный пароль пользователя. Известно, что пароль является одним из 200,000 английских слов. Система использует 32-х битную соль. «Посоленный» ключ – это оригинальный пароль, добавленный к произвольной 32-х битной соли. Из-за соли посчитанные хеши злоумышленника не подойдут (не удастся использовать радужные таблицы). Злоумышленник должен посчитать хеш каждого слова с каждым из 232 (4,294,967,296) возможных вариантов соли, добавленных к паролю, до тех пор, пока не будет получено совпадение. Общее число возможных комбинаций может быть получено умножением количества слов в словаре на количество возможных вариантов соли:
2^{32} \умножить на 200 000 = 8.58993459 \умножить на 10^{14}
Для завершения брут-форс атаки злоумышленник должен перебрать почти 900 триллионов хешей, вместо всего-лишь 200,000. Даже если пароль сам по себе достаточно прост, соль делает взлом паролей достаточно сложной операцией.
Соль должна быть неизвестной. Если злоумышленник знает, какая используется соль, он сразу может перейти к первому шагу. Ниже приведены несколько возможных способов взлома «посоленных» хешей.
Приложения, не использующие хеши:
Во время изучения веб-приложения я дошел до этого места программы. Программа использовала javascript для шифрования пароля пользователя перед отправкой. В качестве соли использовался текущий ID сессии.
Иногда такого рода программы выдают много информации.
Пункт №1: Всегда шифруйте вашу базу данных паролей.
Недавно я изучал базу данных одной известной !@#$$il[зашифровано]☺. База данных содержала адреса электронной почты и пароли. К сожалению, пароли были зашифрованы и хранились в виде хешей. Таким образом, эта статья будет посвящена тому, как я взломал эти хеши.
Взлом хешей:
Несколько возможных способов взлома хешей паролей:
Для того, чтобы использовать все эти виды атак, вы должны знать, при помощи какого алгоритма был посчитан хеш.
Что можно сделать, чтобы выяснить используемый алгоритм хеширования??
Ответ: Все алгоритмы генерируют хеш фиксированной длины. Поэтому на основании выходного значения вы можете прикинуть, какой алгоритм использовался☺. “Все это – достаточно известные факты”, но по-прежнему я помещаю их здесь.
Для этого я размещу небольшую таблицу для выявления хеш-функций на основе их выходного значения
Язык: Алгоритм: |
PHP |
ASP |
JAVA |
MD5 |
Функция: md5(“входные данные”); Hash(“входные данные”); Вывод: 32 Символа Пример: “5f4dcc3b5aa765d61d8327d eb882cf99” |
Функция: System.Security.Cryptogr aphy Вывод: 32 Символа Пример: “5f4dcc3b5aa765d61d8327d eb882cf99” |
Функция:java.secur ity.MessageDigest Вывод: 32 Символа Пример: “5f4dcc3b5aa765d61d 8327deb882cf99” |
Соль+Crypt() |
Функция: Crypt() По-умолчанию DES вывод: 13 Символов Пример: “sih2hDu1acVcA” |
“ “ |
“ “ |
И многие другие:
Источник: http://www.insidepro.com/eng/passwordspro.shtml
Тип хеша |
Пример хеша |
Дополнительная информация |
DES(Unix) |
IvS7aeT4NzQPM |
Используется в Linux и подобных ОС.
|
Domain Cached Credentials |
Admin:b474d48cdfc4974d86ef4d24904cdd91 |
Используется для хеширования паролей домена Windows.
|
MD5(Unix) |
$1$12345678$XM4P3PrKBgKNnTaqG9P0T/ |
Используется в Linux и подобных ОС.
|
MD5(APR) |
$apr1$12345678$auQSX8MvzttdBi4y6Xgi |
Используется в Linux и подобных ОС.
|
MD5(phpBB3) |
$H$9123456785DAERgALpsri.D9z3ht120 |
Используется в phpBB 3.x.x
|
MD5(Wordpress) |
$P$B123456780BhGFYS|UqGyE6ErKErL01 |
Используется в Wordpress
|
MySQL |
606717496665bcba |
Используется в старых версиях MySQL
|
MySQL5 |
*E6CC90B878B948C35E92B003C792C46C58C4AF40 |
Используется в новых версиях MySQL
|
RAdmin v2.x |
5e32cceaafed5cc80866737dfb212d7f |
Используется в приложении Remote Administrator v2.x
|
MD5 |
c4ca4238a0b923820dcc509a6f75849b |
Используется в phpBB v.2.x, Joomla версии ниже 1.0.13 и в других форумах и CMS.
|
md5($pass.$salt) |
6f04f0d75f6870858bae14ac0b6d9f73:1234 |
Используется в WB News, Joomla версии 1.0.13 и выше
|
md5($salt.$pass) |
f190ce9ac8445d249747cab7be43f7d5:12 |
Используется в osCommerce, AEF, Gallery и других CMS
|
md5(md5($pass)) |
28c8edde3d61a0411511d3b1866f0636 |
Используется в e107, DLE, AVE, Diferior, Koobi и других CMS
|
md5(md5($pass).$salt) |
6011527690eddca23580955c216b1fd2:wQ6 |
Используется в vBulletin, IceBB
|
md5(md5($salt).md5($pass)) |
81f87275dd805aa018df8befe09fe9f8:wH6_S |
Ипользуется в IPB
|
md5(md5($salt).$pass) |
816a14db44578f516cbaef25bd8d8296:1234 |
Ипользуется в MyBB
|
md5($salt.$pass.$salt) |
a3bc9e11fddf4fef4deea11e33668eab:1234 |
Используется в TBDev
|
md5($salt.md5($salt.$pass)) |
1d715e52285e5a6b546e442792652c8a:1234 |
Используется в DLP
|
SHA-1 |
356a192b7913b04c54574d18c28d46e6395428ab |
Используется во многих форумах и CMS
|
sha1(strtolower($username).$pass) |
Admin:6c7ca345f63f835cb353ff15bd6c5e052ec08e7a |
Используется в SMF
|
sha1($salt.sha1($salt.sha1($pass))) |
cd37bfbf68d198d11d39a67158c0c9cddf34573b:1234 |
Используется в Wotlab BB
|
SHA-256(Unix) |
$5$12345678$jBWLgeYZbSvREnuBr5s3gp13vqi… |
Используется в Linux и подобных ОС.
|
SHA-512(Unix) |
$6$12345678$U6Yv5E1|Wn6mEESzKen42o6rbEm… |
Используется в Linux и подобных ОС.
|
Надеемся, данная таблица когда-нибудь пригодится.
И среди этих хешей мне необходимо взломать хеш длиной 13 символов. Судя по таблице, он был посчитан PHP функцией Crypt.
Простое описание Crypt функции PHP:
Рассмотрим пример:
<?php
$password = crypt('password');
?>
Хеш: laAsfestWEiq1
Пароли сгенерированные таким образом будут основаны на случайной соли из двух цифр.
Или мы можем использовать собственную соль.
<?php
$password = crypt('password',’salt’);
?>
Хеш: sih2hDu1acVcA
Так будет выглядеть код программы проверки пароля:
<?if (crypt($user_password, $password) == $password) {
echo "Correct Password";
}
?>
Так или иначе, соль добавляется к хешу, что является особенностью DES. Как я упоминал выше, криптографическая стойкость шифра при использовании соли высока в том случае, если соль неизвестна злоумышленнику. Но в данном случае это не так. Имея эту информацию, взлом хешей не составляет какого-либо труда☺.
И все эти хеши были легко взломаны. Все, что мне пришлось сделать – это использовать словарь паролей, дополненный неизменной солью.
Рассмотрим приведенные ниже образцы программ.
Алгоритм с неизменной солью
$password = $password_input; //введен пользователем
$salt = "salted";
$password = md5($salt.$password); //сохранен в базе данных в виде md5 (saltedpassword)
Хеш: 1423de37c0c1b63c3687f8f1651ce1bf
Соль: salted
В этой программе применяется неизменная соль. Следовательно, она не сохраняется в базе данных. Таким образом, среди хешей мы не сможем найти значение соли.
Для выявления такого алгоритма, нам нужно попробовать следующее:
Взлом соли:
Теперь нам остается только перебрать все хеши, чтобы выяснить значение соли. Например, мы знаем, что соль добавляется к каждому паролю.
Мы знаем:
Md5(‘password’)== “5f4dcc3b5aa765d61d8327deb882cf99”
Теперь вопрос:
Md5(‘password’ + “????WHAT????”) ===
“1423de37c0c1b63c3687f8f1651ce1bf”
Примечание: Никогда не используйте одну и ту же соль для всех хешей:
“Если использовать одну и ту же соль для всех хешей, взломать их будет легко”
Пункт 2: Если ваше PHP приложение хранит в себе важные значения, и вы хотите зашифровать и хранить «посоленные» хеши, в таком случае лучше отказаться от использования функции Crypt() и других функций с неизменной солью.
Алгоритм со случайной солью:
Если для каждого хеша используется случайная соль, что является необходимым для приложения, исходные коды которого доступны публично, просто необходимо хранить соль вместе с хешами. Недостатком этого метода является возможность извлечения соли из хешей. К преимуществам можно отнести то, что злоумышленнику придется строить таблицы хешей для каждой соли при взломе каждого хеша. Это делает сложным взлом множества хешей, но взломать один хеш (например, пароль администратора) все еще возможно.
Рассмотрим пример:
$password = $rand(5); //введено пользователем
$salt = "salted";
$password = md5($salt.$password); //сохранен в базе данных в виде md5(saltedpassword)
Хеш: 6f04f0d75f6870858bae14ac0b6d9f73:14357 (Хеш:Соль)
Соль: 14357
В данном случае мы можем извлечь соль, но так как разные хеши будут иметь разную соль, взлом всех хешей подряд не представляется возможным.
Но все это будет зависеть от стойкости паролей.
В подобных ситуациях единственным вариантом будет перебор паролей по словарю, или нам понадобится программа взлома, распределяющая процесс на несколько машин.
Радужные таблицы хороши не потому, что они имеют все возможные значения хешей, а из-за быстрого алгоритма «поиска».
Рассмотрим:
Проверка радужных таблиц -> поиск [Быстро]
Перебор -> Чтение значения -> Добавление соли -> Вычисление хеша -> Сравнение [Медленно]
Это делает взлом медленней, даже если мы знаем значение соли.
Поэтому для таких ситуаций пригодится распределенная система взлома
Идея распределенной системы взлома
Идея подобной системы заимствует основной принцип торрентов. Если вам что-то необходимо, для этого вы должны поделиться тем, что имеете. Если вы хотите что-то взломать, то вы должны поделиться своими вычислительными мощностями.
Так должна выглядеть архитектура системы:
Насколько это ускоряет взлом?
1.Ваш компьютер в сети должен сгенерировать список паролей. Рассмотрим пароль длиной в 9 символов из букв и цифр. Придется перебрать 101559787037052 комбинаций. Ваш компьютер должен перебрать 101559787037052/N, где “N” – общее число клиентов в сети.
2.Ваш компьютер должен пропустить каждый сгенерированный пароль через множество алгоритмов, которые назначены вам, на многопоточном клиенте.
3.Как только клиент взламывает пароль, он отправляется на сервер взлома. Тот, в свою очередь, передает пароль другому пользователю, которому нужна эта информация.
4.Таким образом, если у вас 350 работающих вместе клиентов, то задача будет решена за день или два.
Поиск неизвестного хеш-алгоритма
Рассмотрим случай с подобным алгоритмом.
Нам нужен переборщик алгоритмов для того, чтобы узнать конечный алгоритм.
Переборщик алгоритмов
Algorithm_Bruter.php
Затем я буду посещать форумы программистов, и обновлять скрипт различными алгоритмами. Таким образом, я смогу найти нужный алгоритм.
Спойлер: мы раскрываем их любимые трюки