# DEFENCE ## Описание В данном задании необходимо выполнить поиск уязвимостей в сервисе управления технологическими процессами и сделать их исправление (рис. 1). ![](https://i.imgur.com/jpVqQVn.jpg) Рис. 1 ## Решение * **Перезапись пользователя при регистрации** При регистрации создается объект класса user нового пользователя и сохраняется в БД с помощью `save_to_db()`. Если указать пустой пароль и username существующего пользователя, то сработает условие `if self.password == '' or self._hashed == ''`, что перезапишется в коде существующего пользователя. Самый простой фикс - добавить проверку `password != ''` в /register * **Возможность входа в систему без пароля** Если передается пустой пароль в функционале входа при импорте пользователя из БД `(user.import_from_db())`, то не сработает условие `if password:` в access.py на 40 строке. Возможное решение - добавить проверку на пустой пароль при входе. * **Возможность установки любых прав пользователей с помощью перебора идентификаторов** В endpoint `/set_permissions` отсутствует middleware `@access.is_admin`, поэтому переписывать чужие и свои права может любой user, зная id пользователя. * **Возможность изменения паролей пользователей с помощью перебора идентификаторов** В control.py в строке 125 проверяется значение user_id из `POST` параметров запроса, если оно не совпадает с текущим пользователем, и пользователь не является админом, возвратит ошибку. Но позже, на строке 127 берется значение из request.values, которые являются слиянием `Query String` и `POST` параметров. В данном случае в первую очередь будет браться значение из GET параметра, поэтому для эксплуатации достаточно передать валидный `user_id` в `POST` параметре и чужой id в GET параметре. Фиксится с помощью изменения `request.values` на `request.form`. * **Неправильная проверка прав пользователей** В access.py на строке 80 в функции `check_permissions()` права пользователя сверяются с правами элемента для доступа к методу элемента с помощью операции and `(el & self._connector.get_abi()[self._connector.get_abi_element_original_name(element_path[-1])][method])`. Такая проверка неверна, поскольку для пользователя с правами `Permissions.READ` и метода элемента, требующего права `Permission.READ|Permissions.WRITE`, выполнение операции and возвратит `Permissions.READ`, и функция возвратит True. В качестве фикса необходимо более тщательно сверять права на метод и user. * **NoSQL инъекция** В файле db.py все вызовы `find()` подвержены nosql injection. Для фикса надо переписать вызовы без использования $where и конкатенации строк. * **Возможность проведения SSRF атаки для сброса состояния системы** В элементе эмулятора ServerRoom можно выставить `backup_url` на http://127.0.0.1:8888/reset_state и вызвать сброс состояние системы через SSRF в обход control panel и проверки прав администратора. Фикс, например, запретить посылать бекап на все локальные ip. * **Уязвимость XXS** В `control/src/templates/admin_user.html` есть XSS из-за изменения контента страницы с помощью `innerHTML`. Нужно переписать код без использования `innerHTML` для исправления уязвимости.]