Как с помощью машинного обучения взломать систему капчи на сайте за 15 минут?

машинное обучение Python Нейронные сети WordPress
Как с помощью машинного обучения взломать систему капчи на сайте за 15 минут?

Позвольте мне сначала заявить, что хотя праздник Праздника лодок-драконов приближается, то, о чем мы говорим сегодня, на самом деле не взламывает код подтверждения 12306, вы знаете причину.

мы сегодняВозьмем в качестве примера взлом самого популярного в мире плагина капчи для WordPress..


Все ненавидят капчи, верно? На этих надоедливых маленьких фотографиях много текста, и вы не сможете зайти на сайт, пока не напечатаете их. Первоначальное намерение людей, разрабатывающих систему капчи, состоит в том, чтобы убедиться, что пользователь, посещающий веб-сайт, является реальным человеком. Но с достижениями в области глубокого обучения и компьютерного зрения мы можем легко обойти эти системы капчи. (Если вы не сталкиваетесь с нахальной проверкой распознавания изображений 12306, иногда вы действительно впадаете в отчаяние)

Недавно я прочитал отличную книгу Адриана Роузброка Deep Learning for Computer Vision with Python, в которой Адриан подробно описывает, как он использует машинное обучение для обхода кода подтверждения для веб-сайта E-Zpass в Нью-Йорке:

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

Но что, если мы хотим взломать систему капчи с открытым исходным кодом, где у нас есть доступ к исходному коду?

Я пошел на сайт регистрации плагинов WordPress, чтобы найти «captcha», и первым результатом поиска было «Really Simple CAPTCHA» с более чем 1 миллионом активных установок:

Самое приятное то, что он предоставляет исходный код. Так как у нас есть доступ к исходному коду, генерирующему капчу, ее проще взломать. Мы можем немного увеличить сложность и стать немного более сложными, например, завершить взлом в течение ограниченного времени.

Можем ли мы полностью взломать эту систему капчи за 15 минут? Попробуйте!

Отказ от ответственности: Это не предназначено для критики плагина «Really Simple CAPTCHA» и его авторов. Сам автор плагина сказал, что этот плагин уже не очень безопасен, и рекомендуется использовать другие плагины. Так что это был просто быстрый технический вызов для развлечения. Однако, если вы также являетесь пользователем этого плагина, возможно, вам действительно стоит переключиться на что-то другое.

вызов начинается

Прежде чем "нападать", давайте посмотрим, какую капчу фото может генерировать "Really Simple CAPTCHA". На демо-сайте мы видим это:

Хорошо, тогда код подтверждения представляет собой комбинацию из 4 букв и цифр. Давайте проверим это в исходном коде PHP:

public function __construct() {
		/* Characters available in images */
		$this->chars = 'ABCDEFGHJKLMNPQRSTUVWXYZ23456789';

		/* Length of a word in an image */
		$this->char_length = 4;

		/* Array of fonts. Randomly picked up per character */
		$this->fonts = array(
			dirname( __FILE__ ) . '/gentium/GenBkBasR.ttf',
			dirname( __FILE__ ) . '/gentium/GenBkBasI.ttf',
			dirname( __FILE__ ) . '/gentium/GenBkBasBI.ttf',
			dirname( __FILE__ ) . '/gentium/GenBkBasB.ttf',
		);

Правильно, он генерирует капчу из 4 слов в случайном сочетании 4 разных шрифтов. Мы также можем видеть, что он никогда не использует буквы «О» и «И», потому что пользователям легче спутать эти две буквы. Итак, нам нужно идентифицировать 24 английских буквы и 10 арабских цифр, то есть проверочный код, состоящий из 32 символов. нет проблем!

Пока время: 2 минуты

использовать инструменты

Прежде чем приступить к задаче, давайте поговорим об инструментах, которые мы будем использовать:

Python 3

Python — интересный язык программирования со множеством отличных библиотек для машинного обучения и компьютерного зрения.

OpenCV

OpenCV — очень популярный фреймворк для компьютерного зрения и обработки изображений. Мы будем использовать OpenCV для обработки фотографии капчи. У него есть Python API, поэтому мы можем использовать его прямо из Python.

Keras

Keras — это фреймворк для глубокого обучения, написанный на Python. С Keras легко определить, обучить и использовать глубокие нейронные сети с помощью небольшого количества кода.

TensorFlow

TensorFlow — это библиотека для машинного обучения от Google. Мы будем программировать на Keras, но сам Keras на самом деле не использует логику нейронной сети, вместо этого он выполняет тяжелую работу за кулисами, используя библиотеку TensorFlow от Google.

Хорошо, мы вернулись к вызову!

Создайте наш набор данных

Независимо от того, какая система машинного обучения обучается, нам нужны обучающие данные. Чтобы взломать систему капчи, мы хотели бы иметь такие обучающие данные:

Как показано на рисунке: введите фотографию кода подтверждения для обучения модели, после чего модель сможет вывести правильный ответ.

Поскольку у нас есть исходный код этого плагина WordPress, мы можем изменить его и сохранить 10 000 фотографий с капчей вместе с ожидаемым ответом для каждой фотографии.

Потратив несколько минут на изменение кода и добавление простого цикла for, я получил папку с обучающими данными, содержащую 10 000 фотографий в формате PNG, каждая из которых имеет правильный ответ в виде имени файла фотографии:

Это единственная часть этой статьи, где мой рабочий код примера не приводится, потому что, если подумать, это руководство — просто забавная идея, и я не хочу, чтобы кто-то фактически завалил свой сайт WordPress спамом. Но я приведу 10 000 фотографий, которые я сгенерировал выше, в конце статьи, и каждый может их использовать.

Затраченное время: 5 минут

упростить проблему

Теперь, когда у нас есть необходимые данные для обучения, мы можем напрямую обучить с ними нейронную сеть:

При достаточном количестве обучающих данных этот подход должен работать, но мы можем упростить задачу. Чем проще задача, тем меньше обучающих данных и вычислительной мощности требуется для ее решения.Ведь у нас всего 15 минут! !

К счастью, фотографии капчи, сгенерированные этим плагином, состоят всего из 4 слов, поэтому мы можем каким-то образом разделить фотографии, каждое слово как отдельную маленькую фотографию, так что нам нужно только научить нейронную сеть распознавать каждый раз одно слово:

У меня не было времени просмотреть 10 000 тренировочных фотографий от начала до конца и вручную разделить их на отдельные фотографии с помощью Photoshop. Это займет несколько дней, а у меня осталось всего 10 минут. Мы не можем просто разделить фото на 4 тайла одинакового размера, потому что капча случайным образом расставляет буквы и цифры в разных позициях по горизонтали, чтобы избежать следующих ситуаций:

К счастью, мы все еще можем это автоматизировать. Во время обработки фотографий нам часто приходится обнаруживать «капли» пикселей одного цвета. Граничные линии, окружающие эти последовательные пиксельные капли, называются контурными линиями. OpenCV имеет встроенную функцию findContours(), которую мы можем использовать для обнаружения этих непрерывных областей.

Итак, мы начинаем с необработанного изображения капчи:

Затем мы преобразуем его в чисто черно-белое фото (этот шаг называется пороговой обработкой), чтобы было легче найти непрерывные области на фотографии:

Затем мы используем функцию OpenCV findContours() для обнаружения отдельных частей фотографии, содержащих последовательные капли пикселей одного цвета:

Затем сохранение каждой области в виде отдельного файла фотографии является относительно простой задачей. Поскольку мы знаем, что каждый код подтверждения фотографии должен содержать 4 буквы слева направо, мы можем использовать его для обозначения слов при их сохранении. При сохранении букв в этом порядке мы должны сохранять каждую фотографию буквы с соответствующим именем буквы, например, букву а в качестве фотографии.

название.

Но подождите, я нашел проблему! Иногда в коде подтверждения могут быть перекрывающиеся буквы, например:

Это означает, что мы можем извлечь две буквы как регион:

Если мы не исправим это, качество наших обучающих данных будет ужасным.. Нам нужно решить эту проблему, но было бы более хлопотно дополнительно научить машину распознавать два сжатых вместе субтитра как одну букву.

Вот простой трюк, если ширина области контура намного больше, чем ее высота, это означает, что могут быть две буквы, накладывающиеся друг на друга. В этом случае мы просто разделили их посередине на две отдельные буквы:

Теперь, когда мы можем точно получить отдельные буквы, давайте пройдемся по всем фотографиям капчи. Цель состоит в том, чтобы собрать разные варианты каждой буквы. Для удобства организации мы можем сохранить каждое письмо в отдельной папке.

Например, вот состояние папки с буквой «W» после извлечения всех букв:

Пока время: 10 минут

Построить и обучить нейронную сеть

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

Если вы хотите узнать больше о том, как работают сверточные нейронные сети и почему они идеально подходят для распознавания фотографий, ознакомьтесь с книгой Адриана Deep Learning for Computer Vision with Python.

Эту архитектуру нейронной сети можно определить всего несколькими строками кода с помощью Keras:

# 搭建神经网络!
model = Sequential()

# 第一个卷积层并最大池化
model.add(Conv2D(20, (5, 5), padding="same", input_shape=(20, 20, 1), activation="relu"))
model.add(MaxPooling2D(pool_size=(2, 2), strides=(2, 2)))

# 第二个卷积层并最大池化
model.add(Conv2D(50, (5, 5), padding="same", activation="relu"))
model.add(MaxPooling2D(pool_size=(2, 2), strides=(2, 2)))

# 包含500个节点的隐藏层
model.add(Flatten())
model.add(Dense(500, activation="relu"))

# 包含32个节点的输出层 (每个节点对应我们预测的可能的字母或数字)
model.add(Dense(32, activation="softmax"))

# 用Keras搭建TensorFlow模型
model.compile(loss="categorical_crossentropy", optimizer="adam", metrics=["accuracy"])

Теперь пришло время тренировать его!

# 训练神经网络
model.fit(X_train, Y_train, validation_data=(X_test, Y_test), batch_size=32, epochs=10, ver

После 10 эпох с обучающим набором данных мы достигли почти 100% точности. На данный момент мы можем автоматически передать код подтверждения этого инструмента в любое время! Миссия выполнена!

Пока что время: 15 минут (Бинго!)

Используйте обученную модель для решения задачи заполнения капчи

Теперь, когда у нас есть обученная нейросеть, взломать настоящую капчу с ее помощью очень просто:

  • Получите настоящую фотографию капчи с веб-сайта с помощью этого плагина WordPress в этой статье.

  • Разделите фотографию с капчей на 4 отдельных фотографии с буквами, используя тот же способ, которым мы создали набор обучающих данных.

  • Пусть наша нейронная сеть делает независимые прогнозы для каждой фотографии с буквой.

  • Заполните капчу, используя 4 предсказанных буквы.

  • Ваше здоровье!

Вот как выглядит наша модель при взломе реальной системы капчи:

или в режиме командной строки:

Попробуй сам!

Если вы хотите попробовать это сами, вы можете нажатьздесьПолучите код, который включает в себя 10 000 примеров фотографий, использованных в этой статье, и весь код на каждом шаге. Проверьте файл README.md в папке для получения инструкций по запуску кода.

Но если вы действительно хотите узнать, как работает каждая строка кода, я настоятельно рекомендую вам прочитать книгу Deep Learning for Computer Vision with Python, в которой много подробностей и множество подробных примеров. Это единственная книга, которую я видел до сих пор, которая объясняет как принципы, так и то, как их можно применять для решения реальных проблем, посмотрите их!


Добро пожаловать, чтобы следовать за нами, учебные ресурсы, учебные пособия по искусственному интеллекту, интерпретация документов, интересные проекты, все, что вы хотите увидеть, здесь!