Получил по почте. Человек приложил пару скриншотов с данными и просьбой о вознаграждении взамен рассказа о том, где уязвимость.
На скринах, в обрезанном интерфейсе неизвестной мне программы, были данные из базы одного из моих проектов.
Дениса занервничал. 😁
Темой безопасности и уязвимостей на сайтах, признаться, никогда особо не интересовался. Слышал, что-то конечно про SQL-injection, что-то читал про DDoS , но в голову не брал. А тут нате вам – приплыли.
Пришлось пройти и этот квест.
Причина, кстати, в расπздяйстве (фильтруйте и проверяйте параметры в URL) и закономерному при этом наказании — MySQL-инъекции. 😉
Взламываю свою базу данных MySQL
Поломана MySQL-база. Значит там и проблема. Это раз.
Данные в интерфейсе какой-то программы с обрезанным названием. Значит процесс автоматизирован. Это два.
Загуглил про SQL-инъекции и вот оно – то, что нужно. Статья старая, но расписано как надо и в картинках для чайников. Стало понятно, как злоумышленник запускает нужные SQL-запросы – через оператор UNION, прилепляемый к параметру в URL страницы сайта.
Открыл сырые логи сайта — ~500 обращений к сайту с IP моего доброжелателя с использованием этой конструкции:
Здесь можно бы и остановиться — причина понятна, пофиксить и забыть.
Да, но нет!
Софтину со скриншота найти захотелось даже больше, чем дыру. Интересно стало путь моего доброжелателя пройти.
Безуспешно гуглил по всякому, а когда отчаялся и решил искать комплексные решения анализа уязвимостей сайта, в рекомендациях Netsparker’а увидел знакомый скриншот…
SQLi Dumper – та самая программа для поиска и взлома уязвимых баз данных MySQL.
Как оказалось, с этой программой, процесс взлома «дырявых» баз и просмотр данных из них доступны любому идиоту. Софтина сама находит дураков и показывает их данные в пару кликов.
У меня цель была другая – исследовать свой сайт.
Вставил URL с параметром из логов, нажал GO и GoToDumper, когда она немного потрепавшись с сервером нашла уязвимость. Потом Get Databases, Get Tables, Get Columns, Dump Data. И да, вот они мои данные, полученные через backdoor:
Блокирую взлом базы данных MySQL
Суть взлома, как по книжке: параметр из URL (это ID поля из базы) без проверок и фильтров прямиком идёт в SQL запрос. Злоумышленник через оператор UNION цепляет к нему свой SQL запрос и сервер его послушно выполняет.
То есть вместо валидного обращения к новостной статье #314:
https://apasscracker.com/news/shownews.php?newsid=314
получается запрос:
https://apasscracker.com/news/shownews.php?newsid=314999999.9' union all select 1,2,3,4,5,[t],7,8,9,10,11,12,13 and '0'='0
которым SQLi Dumper и раскручивает базу дальше.
Поскольку, по логике алгоритма, ID – это всегда целочисленное значение, то закрыть эту конкретную дырку элементарно — просто в скрипте явно приводим полученный из URL параметр к целочисленному значению:
$id=intval($id);
Всё!
Теперь, когда в параметре ожидаемое целое число, скрипт отработает, как задумано — покажет новость; когда в параметре непонятная херня вместо цифры, скрипт завершится с ошибкой, а мои волосы останутся шелковистыми и без дополнительной седины. 😉
Вместо эпилога
По хорошему, не будь программист расπздяем проблема бы и не возникла. Фильтровать по ожидаемым значениям и приводить к ожидаемым в алгоритме типам данные, полученные извне — это должно быть нормальной практикой любого кодера.
В общем, проверяйте свои линки с параметрами на потенциальные дыры. Потому что, как прочитал где-то за эти дни: Сейчас ломают всё!
PS: и ещё прочтённый за эти дни ништячок — как узнать, что сервер DDoS’ят.