Как я в 15 лет взломал хостинг
Был тёплый, солнечный обед, все шло своим чередом.
Я писал колесо фортуны в интернет-магазине для сети магазинов мяса, в котором можно выиграть продукт. Сайт писал на Blazor (не WebAssembly), и из-за некоторых его ограничений мне пришлось делать все через костыли (уже переписываю на React и Node).
Мне нужно было прочитать содержимое JS файла и затем выполнить на сайте. Я немного ошибся в пути к файлу и при выполнении возникла ошибка, что нет такой папки. Увидел такой путь в ошибке:
C:\HostingSpaces\user..\ShopWeb\...
user..
— логин моего аккаунта, ShopWeb
— название проекта
Хм. Ну можно даже не пробовать посмотреть содержимое папок других пользователей, на хостинге же все права к папкам проставлены… Оказывается — ничего они не проставлены. Я мог получить доступ к большинству папок на этом сервере. Просто для интереса написал скрипт, который берет содержимое HostingSpaces
и высвечивает название всех файлов внутри папки HostingSpaces
и во всех вложениях.
IEnumerable list = Directory.EnumerateFileSystemEntries(@"C:\HostingSpaces", "*.*", SearchOption.AllDirectories);
IEnumerator listenum = list.GetEnumerator();
while (true)
{
try
{
bool x = listenum.MoveNext();
if(x == false)
{
break;
}
}
catch
{
continue;
}
text += $"\n {listenum.Current} \n";
}
listenum.Reset();
Console.WriteLine(text);
На этом сервере были только ASP.NET Core сайты. Структура папок была одинаковой и скучной. Но у меня возник интерес к файлу appsettings.json
. Этот файл в ASP.NET Core является стандартным местом для хранения строк подключения к базе данных, а также для разных API ключей!
Структура файла appsettings.json
Сгенерировал список с содержимым файлов appsettings.json. Сижу, листаю этот огромный список. Везде было свойство ConnectionString
и там строка подключения к реальным базам данных. И тут очень привлекли внимание два файла, в которых, кроме строки подключения было ещё какое-то свойство ScpLogin,
куча API ключей, а также GitLab token. Я вспомнил, что административная панель моего хостинга базируется на SCP Manager.
Приблизительная структура ну уж очень интересных файлов appsettings.json
Попробовал зайти в панель управления с логинами и паролями из файлов. И. удалось! Я был очень удивлён. Эти два пользователя были с максимальными правами. Я мог посмотреть всех пользователей, заходить в их админки, перевести их на другой тариф, посмотреть заработки компании, смотреть support-сообщения и даже выключать и управлять виртуальными машинами и серверами. Со своего ASP.NET проекта я мог выполнить cmd команды. Я попробовал создать пользователя, но у пользователя, где выполняется сайт не было прав администратора.
Пришла идея настроить RDP, потом посмотрел, что порт открыт. То есть RDP уже был включён. Но, к сожалению, RDP уязвимости я еще не умею использовать))) Но мне хватило и этого.
Вывод
Поскольку это все смог сделать школьник в 9-ом классе, то это очень серьезная уязвимость хостинга, а если кто-то будет делать это с плохими намерениями, то это может принести очень большой ущерб как компании, так и пользователям! Теперь я буду проверять это на каждом хостинге и вам советую.
Пока не знаю как сообщить хостинг-компании, а то ещё забанят.