• Уменьшение отступа

    Обратная связь

    (info@ru-sfera.pw)

Прикольная уязвимость здесь была в чате


X-Shar

:)
Администрация
Регистрация
03.06.2012
Сообщения
6 068
Репутация
8 174
Как наверное многие знают, что сессии в движке хранятся в базе в зашифрованном виде, так вот захотел я кешировать сессии в памяти, т.е. что-бы не дербанить каждый раз базу, было-бы прикольно кешировать это всё в памяти, причём движок позволяет-же...

Но проблема, что чат тоже дербанит базу, что-бы получить эту самую сессию, вот код получения ID пользователя:

Код:
function getUserID() {
    $userid = 0;
    if (!empty($_SESSION['basedata']) && $_SESSION['basedata'] != 'null') {
        $_REQUEST['basedata'] = $_SESSION['basedata'];
    }

    if (!empty($_REQUEST['basedata'])) {
   
        if (function_exists('mcrypt_encrypt')) {
            $key = KEY_A.KEY_B.KEY_C;
            $uid = rtrim(mcrypt_decrypt(MCRYPT_RIJNDAEL_256, md5($key), base64_decode($_REQUEST['basedata']), MCRYPT_MODE_CBC, md5(md5($key))), "\0");
            if (intval($uid) > 0) {
                $userid = $uid;
            }
        } else {
            $userid = $_REQUEST['basedata'];
        }
    }
    if (!empty($_COOKIE['xf_session'])) {       
        $sql = ("SELECT `session_data` FROM  `".TABLE_PREFIX."session` WHERE `session_id` = '".$_COOKIE['xf_session']."'");        $query = mysqli_query($GLOBALS['dbh'],$sql);
        $sess2 = mysqli_fetch_assoc($query);
        $sess3 = unserialize($sess2['session_data']);
        if(!empty($sess3['user_id'])) {
            $userid = $sess3['user_id'];
        } else {
            $userid = 0;
        }
    }
    $userid = intval($userid);
    return $userid;
}

Так вот на одном форуме я увидел совет, сохранять ID пользователя в куки, а потом эти куки уже брать чатом и тем-самым базу дербанить ненужно и кешировать сессии можно, код получился уже такой:

Код:
function getUserID() {
    $userid = 0;

    if (!empty($_SESSION['basedata']) && $_SESSION['basedata'] != 'null') {
        $_REQUEST['basedata'] = $_SESSION['basedata'];
    }
    if (!empty($_REQUEST['basedata'])) {
        $userid = $_REQUEST['basedata'];
    }
    if (!empty($_COOKIE['cc_xf_user'])) {
        $a = explode(',',$_COOKIE['cc_xf_user']);
        $userid = $a[0];
    }
    return $userid;
}

Создаём куки так:
Код:
<script type="text/javascript">
var userid = {$visitor.user_id};document.cookie = "cc_xf_user="+userid;
</script>

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

Пример как это сделать в Опере, заходите на форум, далее Настройки->Управление Куками->Выбираете этот мега-крутой сайт, далее находите cc_xf_user=... и меняете на ID нужного пользователя, т.е. если введёте 1, то зайдёте под моим никнеймом, минуя авторизацию !Как об стену !!!ogo-gonea88

Fix.png
 

X-Shar

:)
Администрация
Регистрация
03.06.2012
Сообщения
6 068
Репутация
8 174
Как можно найти подобную уязвимость на других сайтах?Она именно в этой версии чата?
Это головотяпство из серии "Вредные советы" !Dmeh-Smeh-Smeh!!!

Тут нужно анализировать в "Веб разработка" в мозилле например, а так есть спец. софт для поиска уязвимостей на сайтах, кто-чем пользуются...

У профи наверное глаз набит уже, посмотрят на сайт и могут его хакнуть уже, если конечно есть уязвимости !WinkSmile

Эту я прекрыл уже, т.е. вернул как было, кеширование сессий пришлось правда отключить, пока не пойму как сделать чтобы чат неслетал...Отдыхай!!!
 

X-Shar

:)
Администрация
Регистрация
03.06.2012
Сообщения
6 068
Репутация
8 174
То есть в куки сохраняется только кеш одного ID?
Ога, он-же сессию-то найти не может, т.к. если включить кеш она сохранится в памяти, а не базе !

Этот вредный совет кстати на офф. сайте движка:

:Mem26:
 

X-Shar

:)
Администрация
Регистрация
03.06.2012
Сообщения
6 068
Репутация
8 174
Мля целый вечер провозился, скажите что я ламер, ну и пох...

Короче убрал я этот Индийский код получения ID , и решил написать свой ещё более Индийский код, а почему-бы неподцепить ксенфоровский АПИ, вот что делаем, в файле Integration.php объявляем дефайном переменные:

Код:
define( 'XF_ROOT', 'Относительный путь к папке XenForo' );
define( 'TIMENOW', time( ) );
define( 'SESSION_BYPASS', false );

Далее, переписал процедуру получения айди пользователя, через апи движка:

Код:
function getUserID() {

$userid = 0;
$user_info = array( );
require_once( XF_ROOT . '/library/XenForo/Autoloader.php' );
XenForo_Autoloader::getInstance( )->setupAutoloader( XF_ROOT . '/library' );
XenForo_Application::initialize( XF_ROOT . '/library', XF_ROOT );
XenForo_Application::set( 'page_start_time', TIMENOW );
XenForo_Application::disablePhpErrorHandler( );
XenForo_Application::setDebugMode( false );
if (!SESSION_BYPASS)
{
    XenForo_Session::startPublicSession();

    $visitor = XenForo_Visitor::getInstance();

    if ($visitor->getUserId())
    {
        $userModel = XenForo_Model::create('XenForo_Model_User');
        $userid = $visitor->getUserId();
    }
}
$userid = intval($userid);
return $userid ;
}

В этоге мы "Грабим" UserID прям из памяти, при помощи ксенфоровских АПИ, включил кеширование сессии и пошёл спать !Hi-H-88
 

X-Shar

:)
Администрация
Регистрация
03.06.2012
Сообщения
6 068
Репутация
8 174
Мля, тут в коде закралась страшная ошибка которая приводила "Отказ в обслуживании":https://ru-sphere.ru/threads/obnovlenie-foruma-i-lagi.2042/page-4#post-116545

Модифицировал код так:

Код:
function getUserID() {

$userid = 0;

XenForo_Autoloader::getInstance( )->setupAutoloader( XF_ROOT . '/library' );
XenForo_Application::initialize( XF_ROOT . '/library', XF_ROOT );

XenForo_Session::startPublicSession();

$visitor = XenForo_Visitor::getInstance();

if ($visitor->getUserId())
    {
       $userid = $visitor->getUserId();
    }

$userid = intval($userid);
return $userid ;
}

Т.е. удалил всё лишнее, т.е. сейчас всё должно-быть нормально, я надеюсь !
 
Верх Низ