Оказывается, мир информационной безопасности тоже грязен и очень замешан на
деньгах.
Например, мы обнаружили, можно сказать, небольшую уязвимость в продукте
фирмы Битрикс. Кто не знает — это такая система разработки сайтов на которой
сделан securitylab.ru. Сайт в свою очередь делает Positive Technologies,
которая в свою очередь выдала сертификат «Безопасное Веб Приложение» Битриксу.
Вот такой круговорот денег в природе. Смысл в том, что все друг-друга прикрывают. И когда мы им
сообщили об этой уязвимости — всем было пофигу, сертификат есть и дальше хоть
трава не расти.

Технология CAPTCHA

Блуждая в глобальной сети мы наткнулись на статью, описывающую модуль captcha.
Модуль применяется для защиты форумов, гостевых книг, сайтов c
возможностью отправки SMS и так далее. В основе этого модуля лежит теория тестов
Тьюринга. Но это отдельная тема для разговора. Попыток научиться распознавать
эти картинки было множество, причём многие из них имели успех (например, был
создан модуль в FineReader и т.д.). О методах можно прочитать, например, на
Хакере —
тут. Так вот, вернёмся
к этому модулю, который как раз на практике и реализует это дело и должен
защищать наши сайты от ботов и так далее.

В статье Маркуса Уитни (phpdevelop.info), посвящённой captcha,
сказано:

Если у вас есть публично доступные веб-формы, вы в любой момент можете быть
подвергнуты атакам со стороны людей, желающих использовать ваши приложения для
собственных целей. Форумы, голосования, гостевые книги и блоги — все это
популярные места для роботов, пытающихся сгенерировать неаутентичные сообщения
на вашем сайте. Многие сайты, такие как Yahoo, в данный момент используют
CAPTCHA. CAPTCHA или "completely automated public Turing test to tell computers
and humans apart," ("полностью автоматизированный тест Тьюринга для разделения
компьютеров и людей") является проектом Carnegie Mellon School of Computer
Science, который предоставляет все необходимое для того, чтобы определить,
человек или компьютер инициировал запрос. Технология CAPTCHA позволяет вам
отличать человеческие запросы от запросов, сгенерированных компьютером, в вебе,
где провести такое различие сложно.

Заметьте: В соответствии с Wikipedia, Тест Тьюринга — это тест возможности
машины вести человекоподобные разговоры.

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

Установка Text_CAPTCHA

Благодаря Кристиану Вензу, в PEAR есть пакет, полностью предназначенный для
проведения этих тестов как инструментов безопасности на вашем сайте. Пакет
Text_CAPTCHA использует функциональность PHP GD для создания динамических
изображений со случайными фразами и предоставляет простой
объектно-ориентированный интерфейс. Для того, чтобы использовать Text_CAPTCHA,
вы должны иметь установленную GD с поддержкой JPEG, PNG и шрифтов TrueType. Для
получения дополнительной информации смотрите PHP Image Functions. Text_CAPTCHA
зависит от двух других PEAR пакетов: Image_Text и Text_Password. Он использует
Text_Password для генерации случайной фразы, используемой в тесте CAPTCHA и
Image_Text для генерации изображения с текстом. Процесс установки Text_CAPTCHA в
командной строке следующий:

$ pear install Text_Password
$ pear install Image_Text
$ pear install —alldeps Text_CAPTCHA

Представляем CAPTCHA

Пришло время применить этот пакет в деле. Простой и часто используемый интерфейс
для введения этой новой меры безопасности — это форма комментариев в блоге. В
этой форме вы обычно запрашиваете имя, e-mail и комментарий от персоны,
посылающей сообщение в ваш блог. Форма может выглядеть следующим образом:

<form method="POST" action="">
Имя: <input type="text" name="name"><br>
e-mail: <input type="text" name="email"><br>
Комментарий: <textarea name="comment"><textarea>
<input type="submit">
</form>

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

<input type="text" name="captcha_phrase"><br>

<img src="captcha.jpg">

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

<?php
require_once(‘Text/CAPTCHA.php’);
$captcha = Text_CAPTCHA::factory(‘Image’);
$captcha->init(150,150);
?>

Первая строка требует файл Text_CAPTCHA.php. Вторая строка использует фабрику
класса Text_CAPTCHA для возврата объекта подкласса Text_CAPTCHA. Дизайн
Text_CAPTCHA позволяет создавать CAPTCHA с помощью разных драйверов. Вспомните,
CAPTCHA — это технология для различия людей и компьютеров, а не только для
генерации изображений для этого. Аргумент для метода-фабрики Image дает
инструкцию Text_CAPTCHA создать объект драйвера Image, чтобы сгенерировать
случайное изображение. Третья строка инициализирует объект Text_CAPTCHA и
готовит его к использованию.

Фазу инициализации мы обследуем более подробно. Для начала, она принимает два
параметра: ширину и высоту случайно сгенерированного изображения. Эти параметры
опциональны и имеют значения по умолчанию 200 и 80 соответственно. init() также
принимает два дополнительных, опциональных параметра. Первый — это $phrase,
который позволяет программисту задать секретную фразу для использования в
сгенерированном изображении. Если вы не передаете фразу, init() автоматически
создаст фразу с максимальной длинной в восемь символов. Последний параметр — это
массив $options, который позволяет вам передавать параметры в объект PEAR
Image_Text, которые init() использует для создания изображения с текстом.

Массив $options — это важный параметр для данного применения Text_CAPTCHA,
так как эти опции задают используемый шрифт и его размер, а также путь к шрифтам
в вашей системе. Чтобы настроить эти параметры, создайте и передайте массив в
метод init(), как следует ниже:

$text_image_options = array(
‘font_size’=>’20’,
‘font_path’=>’/path/to/fonts/’,
‘font_file’=>’ARIAL.TTF’
);

$captcha->init(150,150,NULL,$text_image_options);

Как только init() создал изображение и фразу, остальной процесс довольно
прост. Вы должны создать файл изображения, читабельный для браузера. init() не
делает это автоматически. Чтобы получить доступ к изображению, используйте
методы доступа getCAPTCHAAsJPEG() или getCAPTCHAAsPNG(), обе из которых
возвращают случайно сгенерированное изображение в буфере, так что вы просто
можете сделать дамп в свежий файл. Если вы используете PHP4, сделать это можно
следующим образом:

$image_data = $captcha->getCAPTCHAAsJPEG();
$handle = fopen(‘captcha.jpg’, ‘a’);
fwrite($handle, $image_data);
fclose($handle);

В PHP5 это намного более просто, используя функцию file_put_contents:

$image_data = $captcha->getCAPTCHAAsPNG();
file_put_contents(‘captcha.png’,$image_data);

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

session_start();

Теперь, используя метод доступа getPhrase() Text_CAPTCHA, присвойте фразу
переменной сессии для подготовки к тесту сообщения из формы:

$_SESSION[‘captcha_phrase’] = $captcha->getPhrase();

Проверка CAPTCHA

Вот и все со стороны формы. Теперь время определить, является ли пользователь
человеком или нет. При отправке формы, просто проверяйте, задана ли фраза и
совпадает ли она с хранящейся в переменной сессии. Если они совпадают, вы можете
продолжить с соответствующим действием POST. Иначе отвергните отправку формы и
примените те меры, которые вы считаете подходящими. Следующий код демонстрирует
логику проверки теста CAPTCHA:

<?php
session_start();
if (isset($_POST[‘captcha_phrase’]) &&
$_POST[‘captcha_phrase’] == $_SESSION[‘captcha_phrase’])
{
// операции по публикации
}
else {
// проверка безопасности
}
?>

Завершение

CAPTCHA может быть хорошим способом ограничить количество успешных, но
нежелательных HTTP POST-запросов в вашем приложении. Text_CAPTCHA предоставляет
подходящий объект для реализации этой функциональности. В данный момент, пакет
находится в состоянии альфа, и поэтому не является официально годным для
продуктивных сайтов. Так или иначе, он близок к прекрасному началу и привносит
сознание безопасности PEAR, что всегда ценится. Счастливого CAPTCHA-инга!

и в статье Анатолия Ализара:

Полностью автоматизированный обратный тест Тьюринга (Completely Automated
Public Turing Test to Tell Computers and Humans Apart) — компьютерная задача,
которую может решить человек, но не может программа.

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

Полное название таких примитивных, но эффективных тестов — CAPTCHA (Completely
Automated Public Turing Test to Tell Computers and Humans Apart), что означает
«полностью автоматизированный публичный тест Тьюринга для различия компьютеров и
людей». Такие задачи частенько называют обратными тестами Тьюринга, потому что
они используют идею знаменитого математика Алана Тьюринга тестировать
компьютерные программы на «человечность», но предназначены, наоборот, для
тестирования людей (с той же целью).

В тестах CAPTCHA используются известные недостатки искусственного интеллекта,
который пока не научился эффективно анализировать аналоговую информацию.
Например, самый распространенный тест Gimpy представляет собой картинку с
изображениями семи искаженных слов, случайным образом выбранных из словаря.
Буквы накладываются друг на друга, и на сегодняшний день ни одна известная
программа не способна определить хотя бы три слова, изображенных на картинке,
хотя для человека это не представляет никакого труда.

Упрощенная версия Gimpy (с одним трудночитаемым словом или цифрами на сложном
фоне) является частью процесса регистрации во многих почтовых службах, например,
в Yahoo! Mail или на «Яндекс.Почте». Внедрение тестов в регистрационный процесс
позволяет полностью избавиться от автоматических регистраций, которые выполняют
спамерские роботы для проведения анонимных массовых рассылок. Лишь недавно
появились

эффективные программы
, созданные в учеными из Университета Беркли и
Кембриджа. Эти программы могут решить от 83% до 93% простых вариантов теста
Gimpy, но у спамеров пока нет такого софта. Очевидно, скоро он появятся, и «Яндекс.Почте»
придется использовать более сложный тест CAPTCHA.

Еще один тест,
Sounds,
состоит из искаженных, сгенерированных компьютером звуков, которые образуют
слово или последовательность чисел. Человек должен распознать звуки и написать
результат. Программа на это не способна. Всего на
сайте проекта CAPTCHA
выложены пять разработанных учеными тестов (Gimpy, Bongo, Pix, Sounds и Byan),
причем бета-тестирование одного из них (Pix) пока не закончено.

Важной особенностью тестов CAPTCHA является то, что все они автоматически
генерируются компьютерами, то есть оптимизированы для использования в
интернет-приложениях. Для непосвященного человека может показаться странным, что
компьютер способен составить тест, но не способен его решить. На самом деле
здесь нет ничего удивительного. Программа может сгенерировать тест и выложить
его в интернет, собрать у людей результаты и оценить правильность ответов, но
самостоятельно решить задачу она не способна.

Тесты CAPTCHA были изобретены учеными из университета Карнеги-Меллона, а
первое упоминание о них в прессе приходится на 21 октября 2001 г.

нас заинтересовал следующий абзац:

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

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

Проблемы

За примером далеко не пойдём. И возьмём CAPTCHA c securitylab.ru, где он,
например, используется на странице регистрации или на странице обсуждения статей
и новостей.

Постановка задачи: без помощи распознавания изображения узнать цифры на
картинке.

Первое, что пришло на ум — посмотреть свойство картинки.

Угадайте, что нас заинтересовало? Правильно — «?captcha_code=%7E%D32%7F%8F».

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

Теперь нажмём обновить страницу

Изображение изменилось, но цифры остались те же самые. Это значит, что
установлено взаимно однозначное соответствие между множеством картинок и
множеством цифр, которые этим картинкам соответствуют. Продолжаем. Теперь после
«=» поставим ………. ничего не поставим).

-« ?captcha_code=»

Значит ничего отображается в ничего. Отлично.
Далее « ?captcha_code=12345».
Получаем:

Теперь « ?captcha_code=12355».

Делаем второй важный вывод: каждой цифре (знаку) в строке параметра
соответствует знак в картинке. Причём важен порядок. (1я цифра(знак) в строке
параметра – 1-й знак на картинке и так далее). Можете это проверить
самостоятельно.
Идём дальше: « ?captcha_code=1».

Теперь « ?captcha_code=11».

Вывод — алгоритмы получения символов для 1-й и 2-й позиции отличаются.

Далее « ?captcha_code=111».

Предположение: позиция номер 3 характерна тем, что одинакова в обоих
отображениях.
Проверка: « ?captcha_code=11q».

Предположение доказано.
Следующая позиция « ?captcha_code=11q1».

И опять предположение: позиция 4 и позиция 1 шифруют с одинаковым алгоритмом.
Проверка: ?captcha_code=21q2.

Считаем, что предположение доказано.
Продолжим: « ?captcha_code=11111».

Вывод: алгоритм 5-й позиции уникален.

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

Что мы имеем.

А  Б  С  А  В 

5 символов. Где А — 1й алгоритм, Б – 2й алгоритм, С – символ без изменений, В
— 3й алгоритм.

Нам нужно разложить три алгоритма чтобы точно утверждать, что зная код мы можем
узнать цифры на картинке. Начнём с алгоритма А. Методом перебора можно выделить
определённый алгоритм. Меняем первый параметр.

«?captcha_code=1»

«?captcha_code=2»

И так далее. Теперь попробуем сделать обратное. Поставим в качестве параметра,
например, “w”

«?captcha_code=w»

А теперь t.

Ага. Видна обратная связь. Теперь делаем похожие действия, чтобы установить
полную зависимость. Мы приведём окончательную расшифровку для первого параметра.
А вы попробуйте проделать это самостоятельно. Итак. Нам понадобится это:

Вот, что мы получили для первого параметра.

Таблица для 1-ой и 4-ой цифры

цифра ASCII расшифровка ASCII
0 48 v 118
1 49 w 119
2 50 t 116
3 51 u 117
4 52 r 114
5 53 s 115
6 54 p 112
7 55 q 113
8 56 7E 126
9 57 7F 127

В первой графе таблицы находится цифра, отображаемая на картинке, следующая
графа – её ASCII код, потом идёт код, который отображается в свойствах картинки
и его ASCII код. Заметим, что если в качестве кода идёт «%..» это значит, что
речь идёт о 16-ричном формате ASCII кода. Т.е. если, например, передаётся
пробел, то в командной строке будет отображаться %7F. Поясняем: функция captcha
генерирует 5-ти символьный код, символов из ASCII, причём эти символы не
обязательно читабельные.

Теперь перейдем ко второму параметру. Рассмотрим несколько случайных кодов.
captcha_code=%7F%DC5t%85

captcha_code=r%D27q%8A

Если так проделать ещё какое-то число раз, то можно узреть, что ASCII диапазон второго
параметра всегда выпадает из печатного диапазона. Т.е. на втором месте мы всегда
видим только 16-ый вид ASCII кода. Потратив какое-то время расшифровали
и второй знак. Приводим таблицу.

Таблица для 2-ой цифры

цифра ASCII расшифровка ASCII
0 48 D4 212
1 49 D5 213
2 50 D6 214
3 51 D7 215
4 52 D0 208
5 53 D1 209
6 54 D2 210
7 55 D3 211
8 56 DC 220
9 57 DD 221

Третий параметр, как мы писали выше, полностью соответствует знаку на картинке.
А таблица для четвёртого алгоритма соответствует таблице для первого.
Таблица для пятого параметра получается по аналогии.

Таблицадля 5-ой цифры

цифра ASCII расшифровка ASCII
0 48 140
1 49 8D 141
2 50 8E 142
3 51 8F 143
4 52 88 136
5 53 89 137
6 54 8A 138
7 55 8B 139
8 56 84 132
9 57 85 133

Если внимательно присмотреться к ASCII кодам, то можно заметить определённый
алгоритм. Итак, мы доказали, что зная код можно узнать цифры. Показываем
окончательное действие.

Итак, специально не отображаем, картинку.

Смотрим свойства:

1-й и 4-й символ: смотрим в 1-ю таблицу.
7F – 9
7E – 8
2-й символ смотрим по 2-й таблице:
D6 – 2
3-й символ берём без изменений
7 — 7
5-й по третей таблице
8A — 6
Т.е. по нашей теории получается число
92786:

Мы только что доказали, что зная параметры функции CAPTCHA мы знаем цифры,
которые нужно ввести. Т.е. функция CAPTCHA, рассмотренная в данном примере, не
удовлетворяет теории Тьюринга (принцип работы инструмента состоит в генерации
изображения, содержащего фразу, не упоминаемую ни где на странице в формате,
читабельном для компьютера). Т.е. машина может узнать цифры на рисунке.

Применение

Эта особенность может быть использована при создании ботов:

  • для отсылки смс
  • спама
  • регистрации пользователей

и так далее.

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

Статью подготовили: Сачков Илья Константинович sachk@yandex.ru
Манвелян Георгий Карэнович george911@yandex.ru
Манвелян Рафаэл Карэнович rmal@yandex.ru

KeyWords: взлом Битрикс, уязвимость Битрикс, взлом CAPTCHA, уязвимость CAPTCHA, спас CAPTCHA, распознавание CAPTCHA

2 комментария

  1. Мар 5, 2015 at 7:59 пп

    Не проверяли, еще актуально? 🙂

  2. Мар 20, 2015 at 4:07 пп

    Актуально как никогда))

Оставить мнение

Check Also

FAQ: 10 простых и полезных трюков для командной строки UNIX и Linux

В современных *nix-системах есть масса команд, утилит и возможностей, о которых иногда не …