ReCaptcha в PhpMyAdmin — активация, обход и фикс
вчера в 15:27
Совсем недавно, копаясь в коде 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 нужно найти строки
Активировать его можно буквально за минуту — заходим на 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 конечно же сообщено.