LiveStreet 2.1.0
Сайт - livestreetcms.com
#1 Bypass Auth(Type Jugling)
Рандомный обход проверки подлинности пароля, используя особенности гибкого сравнения в PHP.
Залогиниться возможно от юзера, чей пасс в md5 соответсвует 0e[0-9]{30}.
Логинимся с пассом 240610708 - треш бага.
Код:
application/classes/actions/ActionAuth.class.php:116
----------------------------------------------------
/**
* Сверяем хеши паролей и проверяем активен ли юзер
*/
if ($this->User_VerifyAccessAuth($oUser) and $oUser->verifyPassword(getRequest('password'))) {
----------------------------------------------------
application/classes/modules/user/entity/User.entity.class.php:655
----------------------------------------------------
public function verifyPassword($sPassword)
{
return $this->User_VerifyPassword($sPassword, $this->getPassword());
}
----------------------------------------------------
application/classes/modules/user/User.class.php:1955
----------------------------------------------------
public function VerifyPassword($sPassword, $sHash)
{
return $this->MakeHashPassword($sPassword) == $sHash; // уязвимая точка
}
----------------------------------------------------
#2 Stored XSS
В поле имя в настройках профиля, ограничение поля - 30 символов.
Код:
application/classes/actions/ActionSettings.class.php
-----------------------
...
if (func_check(getRequestStr('profile_name'), 'text', 2, Config::Get('module.user.name_max'))) {
$this->oUserCurrent->setProfileName(getRequestStr('profile_name'));
} else {
$this->oUserCurrent->setProfileName(null);
}
...
-----------------------
#3 Reflected XSS(в админ плагине)
Необходим установленный плагин админки.
Код:
livestreet2/admin/users/list/?filter[id]=">alert()
/livestreet2/admin/users/admins/?filter[id]=">alert()
livestreet2/admin/users/list/?filter[password]=">alert()
и так далее
Код:
application/plugins/admin/classes/actions/admin/EventUsers.class.php
-----------------------
protected function GetUsersListByRules($sFullPagePathToEvent, $aAdditionalUsersFilter = array())
...
$aValidatedSearchRules = $this->GetSearchRule($this->GetDataFromFilter());
...
-----------------------
application/plugins/admin/classes/actions/admin/ActionAdmin.class.php
-----------------------
protected function GetDataFromFilter($sName = null)
{
/*
* получить фильтр, хранящий в себе все параметры (разрезы показа, сортировку, поиск и др.)
*/
if ($aFilter = getRequest('filter') and is_array($aFilter)) {
/*
* если нужны все значения фильтра
*/
if (!$sName) {
return $aFilter;
}
/*
* если нужно выбрать одно значение из фильтра
*/
if ($sName and isset($aFilter[$sName]) and $aFilter[$sName]) {
return $aFilter[$sName];
}
}
return null;
}
-----------------------
#3,1 Cookie HttpOnly Bypass(с помощью админ плагина)
Необходим установленный плагин админки. В сорцах выводится PHPSESSID,
этого достаточно для Session Hijacking.
Код:
application/plugins/admin/frontend/skin/default/layouts/layout.base.tpl
-----------------------
...
var PATH_ROOT = '{Router::GetPath('/')}',
PATH_SKIN = '{Config::Get("path.skin.web")}',
PATH_FRAMEWORK_FRONTEND = '{Config::Get("path.framework.frontend.web")}',
PATH_FRAMEWORK_LIBS_VENDOR = '{Config::Get("path.framework.libs_vendor.web")}',
/**
* Для совместимости с прошлыми версиями. БУДУТ УДАЛЕНЫ
*/
DIR_WEB_ROOT = '{Config::Get("path.root.web")}',
DIR_STATIC_SKIN = '{Config::Get("path.skin.web")}',
DIR_STATIC_FRAMEWORK = '{Config::Get("path.framework.frontend.web")}',
DIR_ENGINE_LIBS = '{Config::Get("path.framework.web")}/libs',
LIVESTREET_SECURITY_KEY = '{$LIVESTREET_SECURITY_KEY}',
SESSION_ID = '{$_sPhpSessionId}',
SESSION_NAME = '{$_sPhpSessionName}',
LANGUAGE = '{Config::Get('lang.current')}',
WYSIWYG = {if Config::Get('view.wysiwyg')}true{else}false{/if};
var aRouter = [];
{foreach $aRouter as $sPage => $sPath}
aRouter['{$sPage}'] = '{$sPath}';
{/foreach}
...
-----------------------
#3,2 Full Path Disclosure
livestreet2/admin/utils/cron/
Код:
Внимание! Для работы планировшика нужно на вашем сервере добавить скрипт /var/www/html/livestreet2/application/utilities/cron/main.php в cron с запуском 1 раз в 5 минут. Cron необходимо добавить от имени пользователя, под которым работает ваш веб-сервер. Это позволит избежать проблем с правами. За подробностями работы с cron обратитесь к вашему системному администратору или хостеру.