Как стать автором
Обновить

Комментарии 46

«декомпилировать его ну удается возможным.»
Вероятно имелось в виде «декомпилировать его не представляется возможным»
спасибо, подправил)

Забавно, давно у Рихтера кажись было написано пару строк по поводу секурности дот нет не на серверах. Так вот секурности предполагалась за счёт недопущения получения сборок. То есть если ты влез на сервер но уже ничего не поможет. В связи с этим вопрос, строгие имена не гарантируют безопасность в случае со статьей. Мне на ум приходит только компиляция приложения в нативный код на клиентской машине и уже в таком виде проверять целостность и ТД. Какие ещё есть способы защиты?

В связи с этим вопрос, строгие имена не гарантируют безопасность в случае со статьей.

Если это вопрос — то нет, не гарантируют, если ваша цель именно сломать приложение. Просто цепочка слегка удлиняется — потребуется перелопатить все сборки через dnSpy.

Способы защиты, если уж мы считаем нормой лезть за активацией в сеть — просто чуть разумнее, чем в этом примере. Например идёте с ключём в сервис активации, он вам возвращает пароль к локальной базе. Непонятно зачем это делать напрямую конектом к базе, причем с такими роскошными правами. Если уж не хотелось заводить какой-то отдельный сервис — можно было права учётке ограничить на какую-нибудь хранимку которая вернула бы нужны данные.
значит плохо искал)
Спасибо, достаточно интересная статья.

Мне кажется тут плохая защита удаленной БД.
Во-первых не было смысла давать прямой доступ к БД, проще было разместить простое веб-приложение.
Во-вторых можно было ограничить права пользователя, только на одну конкретную операцию, а именно на проверку наличия ключа. К этому так же ограничит кол-во запросов в секунду.
Хотя о чем тут можно говорить, если весь тест расположен в локальной базе.
А ведь могло не оказаться прав на таблицу аудита…
учитывая то, что приложение лезет в БД, и само же приложение там делает изменения (добавление логов активации в бд к примеру), то об ограниченных правах тут даже речи не может быть. там была таблица users, в которой были логины и хеши паролей. видимо есть админка управления. все храниться в этой бд и видимо пользователь один с максимальными правами)
НЛО прилетело и опубликовало эту надпись здесь
Ну, тут даже взломом сложно назвать… Разрабы сами положили на клиент логин и пароль от базы данных. Такие косяки даже джунам в 2018-м не позволительны.
Эх… Наберут по объявлению…

Именно. Можно было просто найти в коде вызовы к базе и выдернуть оттуда данные для подключения.


Обфускация обсускацией, а язык-то не меняется.

Обфускация обсускацией, а язык-то не меняется

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

Даже если подключаться к удалённой базе по логину/паролю, выдаваемому конкретному пользователю с адово-параноидально настроенными правами доступа… То всё равно будут дыры типа чтения чужих данных и тому подобное.


Так что ответ — никак. Делать поверх базы api и отдавать только его.
Использовать прямой коннект к базе из клиентского приложения можно разве что в доверенной среде. Например, в рамках локальной сети организации, когда авторизация в базе делается по AD-учётке текущего пользователя.

Обязательно должен быть API между клиентом и базой.

Вообще, по хорошему, база должна быть доступна только под 127.0.0.1 (по дефолту так и есть), либо внутри сети приложения (если мы говорим про масштабирование), т.к. в СУБД тоже могут быть 0-day уязвимости.
Под API, вы имеете в виду ORM?
Под API я имею в виду API-сервер. Клиент должен отправлять запросы на сервер с авторизацией. Как реализовать сервер — дело каждого. Самое простое — HTTP с oAuth2.

А уже на сервере запросы к БД можно делать как угодно: ORM, голый SQL, да хоть через handlersocket…
Веб-приложения также нужно реализовать?
А какая разница, кто у вас клиент — веб-страница, десктопное/мобильное приложение или чайник Xiaomi?
Но у веб-приложений, реализованных на паттерне mvc, контроллер служит в качестве серверной части приложения, зачем ему что-то еще?
Ну, во-первых, контроллер служит не «для серверной части приложения», а для направления данных от пользователя к системе и наоборот. Бизнес-логика, например, описывается в компонентах, а не в контроллерах.

Во-вторых, в современных веб-приложениях повсеместно отделяют фронтенд и бэкенд. И общаются они между собой по API-интерфейсу.
Но они же в mvc итак отделены
Какая нафиг разница?) Вы не должны давать в клиентском коде прямой доступ к базе данных. Точка.
Как вы будете это реализовывать, дело ваше.
Да просто засунуть строку подключения в webconfig/appconfig, оттуда их достать нельзя(как я знаю), другого выхода нет
По умолчанию app.config превращается в appname.exe.config и легко редактируется блокнотом чем угодно

Шифрование строк подключения производится ключом пользователя ОС. Если перенести этот файл на другой компьютер, расшифровать его приложение уже не сможет. Это защита только от удалённого доступа к файлам на серверах, локальный админ может расшифровать конфиги так же, как и зашифровал.

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

Если ну никак нельзя сделать АПИ, то можно просто плотить view по мастер таблице с аккаунтами и давать каждому клиенту доступ к view. Но далее — надо правильно настроить сервер, чтобы клиент не запускал n-n-n-n… запросы, отъедая по 100% от ядер.

А что бы ты делал, если данные в БД были зашифрованы, а ключ к расшифровке находится, где-нибудь на сервере(да, странно, но все все-таки)

наверное уже сдался бы)
Материал весьма интересный, с удовольствием прочитал, порадовало как ларчик просто открывается. Но… Слишком много размазни на скринах. Неаккуратной, неопрятной размазни. Сплешскрин — зачем? Чтобы посмотреть на слова «Version» и «Copyright»? Замазать размер шрифта Arial — спешите видеть, раскрытие личности по размеру файла!
Для Хабра можно было и постараться.
Неаккуратной, неопрятной размазни

следующий раз учту. даже не обраил на это внимания

раскрытие личности по размеру файла!

в условиях страны, которой я живу за такие деяния можно схлопотать не мало лет. поэтому замазал даже размеры файла
А без декомпилятора слабо? Ну там как в старые времена: Запустить Иду, найти функцию проверки активации, пропатчить nop-ами и т.д.?

Да помню эти старые добрые времена

к сожалению не разбираюсь в этой программе. хотелось бы научиться да вот руки все не доходят
Сейчас бы .NET в иде патчить.
Как ни странно, я это делал, когда нужно было исправить ровно 1 байт, а не пересобирать всю DLL.

Декомпилировал сборку в dotPeek, разобрал логику, нашёл нужный переход. Нашёл соответствующее место в IL-коде. Однако, по какому смещению находится в файле нужный байтик, ни один инструмент, кроме IDA, мне не подсказал.
Не вижу смысла усложнять себе жизнь. Вот когда часть программы, к примеру шифрование, в нативной библиотеке лежит, тогда и IdaPro пригодится.
Когда-то тоже пытался взломать программку на c#. Сначала пытался посмотреть алгоритм создания файла для trial лицензии чтобы самому создать файл и получить бесконечный период. Но там был какой-то хитрый алгоритм с ключами шифрования. Потом хотел просто поменять код чтобы лицензия была валидна при любых аргументах. Но программа тянула не локальные dll, а с GAC. В итоге сдался.
интересно что делает разработчик когда нужно сменить пароль к бд
судя по тому как сделано приложение, он его вряд ли поменяет
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории