Совсем недавно, копаясь в коде PhpMyAdmin, обнаружил давно присутствующий в нём (судя по changelog) механизм captcha при авторизации. И не абы что, обходимое через многочисленные сервисы, а Google reCaptcha.
Активировать его можно буквально за минуту — заходим на www.google.com/recaptcha, получаем private- и public-ключи для своего домена и вписываем их в config.inc.php в ячейки «$cfg['CaptchaLoginPrivateKey']» и «$cfg['CaptchaLoginPublicKey']» соответственно. Всё, после этого на странице авторизации появляется дополнительная проверка пользователя.
Почти отличная защита от автоматизированного перебора паролей. «Почти» — потому что разработчики PMA ради удобства пользователей оставили в скрипте не большую брешь. Если в текущей сессии человек проходит проверку reCaptcha, то больше она ему не показывается. То есть для реализации стандартного перебора атакующему необходимо пройти проверку вручную, передать брутеру ID своей сессии и всё, брутер может спокойно работать.
Исправляется этот баг просто. В файле /libraries/plugins/auth/AuthenticationCookie.class.php нужно найти строки

// We already have one correct captcha.
$skip = false;
if ( isset($_SESSION['last_valid_captcha'])
&& $_SESSION['last_valid_captcha']
) {
$skip = true;
}


и закомментировать строку «$skip = true;». Теперь reCaptcha будет выводиться всегда.
И небольшой наглядный пример обхода на Python+Selenium (PasteBin).
Работает он просто. Если открыв страницу PMA в её коде скрипт «видит» reCaptcha, то браузер создаёт на странице чекбокс «Ready to go» и ждёт его отметки человеком. Перед проставлением этой галочки человек должен пройти проверку reCaptcha. Далее перебор идёт обычным ходом.

P.S. Разработчикам PMA конечно же сообщено.

Комментарии (14)


  1. Suvitruf
    05.09.2015 15:34
    +3

    Совсем недавно, копаясь в коде PhpMyAdmin, обнаружил давно присутствующий в нём (судя по changelog) механизм captcha при авторизации.
    Так есть же описание в документации.


    1. AntonKuzmin
      05.09.2015 16:04
      -1

      Описание то есть, но сколько лет использую pma ни разу даже не слышал о том, что такой функционал существует. Поспрашивал у знакомых веб-мастеров — те тоже не знали. Всю жизнь просто распаковывали и пользовались. Максимум конфиг редактировали по комментариям из него же. В итоге решил проверить, а оказалось что баг нашёл :)


      1. gibson_dev
        05.09.2015 23:48
        +2

        Вообще не думаю что это баг, просто такой алгоритм работы. А вообще документация рулит, а то вы словно Америку открыли. Ну и так — добить, «не большую» — пишется слитно.


        1. vedenin1980
          06.09.2015 01:02

          Согласен, это не баг, а фича, точнее компромисс между удобством и паранойей. Во-первых, китайцы достаточно дешево вручную разгадывают капчи, во-вторых, от переборов существуют специальные системы, блокирующие слишком частые запросы на определенные url, и хитросгенерируемые пароли, вида aК5#f%s@f7RL*9.


          1. AntonKuzmin
            06.09.2015 09:11

            О том что какой-то сервис разгадывания работает с reCaptcha я никогда не слышал. Если это так, то всё куда хуже чем я думал) Хорошие пароли всегда являлись отличной защитой от подбора, но не всегда мы сами можем контролировать какой пароль на свою БД ставит рядовой пользователь совместного хостинга например.


            1. vedenin1980
              06.09.2015 15:52

              Вручную можно разгадать любую капчу, другое дело что такие сервисы относительно недешевые около 50 центов за 1 тыс., но при наличии денег и желания это не проблема.


              1. AntonKuzmin
                06.09.2015 18:56
                +1

                На сколько мне известно, передача именно reCaptcha на сторону такого сервиса является пока нерешённой проблемой. Там ведь механизм прост — получил картинку на сайте, перешли в виде файла на сервис распознавания по API и жди ответа сервера с фразой распознанной человеком. А reCaptcha мало того что динамична, так ещё и видоизменяться может (кликнул на галочку, потом может показаться фрейм с выбором изображений).


  1. arvitaly
    06.09.2015 06:30
    +2

    А зачем вообще оставлять открытый доступ к PhpMyAdmin?


    1. AntonKuzmin
      06.09.2015 09:09

      Ситуации разные бывают, порой это необходимая мера. Я сам сторонник жёстко лимитированного доступа к инструментам администрирования, но всё равно имеется пара серверов на которых доступ к таким инструментам необходим в любое время и с любого устройства.


      1. OnYourLips
        06.09.2015 13:14
        +2

        Удобнее и безопаснее использовать обычный MySQL клиент через ssh-туннель?


        1. AntonKuzmin
          06.09.2015 14:56

          Смотря какой клиент. В чём-то может безопаснее, но не со всяким удобнее. Опять же, ситуации разные бывают. Иногда может понадобится с телефона срочно зайти с плохой связью и выполнить пару запросов вбиваемых руками. Тут PMA как раз хорошо выручит.


          1. vedenin1980
            06.09.2015 15:58
            +1

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


            1. akshakirov
              06.09.2015 22:21
              +1

              Не столько можно, сколько — нужно! Учитывая что PhpMyAdmin забывают обновлять, а потом находятся дыры в скриптах.

              Во всяком случае я постоянно вижу в логах перебор разных скриптов в папках /pma/* /phpMyAdmin/* и подобных.


  1. maximw
    06.09.2015 09:44
    +3

    Было бы круче если бы вместо «грязного» хака, вы бы оформили выбор поведения капчи как настройку конфигурации и сделали пулл реквест в проект.