Старый 03.09.2014, 11:18   #1
nikp
Banned
 
Регистрация: 05.07.2010
Сообщений: 201
Репутация: 183
По умолчанию Антизаливка шелла в OpenCart

Года полтора назад заводил магазинчик на OpenCart.
Движок не очень понравился, пришлось делать много доработок по функционалу, уже не помню все места, где правил, поэтому не спешу перейти на новую версию.
А еще он хорошо нагружает хостинг и не очень отзывчив. Возможно просто не рассчитан на такое количество товаров, примерно 20000.

Это впечатления от эксплуатации, а сама заливка шелла описана тут
В текущей версии (1.5.6.4) тоже не исправлено.

Смысл такой:
в админке можно задать произвольное имя файла лога ошибок (System -> Settings -> Edit Your Store -> Server Tab and at "Error Log Filename"), например
Код:
error.php
../../path/shell.php
имя хранится в таблице setting, key = config_error_filename.
Можно поменять его и из PMA.

Текст ошибки тоже не фильтруется. К примеру, восстанавливаем базу ( System -> Backup / Restore) из файла с содержимым
PHP код:
<?phpinfo();?>
и наш код благополучно выполнится по адресу
Код:
system/logs/error.php
Эта беда находится в скрипте system/library/log.php
PHP код:
class Log {
    private 
$filename;
    
    public function 
__construct($filename) {
        
$this->filename $filename;
    }
    
    public function 
write($message) {
        
$file DIR_LOGS $this->filename;
        
        
$handle fopen($file'a+'); 
        
        
fwrite($handledate('Y-m-d G:i:s') . ' - ' $message "\n");
            
        
fclose($handle); 
    }

В $filename читается содержимое из БД, без фильтрации.
В лог пишется содержимое $message (в нашем случае сообщение мускула), тоже не фильтруется.

лечение простое, запретим опасные расширения для конкретного сервера
и стриптагзом вырежем возможность пропихнуть теги с опасным содержимым.
PHP код:
class Log {
    private 
$filename;
    
    public function 
__construct($filename) {
        
$filename=preg_replace('/[^a-z0-9\.]*/'''$filename);
        
$filename=str_ireplace(array('.php','.phtml','.shtml','.pl','.py','.htaccess','..'), '_'$filename);
        
$this->filename $filename;
    }
    
    public function 
write($message) {
        
$file DIR_LOGS $this->filename;
        
        
$handle fopen($file'a+'); 
        
        
fwrite($handledate('Y-m-d G:i:s') . ' - ' strip_tags($message) . "\n");
            
        
fclose($handle); 
    }

Можно лог вести в файл без расширения, тогда фильтр упростится
PHP код:
$filename=preg_replace('/[^a-z0-9]*/'''$filename);
//$filename=str_ireplace(array('.php','.phtml','.shtml','.pl','.py','.htaccess','..'), '_', $filename); 
PS
Не проверял, но возможно получится залиться и без админки, если есть доступ к БД (phpMyAdmin).
И поискать место, где в ошибке можно протолкнуть инъекцию в лог (без патча, разумеется).
nikp вне форума   Ответить с цитированием
Старый 19.04.2018, 18:13   #2
Chelios
 
Регистрация: 05.07.2010
Сообщений: 42
Репутация: 14
По умолчанию

подскажите есть ли сейчас какие-то способы заливки шелла в последние версии ?
Chelios вне форума   Ответить с цитированием
Ответ

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

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

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

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

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



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