В пять утра разбудила кошка, и дальше не спалось. Сел за компьютер, вновь пытаясь понять, что же вчера приключилось с сайтом одного из моих клиентов.
Этот сайт — памятник очумелым ручкам безымянных самоделкиных. Не люблю ковыряться в такого рода барахле, но уже пару лет дописываю для данного проекта разные грабли и костыли. За это время даже привык (наверное) и, открывая очередной захламленный файл проекта, начинаю с форматирования текста программы и добавления комментариев к коду.
А вчера сайт неожиданно превысил дневные лимиты на использование базы данных. Вы удивлены, что есть ещё такие хостинг-провайдеры? Есть — это Билайн. Я так понимаю, что они не переосмысливали услуги хостинга с тех пор как поглотили Урал-Релком, где я когда то хостился и потому могу сравнивать. А было это…. лет 10 назад :)
Превышение лимитов было сопряжено с отключением сайта, что мой клиент и заметил. Пришло также соответствующее стандартное письмо от провайдера, что мол вы потеряли совесть и превысили отведенные вам лимиты. Займитесь, дескать, оптимизацией запросов к БД.
В логах тяжелых запросов оказались какие то странные кадавры с присоединением таблиц из базы information_schema. Но я на них не обратил внимание. Сегодня же они мне показались странными из-за написания запросов с использованием разного регистра:
1 2 3 4 5 6 7 |
select * from rodprof where idprof=N.N /**/uNiOn/**/aLl /**/sElEcT N, N, (/**/sElEcT /**/cOnCaT(0x217e21, count(t./**/tAbLe_nAmE), 0x217e21) /**/fRoM information_schema./**/sChEmAtA as d join information_schema./**/tAbLeS as t on t./**/tAbLe_sChEmA = d./**/sChEmA_NaMe join information_schema./**/cOlUmNs as c on c./**/tAbLe_sChEmA = d./**/sChEmA_NaMe and c./**/tAbLe_nAmE = t./**/tAbLe_nAmE /**/ wHeRe not c./**/tAbLe_sChEmA in(0x696e666f726d6174696f6e5f736368656d61, 0x6d7973716c) and d./**/sChEmA_NaMe = /**/dAtAbAsE() and c./**/cOlUmN_NaMe like 0x2570617373776f726425), N; |
1 2 3 4 5 6 |
SELECT * FROM prof WHERE idProf = N and (/**/sElEcT N /**/fRoM(/**/sElEcT count(*), /**/ cOnCaT((/**/sElEcT(/**/sElEcT /**/uNhEx(/**/ hEx(/**/cOnCaT(0x217e21, 0x4142433134355a5136324457514146504f4959434644, 0x217e21)))) /**/ fRoM information_schema./**/tAbLeS /**/lImIt N, N), floor(rand(N)*N))x /**/ fRoM information_schema./**/tAbLeS /**/gRoUp/**/bY x)a) and N=N; |
Тут меня осенило, что сайт то оказывается ломают, используя sql-injection.
С одной стороны ломать в базе нечего : таблиц с пользователями и паролями там просто не существует, а с другой стороны — дыры в коде ничего хорошего не сулят. В результате тяжелых запросов, сайт исчерпал дневной лимит и не работал оставшиеся 5 часов. Т.е. сайту все же был нанесен ущерб, веб-сервер перестал работать.
Пришлось выяснять дырявое место в программе и чистить входные параметры. По логам обнаружились еще несколько небезопасных мест, обнаруженных хакером. И я думаю, это не последние дыры на сайте, которые я залатал.
Так что, дорогие заказчики сайтов подумайте хорошо, на чем вам предлагают делать сайт. Отдавайте предпочтение хорошо проверенным бесплатным open-source движкам (Drupal, WordPress), или качественным коммерческим движкам с нормальной тех поддержкой. Коммерсов рекламировать не буду :)