Долго думал, стоит ли рассказывать, но вчера вечером у меня появилось немного свободного времени, и я все-таки решил продолжить свой цикл статей о маленьких проблемах в крупных проектах. Да и, возможно, об этом уже и так все знают, а я зря волнуюсь.
Все мы знаем сервис reCaptcha, который пару лет назад приобрела компания Google. Мы видим его во многих крупных проектах, например, при регистрации в LiveJournal. Надо сказать, что я люблю качать файлы списком прямо со своего сервера, и когда на одном из сайтов, с которого я периодически что-нибудь выкачиваю, появилась такая штука, меня стало это немного раздражать. Когда мне что-то не нравится, я не опускаю руки, а стараюсь придумать способ как этого избежать.
Так я решил побороть reCaptcha и думаю, что у меня это получилось…
Начиная анализ, первым делом, я задаюсь вопросами. Какая самая большая проблема такого крупного проекта? Скорее всего, это хранение очень большого количества ненужной информации, статусов и действий. ReCaptcha должен создать токен, проверить его и деактивировать.
Если первые два действия можно заменить шифрованием (без хранения), то с деактивацией немного сложней. А еще сервису надо выполнять свою «основную» функцию сканирования документов. Где все это хранить? Очень хочется сэкономить на этом. И, обычно, в этом и кроется самая большая ошибка разработчиков.
Как работает reCaptcha:
Именно в этих двух последних пунктах и оказалось слабое место. Известно, что сервис ограничивает действие токена примерно пятью часами. Но, как я выяснил, reCaptcha не хранит все это время ваш активированный токен, а, похоже, ведет лист блокировки и удаляет токен из него примерно через десять минут неактивности. То есть, если вы десять минут не пытались активировать этот токен еще раз, то он удаляется из листа блокировки. Таким образом, за пять часов одним единственным токеном можно воспользоваться до тридцати раз, тут главное проявить терпение и не дергать его раньше десятиминутного интервала.
Как это использовать? Очень просто! Создав 10 токенов, можно активировать действие на сайте каждую минуту на протяжении пяти часов автоматически. 300 активаций всего за 10 токенов. По-моему очень хорошее предложение. Больше токенов — чаще активации.
К сожалению, на сайте reCaptcha (Google Code) я не нашел ни единого слова об этой проблеме. Однако есть очень простой способ от нее защититься, достаточно хранить активированные токены (recaptcha_challenge_field) на стороне сайта пять часов. Ведь вероятность выдачи точно такого же токена за это время практически равна нулю.
P.S. Обычно мои посты сопровождаются небольшим примером использования уязвимости, но в этот раз я решил, что будет достаточно просто рассказать. Пытливый ум %username% сможет сам проверить работоспособность этого метода.
Все мы знаем сервис reCaptcha, который пару лет назад приобрела компания Google. Мы видим его во многих крупных проектах, например, при регистрации в LiveJournal. Надо сказать, что я люблю качать файлы списком прямо со своего сервера, и когда на одном из сайтов, с которого я периодически что-нибудь выкачиваю, появилась такая штука, меня стало это немного раздражать. Когда мне что-то не нравится, я не опускаю руки, а стараюсь придумать способ как этого избежать.
Так я решил побороть reCaptcha и думаю, что у меня это получилось…
Начиная анализ, первым делом, я задаюсь вопросами. Какая самая большая проблема такого крупного проекта? Скорее всего, это хранение очень большого количества ненужной информации, статусов и действий. ReCaptcha должен создать токен, проверить его и деактивировать.
Если первые два действия можно заменить шифрованием (без хранения), то с деактивацией немного сложней. А еще сервису надо выполнять свою «основную» функцию сканирования документов. Где все это хранить? Очень хочется сэкономить на этом. И, обычно, в этом и кроется самая большая ошибка разработчиков.
Как работает reCaptcha:
- Сервис запрашивает у вас два слова, если ему нравится, то, что вы ответили, вам выдается токен.
- В токене зашит временной ограничитель
- После запроса на проверку с сайта, токен деактивируется и второй раз им воспользоваться нельзя.
Именно в этих двух последних пунктах и оказалось слабое место. Известно, что сервис ограничивает действие токена примерно пятью часами. Но, как я выяснил, reCaptcha не хранит все это время ваш активированный токен, а, похоже, ведет лист блокировки и удаляет токен из него примерно через десять минут неактивности. То есть, если вы десять минут не пытались активировать этот токен еще раз, то он удаляется из листа блокировки. Таким образом, за пять часов одним единственным токеном можно воспользоваться до тридцати раз, тут главное проявить терпение и не дергать его раньше десятиминутного интервала.
Как это использовать? Очень просто! Создав 10 токенов, можно активировать действие на сайте каждую минуту на протяжении пяти часов автоматически. 300 активаций всего за 10 токенов. По-моему очень хорошее предложение. Больше токенов — чаще активации.
К сожалению, на сайте reCaptcha (Google Code) я не нашел ни единого слова об этой проблеме. Однако есть очень простой способ от нее защититься, достаточно хранить активированные токены (recaptcha_challenge_field) на стороне сайта пять часов. Ведь вероятность выдачи точно такого же токена за это время практически равна нулю.
P.S. Обычно мои посты сопровождаются небольшим примером использования уязвимости, но в этот раз я решил, что будет достаточно просто рассказать. Пытливый ум %username% сможет сам проверить работоспособность этого метода.