Exploit Wordpress Взлом Кибератаки Новости Уязвимость

Уязвимость в плагине File Manager для WordPress

Уязвимость в плагине File Manager для WordPress

Только недавно мы писали о стилерах персональных данных. Однако прежде чем установить стилер на сайт, в нём надо найти уязвимость. Благо, такие уязвимости появляются чуть ли не каждую неделю.

В узких кругах существует даже такая шутка “пишем плагин – продаём 0day под этот плагин”. Ха-ха.

Впрочем, иногда плагины писать не надо, достаточно их просто как следует поковырять.

На этот раз команда Wordfence расковыряла плагин File Manager под WordPress. Плагин установлен на более чем 700000 сайтов. Уязвимость позволяет неаутентифицированным пользователям выполнять команды и загружать произвольные файлы на целевой сайт.

File Manager – плагин помогающий администраторам WordPress управлять файлами на своих сайтах. Плагин содержит дополнительную библиотеку elFinder, файловый менеджер с открытым исходным кодом, предназначенный для создания простого интерфейса управления файлами и обеспечивающий основные функции файлового менеджера. Плагин File Manager использовал эту библиотеку таким образом, что это привело к уязвимости.

Суть проблемы в том, что плагин менеджера файлов переименовывал расширение файла connector.minimal.php.dist библиотеки elFinder в .php, чтобы его можно было запускать напрямую, даже если файл коннектора не использовался самим диспетчером файлов. Такие библиотеки часто включают файлы примеров, которые не предназначены для использования без добавления элементов управления доступом, а connector.minimal.php.dist не имеет прямых ограничений доступа, то есть доступ к файлу может получить кто угодно. Этот файл мог использоваться для выполнения команды elFinder и “хукался” из файла elFinderConnector.class.php.

// run elFinder
$connector = new elFinderConnector(new elFinder($opts));
$connector->run();

Любые параметры, отправленные в запросе к connector.minimal.php, будут обрабатываться функцией run () в файле elFinderConnector.class.php, включая команду, указанную в параметре cmd.

public function run()
 {
     $isPost = $this->reqMethod === 'POST';
     $src = $isPost ? array_merge($_GET, $_POST) : $_GET;
     $maxInputVars = (!$src || isset($src['targets'])) ? ini_get('max_input_vars') : null;
     if ((!$src || $maxInputVars) && $rawPostData = file_get_contents('php://input')) {
         // for max_input_vars and supports IE XDomainRequest()
         $parts = explode('&', $rawPostData);
         if (!$src || $maxInputVars < count($parts)) {
             $src = array();
             foreach ($parts as $part) {
                 list($key, $value) = array_pad(explode('=', $part), 2, '');
                 $key = rawurldecode($key);
                 if (preg_match('/^(.+?)\[([^\[\]]*)\]$/', $key, $m)) {
                     $key = $m[1];
                     $idx = $m[2];
                     if (!isset($src[$key])) {
                         $src[$key] = array();
                     }
                     if ($idx) {
                         $src[$key][$idx] = rawurldecode($value);
                     } else {
                         $src[$key][] = rawurldecode($value);
                     }
                 } else {
                     $src[$key] = rawurldecode($value);
                 }
             }
             $_POST = $this->input_filter($src);
             $_REQUEST = $this->input_filter(array_merge_recursive($src, $_REQUEST));
         }
     }
 
     if (isset($src['targets']) && $this->elFinder->maxTargets && count($src['targets']) > $this->elFinder->maxTargets) {
         $this->output(array('error' => $this->elFinder->error(elFinder::ERROR_MAX_TARGTES)));
     }
 
     $cmd = isset($src['cmd']) ? $src['cmd'] : '';
     $args = array();

Список команд доступный из elFinder следующий:

/**
  * Commands and required arguments list
  *
  * @var array
  **/
 protected $commands = array(
     'abort' => array('id' => true),
     'archive' => array('targets' => true, 'type' => true, 'mimes' => false, 'name' => false),
     'callback' => array('node' => true, 'json' => false, 'bind' => false, 'done' => false),
     'chmod' => array('targets' => true, 'mode' => true),
     'dim' => array('target' => true, 'substitute' => false),
     'duplicate' => array('targets' => true, 'suffix' => false),
     'editor' => array('name' => true, 'method' => true, 'args' => false),
     'extract' => array('target' => true, 'mimes' => false, 'makedir' => false),
     'file' => array('target' => true, 'download' => false, 'cpath' => false, 'onetime' => false),
     'get' => array('target' => true, 'conv' => false),
     'info' => array('targets' => true, 'compare' => false),
     'ls' => array('target' => true, 'mimes' => false, 'intersect' => false),
     'mkdir' => array('target' => true, 'name' => false, 'dirs' => false),
     'mkfile' => array('target' => true, 'name' => true, 'mimes' => false),
     'netmount' => array('protocol' => true, 'host' => true, 'path' => false, 'port' => false, 'user' => false, 'pass' => false, 'alias' => false, 'options' => false),
     'open' => array('target' => false, 'tree' => false, 'init' => false, 'mimes' => false, 'compare' => false),
     'parents' => array('target' => true, 'until' => false),
     'paste' => array('dst' => true, 'targets' => true, 'cut' => false, 'mimes' => false, 'renames' => false, 'hashes' => false, 'suffix' => false),
     'put' => array('target' => true, 'content' => '', 'mimes' => false, 'encoding' => false),
     'rename' => array('target' => true, 'name' => true, 'mimes' => false, 'targets' => false, 'q' => false),
     'resize' => array('target' => true, 'width' => false, 'height' => false, 'mode' => false, 'x' => false, 'y' => false, 'degree' => false, 'quality' => false, 'bg' => false),
     'rm' => array('targets' => true),
     'search' => array('q' => true, 'mimes' => false, 'target' => false, 'type' => false),
     'size' => array('targets' => true),
     'subdirs' => array('targets' => true),
     'tmb' => array('targets' => true),
     'tree' => array('target' => true),
     'upload' => array('target' => true, 'FILES' => true, 'mimes' => false, 'html' => false, 'upload' => false, 'name' => false, 'upload_path' => false, 'chunk' => false, 'cid' => false, 'node' => false, 'renames' => false, 'hashes' => false, 'suffix' => false, 'mtime' => false, 'overwrite' => false, 'contentSaveId' => false),
     'url' => array('target' => true, 'options' => false),
     'zipdl' => array('targets' => true, 'download' => false)
 );

Однако elFinder имеет встроенную защиту от обхода каталогов, поэтому злоумышленник не сможет использовать любую из этих команд для любых файлов за пределами каталога plugins/wp-file-manager/lib/files /.

Уязвимость в плагине File Manager активно атакуется на данный момент и позволяет злоумышленникам, не прошедшим проверку подлинности, выполнять произвольный код на сайте WordPress. Эта уязвимость была исправлена сегодня утром, и мы настоятельно рекомендуем обновиться до последней версии плагина File Manager.

Очень злой админ
Очень злой админ Автор статьи

Админ сайта. Публикует интересные статьи с других ресурсов, либо их переводы. Если есть настроение, бывает, что пишет и что-то своё.

Leave a Reply

Your email address will not be published. Required fields are marked *