ТОП-10 уязвимостей безопасности от компании «Точка качества». Часть 2

16 декабря 2016
Дата публикации
ТОП-10 уязвимостей безопасности от компании «Точка качества». Часть 2
  • Тестирование ПО
  • Обеспечение качества
Мы  рассказали о пяти простых видах критических уязвимостей, которые были обнаружены нашей командой при тестировании реальных IT-продуктов. Сегодня предлагаем поговорить о следующих пяти, более опасных и сложных в обнаружении.

Загрузка исполняемых файлов

Тестируемое приложение позволяло загружать файлы, которые были доступны по прямому пути. При этом содержимое файла проверялось, а его расширение – нет. Файлы с php-кодом оно также не пропускало.

Проводя аудит приложения, мы немного изменили php-файл, добавив в его начало HTML- разметку, при этом оставив расширение .php. В итоге мы получили полный доступ к серверу с возможностью выполнения консольных команд.

Причина: недостаточная проверка загружаемых файлов.

Возможное последствие: получение полного контроля над веб-приложением.

SQL-инъекция

Немного об SQL-инъекциях. SQL-инъекция – это внедрение SQL-кода в запросы к приложению. В зависимости от SQL-запроса инъекции бывают следующих типов:
  •          С выводом результата на страницу;
  •          Слепые (для извлечения данных мы используем посимвольный перебор, а решение о том, что символ верный, принимается на основании изменения логики работы приложения или появления временной задержки).
Возможные последствия инъекции:
  •          Кража данных;
  •          Обход аутентификации;
  •          Полный захват сервера.
Для обнаружения таких уязвимостей мы иногда используем программу SQLMAP, но чаще ищем вручную, без использования автоматизированных средств. В нашем случае мы обнаружили SQL-инъекцию на главной странице сайта в элементе поиска.

Причина: отсутствие проверки входных данных.

Последствия: получение полного доступа к базе данных приложения.

Чтение локальных файлов

Мы тестировали многопользовательское приложение, в котором хранились персональные данные пользователей. Приложение было написано с уязвимостями, что позволило нам передавать ему в запросе имя локального файла на сервере и получать его содержимое в ответе.

Нам удалось получить файл конфигурации, который дал нам возможность попасть в абсолютно любой аккаунт в приложении. Поскольку в приложении был реализована функция отправки электронных сообщений, то через механизм сброса пароля мы могли получать ссылки, которые приложение высылало пользователям для смены пароля. Мы переходили по ссылке, меняли пароль и дальше авторизировались в приложении.

Причина: отсутствие проверки входных данных.

Последствия: чтение конфигурационных файлов веб-приложения.

NOSQL-инъекция

Вы уже знаете, что есть SQL-инъекция. А бывают ли NoSQL-инъекции? Конечно!

Redis, MongoDB, memcached относятся к классу нереляционных СУБД, и хакеры, естественно, не могли пройти мимо.

NoSQL ≠ No Injection
Главное отличие в том, что базы данных NoSQL не поддерживают язык запросов SQL. Каждая база данных может использовать свой язык. При этом число потенциальных уязвимостей также растет.

При тестировании приложения мы столкнулись с СУБД MongoDB.

Что же мы нашли?

В приложении было API, которому можно было отправлять запросы. Аутентификация происходила с помощью токена длиной 32 символа. Перебрать его не представлялось возможным. Немного подумав, мы решили проделать манипуляции с параметром. Изучив документацию MongoDB, мы обнаружили, что возможно внедрять регулярные выражения в запрос и таким образом сокращать данные для этого запроса. В итоге 32-символьный параметр мы сократили до 4 шестнадцатеричных символов, которые легко подбирались для аутентификации в приложение.

Причина: недостаточная проверка входных данных.

Последствия: обход аутентификации в приложении.

Состояние гонки

Самая интересная, на мой взгляд, уязвимость, которая была обнаружена в финансовом приложении.

Состояние гонки – ошибка проектирования многопоточного приложения. В результате несколько потоков пытаются одновременно получить доступ к данным, и хотя бы один из них выполняет запись. В результате получается, что читающие потоки получают предыдущее значение, которое было изменено пишущим потоком.

Что мы сделали?

Мы попытались отправить несколько одновременных запросов к веб-приложению. Веб-приложение – хороший пример многопоточного приложения, так как с ним работают много пользователей, которые могут одновременно осуществлять вход в приложение. Важным условием является операция записи либо файла, либо в базу. В нашем случае все записи происходили в базу. Мы отправили несколько запросов на перевод денег и обнаружили, что получили в несколько раз больше, чем планировали. А потратили в итоге ту сумму, которую планировали. Приведем пример: пусть за X монет можно получить Y рублей. Мы делаем 10 одновременных запросов на обмен X монет на рубли. В результате с нашего счета списывается X монет, а получаем 10*Y рублей.

Причина: ошибка проектирования приложения.

Последствия: кража денег.

Чтобы предотвратить подобные последствия и защитить свой программный продукт, мы рекомендуем компаниям проводить предварительные проверки и тестировать ПО на наличие уязвимостей.

Обратившись к команде профессионалов, вы всегда будете уверены, что ваш продукт не представляет угрозы для данных пользователей.