RDot

RDot (https://rdot.org/forum/index.php)
-   Сценарии/CMF/СMS (https://rdot.org/forum/forumdisplay.php?f=15)
-   -   Антизаливка шелла в OpenCart (https://rdot.org/forum/showthread.php?t=3247)

nikp 03.09.2014 11:18

Антизаливка шелла в 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).
И поискать место, где в ошибке можно протолкнуть инъекцию в лог (без патча, разумеется).

Chelios 19.04.2018 18:13

подскажите есть ли сейчас какие-то способы заливки шелла в последние версии ?


Часовой пояс GMT +3, время: 19:57.

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