2. Future Now
Уязвимости ДБО на примере PHDays I-Bank
PHDays I-Bank НЕ ЯВЛЯЕТСЯ системой ДБО, которая
действительно работает в каком-либо из
существующих банков.
Система разрабатывалась специально для конкурса
на PHDays 2012
PHDays I-Bank содержит уязвимости, которые мы
находили в реальных системах ДБО
Причем, многие из уязвимостей встречаются очень
и очень часто
3. Future Now
Идентификация
Предсказуемые идентификаторы
пользователей – куда более опасная
проблема, чем может показаться на
первый взгляд!
В PHDays I-Bank, как и почти во всех реальных ДБО,
идентификатор пользователя состоит из цифр.
Примеры идентификаторов: 1000001, 1000002, …
В чем проблема? Об этом чуточку позже
4. Future Now
Парольная политика
Слабая парольная политика – извечная проблема!
Пароль по умолчанию сложный, но при этом
пользователь может установить простой пароль
И даже, состоящий из 1 цифры!
Проверяется только длина пароля
В таком случае, обязательно можно будет встретить пароли:
1234567 и 12345678
Проверка по регулярному выражению
Проблема – словарные пароли, например P@ssw0rd
5. Future Now
Brute Force?
Brute Force в интернет-банке? А как же защита?
Защита от атак, направленных на подбор:
Блокирование учетной записи
Блокирование IP-адреса
Использование технологии CAPTCHA
6. Future Now
Блокирование – не решение!
Обойти такую защиту совсем не сложно
Учетная запись или IP-адрес блокируются после
нескольких (обычно 3 или 5) неудачных попыток
аутентификации.
Предсказуемые идентификаторы
Слабая парольная политика
???????
Profit!!!!111
7. Future Now
Блокирование – не решение!
1000001
Собираются 1000002
идентификаторы 1000003
…
Выбирается 1 или 2
пароля
1001421:12345678 Подбирается не
1002236:12345678 пароль к
1002313:12345678 идентификатору, а
идентификаторы к
… паролю
8. Future Now
Блокирование – причина отказа в обслуживании!
После нескольких неудачных попыток аутентификации
учетная запись блокируется.
Можно осуществлять атаки на целевого пользователя
А если известны все идентификаторы…
Можно реализовать масштабную DOS-атаку
И как правило, чтобы учетная запись была
разблокирована нужно позвонить в офис банка.
У кого-то день может получиться не легким
9. Future Now
Блокирование IP-адреса
Блокирование IP-адреса не менее опрометчивое
решение.
Во многих фирмах все сотрудники сидят за одним внешний
IP-адресом
Множественные попытки аутентификации могут выглядеть
как попытка подбора пароля, и как итог – блокирование
внешнего IP-адреса
10. Future Now
Проблемы реализации CAPTCHA
Возможна повторная отправка одного и того же
значения
Значение передается в скрытом поле HTML-формы
Можно передавать пусто значение
Некорректная проверка – достаточно чтобы совпала
длина или присутствовали некоторые символы
CAPTCHA не проверяется при передача
определенного заголовка
11. Future Now
Проблемы реализации CAPTCHA у PHDays I-BANK
Значение передается в скрытом поле HTML-формы
public function encodeCaptchaCode($code) {
return @base64_encode(@strrev(@base64_encode($code)));
}
Для шифрования не используются временные значения –
расшифровать строку проще простого.
PUlUTndVVE0= =ITNwUTM MTUwNTI= 15052
12. Future Now
Проблемы реализации CAPTCHA у PHDays I-BANK
Кроме того, можно повторно отправлять одно и тоже
значение
А значит, возможно проведение
атаки, направленной на подбор
пароля к учетной записи!
14. Future Now
Восстановление пароля, проблемы
Если для восстановления пароля нужно ввести
идентификатор, а не email-адрес, то можно узнать
существующие с системе идентификаторы
15. Future Now
Восстановление пароля, проблемы
Для некоторых пользователей I-Bank предусмотрена
возможность восстановления пароля через веб-
форму
Остальные пользователи по замыслу могут
восстановить пароль только обратившись в
отделение банка
«Please contact any office of the PHDays bank for
password recovery.»
16. Future Now
Восстановление пароля, проблемы
Ключ, который необходимо ввести для
восстановления пароля, генерируется с
недостаточной энтропией
private function addDataInTable($login) {
$key = md5($login.rand(1, 250));
Чтобы подобрать ключ, необходимо перебрать не более
250 значений!
После чего будет установлен новый пароль.
17. Future Now
Слабая энтропия идентификатора сессии
В случаях, когда используются собственные механизмы
сессии, надежность идентификатора играет важную
роль
В PHDays I-Bank идентификаторы ключевых
клиентов генерируются по специальному алгоритму
private function getSpecialHash($password) {
$hash = sprintf("%u", crc32($password));
if(strlen($hash) > 4) {
$hash = substr($hash, 0, 4);
18. Future Now
Слабая энтропия идентификатора сессии
Как видно, идентификатор сессии состоит всего из 4
символов
Все символы – цифровые, что значительно
уменьшает энтропию
Кроме того, идентификатор сессии статичный, и
изменяется только если пользователь меняет пароль
20. Future Now
Проблемы с разграничением привилегий
Если возможность переводить деньги с чужих счетов -
совсем редкое явление, то возможность обращаться к
другим пользовательским данным еще можно встретить.
Встречалась возможность отправки сообщений в тех.
поддержку от лица любого пользователя ДБО
Возможность редактирования шаблонов платежей
других пользователей ДБО
Такие уязвимости в PHDays I-Bank включены не были.
21. Future Now
One-time password
Одноразовые пароли используются для защиты от
несанкционированных пользователем действий
(выполнение транзакций, изменение пароля,
редактирование личных данных).
OTP может запрашиваться или после первичной
аутентификации (логин и пароль)
Или перед выполнением каждой транзакции (или
другом действии)
22. Future Now
One-time password в PHDays I-Bank
В PHDays I-Bank было реализовано 2 типа OTP:
Эмуляция использования внешнего устройства
В коде это было реализовано в классе TransactionA
OTP на скретч-картах:
В коде это было реализовано в классе TransactionB
23. Future Now
One-time password, проблемы
OTP не запрашивается при переводе небольших
сумм (например, до 100$)
Возможна повторная отправка одного и того же OTP
Возможность предугадать OTP
Некоторые пользователи отключают OTP
В PHDays I-Bank за выполнение транзакций без OTP отвечал класс TransactionC.
Можно обойти шаг проверки OTP и сразу выполнить
транзакцию
24. Future Now
One-time password, TransactionA
Предугадать OTP невозможно
Но при этом можно обойти шаг проверки и
выполнить транзакцию напрямую!
29. Future Now
One-time password, TransactionC
OTP не запрашивается – можно выполнять
транзакции без каких-либо препятствий и
ограничений
В PHDays I-Bank пользователей для который OTP не
запрашивался было не много
Но кому-то из участников конкурса повезло
30. Future Now
Действия без OTP
Бывает так, что OTP запрашивается только при
проведении транзакций, но другие действия можно
сделать без ввода OTP:
Отправить сообщение в тех. поддержку
Изменить пароль
Изменить шаблон платежа
Создать шаблон платежа
Открыть новый счет
31. Future Now
Изменение шаблона платежа
Использование шаблонов платежей позволяет сократить
время на ввод однотипных данных:
Номер счета получателя
ФИО получателя
Если у злоумышленника есть возможность изменять
данные шаблона, то он без труда сможет заменить счет
получателя, указав свой.
Пользователь скорее всего не заметит и подтвердит
выполнение транзакции.
32. Future Now
Как все было
Призовой фонд 20.000 рублей
За сутки участникам конкурса был дан исходный код
систем, а так же виртуальная машина с
установленным PHDays I-Bank
За 20-30 минут участники должны были
воспользоваться найденными уязвимостями
Ключ к победе – автоматизация!
Многопоточность играла решающую роль!
33. Future Now
2 задачи на пути к успеху
По сути прохождение конкурса можно было разделить
на 2 задачи:
Получить доступ к учетной записи
Простые и словарные пароли
Слабая энтропия ключа, используемого для восстановления пароля
Слабая энтропия идентификатора сессии
Обойти OTP
OTP не запрашивался
Можно пропустить шаг проверки OTP
Предугадываемый OTP
34. Future Now
Распределение уязвимостей
Распределение уязвимостей
30
Простой пароль
18
Словарный пароль
100
Идентификатор
сессии
Ключ восстановления
52
35. Future Now
Распределение уязвимостей
Деньги были распределены по принципу – чем
сложнее получить доступ, тем больше денег
Учетные записи, с которых осуществлялась
демонстрация имели слабые пароли – 1234567 и
password
Учетные записи участников тоже были уязвимыми –
идентификатор сессии обладал слабой энтропией
Оптимальная стратегия – ближе к завершению конкурса
перевести деньги со счетов других участников.
36. Future Now
Распределение уязвимостей
Деньги были распределены по принципу – чем
сложнее получить доступ, тем больше денег
Учетные записи, с которых осуществлялась
демонстрация имели слабые пароли – 1234567 и
password
Учетные записи участников тоже были уязвимыми –
идентификатор сессии обладал слабой энтропией
Оптимальная стратегия – ближе к завершению конкурса
перевести деньги со счетов других участников.
37. Future Now
HelpDesk
Помимо системы ДБО был реализован примитивный
HelpDesk:
HelpDesk – система для сотрудников банка
Основная мысль – попав в систему «не для всех»,
можно получить достаточное количество
информации, которая значительно упростит взлом
целевой системы
На практике: парольная политика, информация о
механизмах защиты и даже пароли пользователя
38. Future Now
HelpDesk в PHDays I-Bank
Обсуждения, которые намекали на что нужно
обратить внимание
Ссылка на систему, которая отображала
пользователей с простыми паролями
39. Future Now
HelpDesk, обход аутентификации
Уязвимость системы HelpDesk – обход аутентификации:
Знать логин или пароль не нужно
Достаточно передавать в каждом HTTP-запросе
заголовок
if(isset($_SERVER["HTTP_BANKOFFICEUSER"])) {
$userId = base64_decode($_SERVER["HTTP_BANKOFFICEUSER"]);
$userInfo = $this->user->getUserInfoById($userId);
$this->user->setupUserInfo($userInfo);
return $this->user;
}
41. Future Now
Race condition
Если отправлять много запросов, то возможна ситуация,
когда запросы будут выполняться одновременно:
Запрос N Запрос N + 1
Проверка Проверка
наличия наличия
необходимой необходимой
суммы суммы
Зачисление Зачисление
денег денег
Profit! $$$
42. Future Now
Race condition, nginx
Чтобы защититься от Race condition и исключить
ситуацию появления денег из неоткуда, nginx был
настроен на блокирование слишком частых обращений.
А именно – не более 3-х запросов в секунду к сценарию,
осуществляющему транзакции.
На виртуальных машинах nginx установлен не был, и
один из участников нашел проблему Race condition.