#наберегахНевы… в 01:15

Появилось в ленте Инстаграм 14-May-2017

#наберегахНевы... в 01:15

#наберегахНевы можно найти робкие признаки весны – цветы #матьихматьимачехи #13мая… #пестикитычинки #опятьвалялся

#рыбацкое… в 19:26

Появилось в ленте Инстаграм 13-May-2017

#рыбацкое... в 19:26

#рыбацкое #арфынетвозьмитебубен: не повёз на футбол, поехал #нахоккей 😀#спальникиПетербурга #Петербург #СанктПетербург #Питер #SaintPetersburg #Petersburg #город812 #петербургналадони #красивыйПетербург #саинтпи #saintP #сегоднявПетербурге #piteronline #kudagospb #love_petersburg #spbgram #городскойспам #гранитПетербурга #мостыПетербурга #культурнаястолица #питерграм #pitergram #красивыйПетербург #ilovespb #петербургсегодня#ведротэгов

#этасуббота… в 08:39

Появилось в ленте Инстаграм 13-May-2017

#этасуббота... в 08:39

#этасуббота должна была стать футбольной. #сынокмолоток и собранный им из пацанов его школы #футбольныйклуб #НевскийМаяк заявились на #футбольныйтурнир, а им накануне поездки отказали в регистрации. 😕 #формальноповодесть. 😐#футбольногофетиша пост #хоккейэтозызнь 😀#adidascopa #prodirectsoccer

#хоккейэтозызнь… в 07:59

Появилось в ленте Инстаграм 12-May-2017

#хоккейэтозызнь... в 07:59

#хоккейэтозызнь : по ходу игры порой казалось, что пацаны отрубались прям на поле. #сондляслабаков #сынокмолоток #с630 #до745

#мирумир!… в 06:02

Появилось в ленте Инстаграм 10-May-2017

#мирумир!... в 06:02

#мирумир! Так хочется так жить. Вдруг в мыслях о войне уж страшно становится совсем не за себя, а за своих детей…#900дней #900берёз #воимяжизни

Я взломал вашу MySQL базу. Доброжелатель

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

На скринах, в обрезанном интерфейсе неизвестной мне программы, были данные из базы одного из моих проектов.

Дениса занервничал. 😁

Темой безопасности и уязвимостей на сайтах, признаться, никогда особо не интересовался. Слышал, что-то конечно про 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’ят.