АнализКода: Исследуем самую дешевую капчу в мире

  • четверг, 14 сентября 2017 г. в 21:30:00

Есть сайт одной местной организации, на котором мне надо было найти кое-какую информацию. Сайт сделан на какой-то старой версии Joomla. Хотя, это в принципе свойственно государственным учреждениям или небольшим организациям. Пилить однотипные сайты, вылизывая друг у друга шаблон и меняя только логотип и цветовую палитру.

Создавать сайты на CMS честно говоря, полная халтура и меня очень раздражают все эти "готовые решения" - CMS, типа: Joomla, InstantCMS, WordPress, DLE и т. д. Хотя я сам когда-то делал сайт на DLE (чья бы корова мычала). Да, есть такой грешок. Но и винить людей я не могу. Это их дело на чем они будут создавать сайт.

Скажу честно, свой блог я хотел запилить на WordPress. Но, так как я не умею работать с WP и мне лень было изучать структуру и код этого движка, я решил выбрать Laravel и сделал все с нуля.

Итак! Поговорим о "самой дешевой капче в мире". Зайдя на этот сайт, я наткнулся на форму обратной связи. За все время сколько я сижу в интернете, я не видел настолько чмошной капчи, как на этом сайте. У меня нет сомнений, что-то разработчик, который создал эту капчу, имел на одну хромосому больше обычного человека.

Мне нравится проводить анализ чужого кода. Бывает, что можно найти интересные авторские решения (и стырить их). Раз уж я решил запустить еще одну рубрику на своем блоге "АнализКода", в качестве первой статьи, я расскажу про эту капчу. Начнем с плюсов этой капчи.

Плюсы:

  • [+] Очень простая и легковесная капча
  • [+] Не требует серверного вмешательства
  • [+] Никаких сессий, GD и т.д.

Минусы:

  • [-] Капча генерируется на клиентской части
  • [-] Капча генерируется не как изображение, а простое сочетание HTML элементов (мат. выражение)
  • [-] Легко подменить верный ответ и провести массовый спам.

Начнем с того, что можно провести атаку даже без ввода капчи. Серверу без разницы, прислали вы капчу или нет. Результат - "Благодарим за обращение!".

Первым делом проверим HTML код.

Как вы можете заметить, капча биндится через document.write(). Если приглядеться внимательней, то имеются две переменные a и b. Если мы можем их вставить через document.write(), это значит, что переменные доступны глобально.

Давайте попробуем вывести значения этих переменных в консоли.

То есть, мы можем получить или изменить эти значения. Пошарив исходный код, наткнулся на файл captcha.js в котором лежит код проверки капчи. Там же, есть главная переменная code с верным результатом.

captcha.js


_30
function trim(str) {
_30
var str = str.replace(/^\s+|\s+$/g,"");
_30
return str;
_30
}
_30
function ValidCaptcha(a,b){
_30
var a = trim(a);
_30
if (a == b){
_30
return true;
_30
}
_30
return false;
_30
}
_30
function checkform(theform, b){
_30
var why = "";
_30
var a = theform.input.value;
_30
if(a == ""){
_30
why += "Security code should not be empty.\n";
_30
}
_30
if(a != ""){
_30
if(!ValidCaptcha(a, b)){
_30
why += "Security code did not match.\n";
_30
}
_30
}
_30
if(why != ""){
_30
alert(why);
_30
return false;
_30
}
_30
}
_30
var a = Math.ceil(Math.random() * 9);
_30
var b = Math.ceil(Math.random() * 9);
_30
var code = a + b;

Генерируются 2 случайнах числа a и b. Эти два числа складываются и результат сохраняется в переменной code.

Функция trim() избавляется от лишних пробелов в начале и в конце строки. Наверное для того, чтобы пользователь не напихал лишних пробелов. Как все продуманно! Думаю нативный метод String.trim(), который делает то же самое, автор не использовал из-за принципа. Молодец!

Функция ValidCaptcha() сверяет code с тем результатом, который ввел пользователь. Ну и checkform() проверяет, может ли форма отправиться или нет.

Подменив значение в code, форма успешно отправляется.

Это все круто! Однако, зачем я написал эту статью? Это никакой не разгром и реверс инженеринг. Статью писал исключительно в ознакомительных целях. Рассказать, что такая "защита" не имеет никакого смысла, если логика выполняется только на клиентской стороне.

Обычным JS можно сотворите такие штуки, что и в голову не может прийти (кэп). Ну, к примеру, забить их почту кучей сообщений и возможно, что хостинг их за это заблокирует.

И конечно, самый лучший вариант - reCaptcha от Google.

#анализ#анализ кода#капча#каптча#защита#47 хромосом