Адрес уязвимости: /engine/forget.php
Проверена на: 8.0, 8.0+
Уязвимый участок кода:
elseif (isset($_POST["submit_lost"]) && isset($_POST["step2"]))
{
$lost_l2answer = $_POST["lost_l2answer"];
$lost_l2login = $_POST["step2"];
list($lost_l2answer_db, $_l2email) = $ldb->fetch_array($ldb->query("SELECT `l2answer`,`l2email` FROM `accounts` WHERE `login`='{$lost_l2login}' LIMIT 0,1"));
if ($lost_l2answer != $lost_l2answer_db)
{
$error_lost = "<div class='error'>Обнаружены следующие ошибки:<br>Ответ на секретный вопрос не верный!</div>";
}
else
{
$lost_l2answer = false;
$tmp_pass = "user" . _code_generate(6);
$tmp_pass_encode = pass_encode($tmp_pass);
$ldb->query($ldb->_parse_query($qList[$l2db_ls]["setPassword"], array("pass" => $tmp_pass_encode, "login" => $lost_l2login)));
if ($ldb->affectedrows() == 1)
{
if ($config["site"]["forget"]["method"] == 1 && $_l2email != "null@null" && $_l2email != "")
{
$_host = $_SERVER['HTTP_HOST'] ? $_SERVER['HTTP_HOST'] : @getenv('HTTP_HOST');
$mail_subject = "Восстановление пароля";
$mail_message = <<<HTML
Уважаемый {$lost_l2login},
Вы сделали запрос на получение забытого пароля на сайте http://{$_host}
Однако в целях безопасности все пароли хранятся в зашифрованном виде, поэтому мы не можем сообщить вам ваш старый пароль, поэтому для Вас был сгенерирован новый пароль:
------------------------------------------------
Ваш логин и пароль на сайте:
------------------------------------------------
Логин: {$lost_l2login}
Пароль: {$tmp_pass}
После авторизации на сайте вы сможете изменить данный пароль на любой другой.
С уважением,
Администрация http://{$_host}
HTML;
$mail_subject = "Восстановление пароля";
$mail_message = "Здраствуйте! \n\r Согласно Вашему запросу для Вас был сгенерирован новый пароль.\n\rДля входа на сайт используйте следующие данные: \n\r Логин: {$lost_l2login} \n\r Пароль: {$tmp_pass} \n\r После авторизации на сайте вы сможете изменить данный пароль на любой другой. \n\r\n\r С уважением администрация сервера http://" . $_host . "";
if (send_mail($_l2email, $lost_l2login, "{$config["site"]["reg"]["email"]}", $mail_subject, $mail_message))
{
$error_lost = "<div class='noerror'>На ваш E-Mail адрес, указанный при регистрации, было отправлено уведомление с новым паролем.</div>";
}
else
{
$error_lost = "<div class='error'>Обнаружены следующие ошибки:<br>Письмо не было отправлено! Попробуйте позже или обратитесь к Администрации.</div>";
}
}
else
{
$error_lost = "<div class='noerror'>Уважаемый посетитель! Согласно Вашему запросу для Вас был сгенерирован новый пароль. Для входа на сайт используйте следующие данные:<br><b>Логин:</b> {$lost_l2login}<br><b>Пароль:</b> {$tmp_pass}<br>После авторизации на сайте вы сможете изменить данный пароль на любой другой.</div>";
}
}
else
{
$error_lost = "<div class='error'>Ошибка базы данных! Попробуйте позже.</div>";
}
}
}
Уязвимая переменная(не фильтруется) :
$lost_l2login = $_POST["step2"];
Используется в SQL-запросе:
list($lost_l2answer_db, $_l2email) = $ldb->fetch_array($ldb->query("SELECT `l2answer`,`l2email` FROM `accounts` WHERE `login`='{$lost_l2login}' LIMIT 0,1"));
Как применить? Я думаю это не составит труда нарушить целостность данного запроса. П.с. для постояльцев 100НТ фильтр:
[hide posts=50 thank=1]
$lost_l2login = $ldb->safe($_POST["step2"]);
[/hide]

Вход
Регистрация
Наверх














