Сегодня мне в голову пришла замечательная и в тоже время простая идея, как можно сделать систему которая сможет самообучатся и распознавать капчи со стопроцентным результатом. Но для начала картинка в тему:
Так что имейте ввиду, я не врал когда говорил что любую капчу можно обойти :D
Итак, вернемся к делу. Предлагаемый мной метод к сожалению подходит не для любой реализации капчи, так как не все их реализации уязвимы к моей атаке, но на уязвимых капчах мой метод гарантирует практически 100%-ое распознавание, плюс дает возможность самообучать систему распознавания.
Какие реализации уязвимы?
Расмотрим абстрактный код генерации среднестатистической капчи:
if(empty($_SESSION['captcha_key'])){
$captcha_key=GenerateNewKey();
$_SESSION['captcha_key']=$captcha_key;
}else{
$captcha_key=$_SESSION['captcha_key'];
}
$captcha=new CaptchaObject();
$captcha->SetKey($captcha_key);
$captcha->Output();
Если объяснить словами, то текст который впоследствии пишется на картинке, заносится в сессию. При повторном запросе скрипта будет использован тот же самый текст из сессии, хотя при этом картинка генерируется немного по другому.
То есть если подытожить, то уязвимы реализации, которые позволяют получить несколько вариантов капчи с одним и тем же текстом на ней.
Как провести атаку?
Как вы догадались для этого нам необходимо скачать несколько вариантов одной капчи. Обычно для этого достаточно обратится к скрипту генерации капчей с одним и тем же индетификатором сессии (зависит от ее реализации).
Затем каждую из полученных картинок нам необходимо распознать (подробнее см Оперируем капчу на примере или Анализ алгоритмов генерации CAPTCHA). Так как все таки символы разных размеров, имеют наклоны, плюс не всегда получается успешно их разрезать, то естественно среди распознанных картинок будут ошибки. Поэтому мы получим приблизительно такие значения:
5118
8148
8419
5118
6148
5115
8145
8716
8118
8418
Как видно практически ни одного правильного ответа. Подсчитываем количество каждой цифры и строим вот такую вот таблицу:
А вот таблица наглядно демонстрирует то что правильные цифры будут доминировать среди остальных, и из этих цифр составляем итоговый ответ — 8118
А как же обучать систему?
Выше мы вроде разобрались как научится распознавать капчу с большой точностью, но точность можно повысить с помощью обучения системы новым маскам символов. Для этого берем маски тех символов которые неверно распознались и добавляем их в общий пул масок. Ну к примеру возьмем нераспознанные маски первых символов (эти маски были распознанны как цифры пять и шесть вместо восьми):
Заметно что некоторые маски похожи между собой, это прийдется анализировать и похожие удалить, так как чем больше масок в пуле тем дольше будет идти распознание. В итоге останется всего две новых маски:
Такую же операцию проводим и для остальных символов и также добавляем их в пул. И рано или поздно мы будем иметь маски всех вариантов каждой цифры, что повысит общий верный процент распознания.
В идеале, конечно, система должна иметь обратную связь, то есть добавлять маски в пул только после того как мы убедились что капча была распознанна верно, т.е. после отправки формы на целевой сервер. Так как если вдруг в пул масок попадет маска не того символа, то вся система может дать сбой.
Итог
Этот алгоритм помимо своих плюсов , имеет существенные минусы:
- Загрузка канала (необходимо скачивать несколько капчей вместо одной)
- Загрузка процессора (необходимо распознавать несколько капчей вместо одной)
Хотя эти недостатки на мой взгляд легко компенсируются плюсами:
- Почти стопроцентная точность распознавания
- Возможность самообучения системы
Вообщем использовать ли этот алгоритм или нет — решать вам :)
Я через подобную уязвимость тоже как-то распознавал капчу. Только в моём случае она была проще и можно было использовать tesseract.
Ой, а я пытался реализовать с помощью Delphi, в итоге плюнул и юзал антигейт)
в итоге challenge проиграл, значит:)
:D
Картинка убийца, просто)))
А где скачать хорошую прогу для распознавания капчи? Без нее сложно зарегистрироваться на визу…
Если бы все было так просто… Но боюсь что нигде (
но готовой реализации я тут не нашел =( она лишь теория
Не очень то благодарно с вашей стороны. Теория стоит больше, нет?
Интересный подход, спасибо. Но один момент остался неясным: как произвести распознавание символов. В статье по ссылке почитал, но там расстояние между ними есть — так да. А очень часто символ «наезжает» один на другой, или пересекаются, ну и ширина не всех одинаковая: ‘i’ и ‘w’. Когда символы пересекаются — это ставит меня в тупик. Можете посоветовать какой-нибудь приём, как в этом случае разбить строку на символы, чтобы потом их передать на распознавальщик? Или тупо 1000 раз перегенерировать изображение, пока все не расположатся раздельно?
Каких либо конкретных советов я дать не могу. Проблема в том что к каждой капче нужно подходить индивидуально, искать ее слабые стороны. Универсальных скриптов нету.
В вашем случае, как вариант, если известно количество символов — отбрасывать капчи которые разрезались заведомо неправильно (меньше или больше фрагментов).
Но вообще да, в капчах пожалуй самая сложная часть — это именно фрагментация. Правильно разбитые фрагменты — залог успеха любого алгоритма на 90%.
Я распознаю вот так RuCapthca + Yii2 Captcha
Всё же для этих целей пока лучше подходят сервисы. Написал для таких своё обвязку https://github.com/jumper423/decaptcha/blob/master/docs/README-ru.md