Вторжение в Gameland

Вечер понедельника. Погода ни к черту, пишу новую программу под заказ… Скукотища… Мою меланхолию неожиданно прервало мигающие окошко миранды, писал Димон (aka Lex Luthor). Он выдвинул предложение поучавствовать нашему сайту (www.coderszone.info) в каком-то конкурсе организованном компанией геймлэнд.Если кто не в теме то геймлэнд — это 5 млн. читателей, крупнейшие журналы разных категорий: Хакер, Страна игр, Sync, DVD Expert и множество других. Вообщем крупная рыбка ;) Захожу на www.eaward.ru, регистрируюсь, и вот тут как раз все и начинается…Взлом крупного сервера

Сергей «John Frost» Колесник (john-frost@yandex.ru, john-frost@coderszone.info)
Дмитрий «Lex Luthor» Фаттахов (lutorcorp@yandex.ru, lex@coderszone.info)

Скачать видео взлома

Вечер понедельника. Погода ни к черту, пишу новую программу под заказ… Скукотища… Мою меланхолию неожиданно прервало мигающие окошко миранды, писал Димон (aka Lex Luthor). Он выдвинул предложение поучавствовать нашему сайту (www.coderszone.info) в каком-то конкурсе организованном компанией геймлэнд.Если кто не в теме то геймлэнд — это 5 млн. читателей, крупнейшие журналы разных категорий: Хакер, Страна игр, Sync, DVD Expert и множество других. Вообщем крупная рыбка ;) Захожу на www.eaward.ru, регистрируюсь, и вот тут как раз все и начинается…

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

Database error: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near \’\’ at line 7
The query string was: SELECT *, \’Мои проекты\’ AS catName, CASE WHEN approved=0 THEN \’Ожидает модерации\’ WHEN approved=1 THEN \’ \’ WHEN approved=2 THEN \’Не допущена к участию\’ END AS status FROM projects WHERE userid=

Это уже моментально зажгло во мне интерес — еще бы, ошибка сама прыгает в наши руки ;) Такого я не мог пропустить. Учитывая то, что раньше я такую ошибку не наблюдал, я предположил что за пару часов истекло время сессии (нет, не той что будет зимой), поэтому запрос приводит к ошибке. Начав исследование я обратил внимание на большое содержание ява-кода в страницах, но пока решил не разбираться в нем.
Далее я решил проверить что фильтруется при подаче заявки на новый проект, первым претендентом стало поле для ввода названия проекта. Введя

<h1> Привет

и нажав сохранить, я получил прикольную картинку — хтмл теги не фильтровались. Поигравшись вдоволь с тегами я понял, что тут ловить нечего, т.к. все опасные конструкции он фильтрует, со скриптами даже близко не подойдешь.
Пока я ушел в раздумья на попытки взлома разродился Лекс:ajax_login.php, если реально аякс юзают, то была бага в нём, в 2,4 если не ошибаюсь. Тут я вспомнил про ява-скрипты на сайте, и нашел там нужную нам функцию:

function ajax_login() {

        $('loginLoading').style.display="block";
        $('registation_container').style.display="none";

        new Ajax.Request("ajax_login.php?email=" + $('user').value, {
        method: "post" ,
        parameters: "email=" + $('user').value + "&pass=" + $('password').value,
        onSuccess: function(transport) {
            window.location.href="myprojects.php";
        },
        onFailure: function(transport) {
            $('loginLoading').style.display="none";
            $('loginFailure').style.display= "block";
        }
        });
    }

То есть процес авторизации юзера с именем «admin» и паролем «111» выглядел так http://www.eaward.ru/ajax_login.php?email=admin@eaward.ru&pass=111
Введя заветную строчку я получил «юзер нот фаунд», облом :(. Проверил на своем зарегистрированом юзере — тоже облом. Решили искать багу дальше.В поисках этой хоть какой-нибудь существенной ошибки было проведено 15 минут…

Ламеризм попадается везде…
И вот она родимая — первая серьезная бага. Мы тестировали скрипт www.eaward.ru/myprojects.php, для этого пришлось зарегится и игратся с параметрами, все вроде бы фильтровалось, я в течении 5 минут безуспешно пытался найти хоть какую-нибудь зацепку пока Лекс не стал рассыпался комплиментами в адрес кодеров этих скриптов, еще бы такого даже я не ожидал — мы могли изменять данные любой анкеты без прав на это! Ответ был прямо перед глазами. Надо было всего лишь передать переменной action значение \’edit\’ и указать номер требуемой анкеты, например http://eaward.ru/myprojects.php?action=edit&id=80.
Это сразу же придало нам надежду на успех, еще бы, мы можем изменять данные любых проектов, но мы даже не могли подумать что зайдем гораздо дальше, но об этом ниже. Было решено найти ошибку по серьезней. В ход пошли скуль-иньекции, которые ничего толком не дали за полчаса тестирования. Использовались все известные мне приемы, встроенные подзапросы, но это не дало плодов.
Уверенность во взломе угасала. Вернее мы могли приколотся и испортить имеющиеся на сайте проекты конкурсантов, но это было слишком мелко. Мы решили отложить пока взлом и выйти на улицу. Свежий воздух сделал свое дело. Лексом была выдвинута последняя идея.
Смотри, сказал он, была бага в ипб — под видом картинки грузили ява скрипт,т.е единственное, что мы можем сделать это грузить. Решили проверить загрузку файлов на сервак, сначала показалось что возможность провести такое есть только при регистрации проекта, решили проверить. Множественные попытки не увенчались успехом, двойное расширение, подмена расширения — всё это жестока фильтровалось, в этом случае защита была хорошей. Но как оказалось был еще один способ загрузки файлов, после регистрации проекта, и был он очень дырявый, ну уж очень ;) Почему-то кодеры этого проекта решили, что проверка должна проводится пре регистрации, чтобы отсечь злобных хацкеров, а вот если ты уже зареген, то ты уже не только хороший человек, но даже и не подумаешь ничего плохого сделать ;) Железная логика, не правда ли? ;)
Димон решил не становится хорошим человеком и залил сюда http://eaward.ru/uploaded/ скриптик, выводящий набо буковок, проверки на заливку небыло ни какой. Можно было залить абсолютно любой файл, независимо от расширения, размера и содержимого, такого я еще нигде не видел.
Тут же лекс пытался залить шел, но почему то ничего не вышло, он ушел в раздумья. Я тем временем, быстренько зарегил нового участника (мыло можно было вводить любое, оно тоже не проверялось), набросал малюсенький скриптик и залил его.

<? print("<BR>][ello</BR>");
   passthru('cat /etc/passwd/');
?>

Затем вбил в браузер http://eaward.ru/uploaded/82.php и увидел следующую картину(это кусочек):

Вторжение в Gameland

описание: Красивое зрелище ;)

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

Разбор полетов или любопытство взяло верх
Прошло где-то минут десять, пока я тупо смотрел в монитор с запущенным шелом. Ну вроде бы все, взлом сделали, что же делать дальше? Задефейсить или поприкалыватся, а может вообще удалить все и по тихому уйти? НЕТ, все это какой-то вандализм. Было решено сообщить об ошибке админу сайта. Удалив шел, я решил написать админу сайта письмецо с описанием ошибок, но на сайте не было его адреса. Вспомнив что организатор этого конкурса компания Геймлэнд, я придумал решение. Редактора журнала «PC ИГРЫ» с которым одно время часто общался по теме кодинга, был сейчас онлайн. Связавшись с ним по аське, я обьяснил суть проблемы и написал описание ошибок, он обещал их срочно передать программистам. И действительно, через несколько часов пришло письмо с благодарностями мне и Лексу ;)
После того как я отправил письмо, я решил идти спать, т.к. на следующий день мне надо было здавать зачеты по экономике(которые я так и не здал ;)). Все два часа что я спал мне снился отдел К врывающийся ко мне в дом и кадры из фильма Хаттабыч. Вхолодном поту я проснулся и решил проверить исправили ли ошибки на сайте, хотя если честно в душе я надеялся что они этого еще не сделали. Я зашел снова, лазейки еще работали. Залил шел и залез на сервак, на котором хранилось очень много интересной информации и около 10 сайтов геймлэнда + их бэкапы в архивах ;) Меня захлестнула волна любопытства. Полазив еще где-то час на серваке я много чего узнал и сделал, но пусть это останется моей тайной ;) Сделав все что мне нужно, я удалил логи и снова уснул, теперь уже до утра.
Вывод: иногда очень тривиальные и глупые ошибки допускаются даже в таких крупных компаниях как геймлэнд. Просто представь масштабы того, что могло бы произойти если эту ошибку нашли очень нехорошие редиски — от дефейся десятки крупнейший сайтов до полного уничтожения. Надо проверять все, т.к. куча ошибок на маленьком сайте могут помочь поломать еще кучу других, прекрасно защищенных сайтов. Своеобразная ахилесова пята.
P.S. Самое интересное, что когда опять через неделю туда зашел, я нашел еще несколько багов, так что ошибки везде есть и будут ;)

Внимание! Информация представлена исключительно с целью ознакомления! Ни автор, ни редакция за твои действия ответственности не несет!

Info
Запрещай все, кроме разрешенного, иначе вся система безопасности бессмысленна.

Вторжение в Gameland

Описание: Главная страница пораженного портала

Вторжение в Gameland

Описание: html-теги не фильтровались

Вторжение в Gameland

Описание: Конечная цель хацкеров ;)