Кто же посещает наши сайты?

Все началось с того, что некоторое время назад один из моих сайтов начали засыпать рекламой через форму обратной связи. Обычно это происходит потому, что некий ленивый программист не удосужился поставить хоть какие то элементарные средства защиты. Да, будем справедливы - сайт был сделан мною хоть и качественно, но наспех, да и пару писем в день мне не составляли проблем. Но за последние 2 недели я получаю примерно по 50 писем в день. Мази от простаты, гадание на протэктере колес, чудо крем для бороды. Серьезно? Ну что ж, надо решать проблему.



Первым делом я решил, что ко мне залет мимолетом какой то простейший бот. Решение было очевидно - поставить honeypot. Но, к моему удивлению, это не дало никакого результата. Пришлось поставить каптчу. Но буквально через 2 часа я понял, что и каптча не дала никакого результата. Что ж, мы читали про то, как боты ломали каптчи при помощи яндекса. Надоело, баста. Поставив reCaptcha2 от гугл я был уверен, что с ней все будет хорошо. Благо механизм защиты у них достаточно хороший. Но в итоге и она не дала результата.



Теперь мое внимание было приковано к это проблеме. Игра в "кто кого". Это же так весело. И начать поиск решения проблемы я решил с простого логирования всех запросов. По крайней мере это даст понять - либо это заполняют руками, либо навороченный бот. И спустя сутки я решил взглянуть на логи. Вы когда-нибудь интересовались, кто же посещает ваш сайт? Сейчас и разберемся.



Первым делом я увидел в посещении скрипт с сайта, проверяющий UpTime. Ребята работают честно, каждые полчаса. Приятно. Далее был бот яндекса. Индексация ведь никому не повредит. Далее начинается интересное.



Мое внимание приковал запрос из японии, который в заголовке агента передавал вот это [HTTP_USER_AGENT] => agrofish <?php eval(chr(100).chr(105).chr(101).chr(40).chr(39).chr(49).chr(55).chr(73).chr(53).chr(51).chr(48).chr(86).chr(65).chr(117).chr(52).chr(39).chr(41).chr(59)); ?>, что по факту было die('17I530VAu4'); . Как интересно. Забавно, ведь некоторые люди сохраняют заголовок в базу напрямую, что бы после вести статистику кто их посещал, да и целом больше знать о пользователях. Запросы так же были в виде json, js, php и sql. Отсюда следует следующее правило - никогда не доверяйте заголовкам. Лучше проверяйте из на регулярные выражения.



Далее я увидел вот этого товарища "http://www.majestic12.co.uk/bot.php?" , и зайдя на ресурс понял, что ребята сделали интересный проект - они создают карту интернета. Проект не коммерческий и любой владелец сайта может найти где и каким сайтом пересекается его ресурс. Что то вроде веб архива, но только видно как сайт растет.



Дальше опять японцы. Судя по всему им стало интересно, почему их скрипт не отработал и они решили действовать более агрессивно. Тот же самый eval посыпался в cookie. Что касается сервера, то запрос был повсюду. Особо порадовал HTTP_REFERER содержащий http://www.google.com/{${eval(...)}} и HTTP_X_FORWARDED_FOR с 148.33.76.24[CHR(0)]{${eval(...)}} . А если верить логам, то ломануть меня пытались с телефона SAMSUNG-GT-C5212i/C5212iXEKD1 . Мда, телефончик так себе. Зато в случае, если нарвешься на проблемы - не жалко его в микроволновку засунуть (привет "Мистер Робот"). Мораль №2 - проверяйте вообще все что можно на eval и его аналоги.



Далее шли безобидные посещения ботов из России, Нидерландов, Сингапура, Украины, Китая, Великобритании.


Кстати о последнем - первый же запрос бы на /wp-login.php . О боги, неужели еще остались люди, пользующиеся это CMS? Она же дырявая как моя арта после ИС7. Далее /administrator/ , /admin.php , попытка sql инъекции с целью создания в таблице users нового пользователя. Вывод №3 - не делайте очевидные названия таблиц. Ну и используйте PDO.



И вот оно. Несколько запросов, которые и упали мне на почту. И так. Что мы видим? Несколько запросов. С одного ip. И в разно время. Сервер? Смотрим по карте. И это жилой дом в перми. Наглость чистой воды, хоть бы ради приличия tor'ом воспользовался. Ладно, не важно, глянем почему он обходит нашу reCaptha2. Ну ё-маё. Банально забыл сделать проверку по полю g-recaptcha-response на стороне сервера, т.к. на js все работает.. Его передает рекаптча. Сейчас исправим. Детская ошибка? Возможно, но тогда мы не узнали бы, что не стоит доверять заголовкам, приходящим от клиентов. Всем удачи и помните - делайте проверка на eval.