Здравствуйте,есть форма восстановления пароля с примерно таким кодом PHP: {literal} <script language=javascript> function checkform() { if (document.forgotform.email.value == '') { alert("Введите ваше имя пользователя или email!"); document.forgotform.email.focus(); return false; } return true; } </script> {/literal} <h3>Восстановление пароля :</h3><br> <form method=post name=forgotform onsubmit="return checkform();"> <input type=hidden name=a value="forgot_password"> <input type=hidden name=action value="forgot_password"> <table cellspacing=0 cellpadding=2 border=0> <tr> <td>Введите ваше имя пользователя или email!</td> <td><input type=text name='email' value="" class=inpts size=30></td> </tr> <tr> <td> </td> <td><input type=submit value="Напомнить" class=sbmt></td> </tr> </table> </form><br><br> {if $found_records == 0} Такой счет не существует {elseif $found_records > 0} Вход и пароль высланы Вам. Пожалуйста проверьте вашу эл.почту. {/if} вот еще forgoten_password.inc PHP: $found_records = -1; if ($frm['action'] == 'forgot_password') { $found_records = 0; $email = quote ($frm['email']); $q = '' . 'select * from hm2_users where username=\'' . $email . '\' or email=\'' . $email . '\' and (status=\'on\' or status=\'suspended\')'; if (!($sth = mysql_query ($q))) { exit (mysql_error ()); ; } while ($row = mysql_fetch_array ($sth)) { if (($settings['demomode'] == 1 AND $row['id'] <= 3)) { } else { if ($row['activation_code'] != '') { $info = array (); $info['activation_code'] = $row['activation_code']; $info['username'] = $row['username']; $info['name'] = $row['name']; $info['ip'] = '[not logged]'; $info['max_tries'] = $settings['brute_force_max_tries']; send_mail ('brute_force_activation', $row['email'], $settings['system_email'], $info); } $password = gen_confirm_code (8, 0); $enc_password = md5 ($password); $q = '' . 'update hm2_users set password = \'' . $enc_password . '\' where id = ' . $row['id']; if (!($sth1 = mysql_query ($q))) { exit (mysql_error ()); ; } if ($settings['store_uncrypted_password'] == 1) { $pswd = quote ($password); $q = '' . 'update hm2_users set pswd = \'' . $pswd . '\' where id = ' . $row['id']; if (!($sth1 = mysql_query ($q))) { exit (mysql_error ()); ; } } $info = array (); $info['username'] = $row['username']; $info['password'] = $password; $info['name'] = $row['name']; $info['ip'] = $frm_env['REMOTE_ADDR']; send_mail ('forgot_password', $row['email'], $settings['system_email'], $info); } $found_records = 1; } } $smarty->assign ('found_records', $found_records); $smarty->display ('forgot_password.tpl'); ?> Как взломщику удается отправлять пароль не только на почту админа но и себе???
Я так понимаю это происходит на этапе формирования запроса здесь, как сформировать запрос в форме ввода почты для восстановления пароля? Code: $q = '' . 'select * from hm2_users where username=\'' . $email . '\' or email=\'' . $email . '\' and (status=\'on\' or status=\'suspended\')';
Есть смысл пробовать так в поле ввода логина\мыла admin\';update hm2_users set pswd ='test' where id =1/* Подскажите,пожалуйста, хоть в правильном направлении иду или нет.
ну тут скуля на лицо, нет проверки на то, что значение при запросе только одно, т.е. просто написав емайл админа и потом свое мыло (мы должны быть предварительно зарегены на сайте и иметь живое мыло), т.е. типо в сторону or копать, т.е. например такой запрос будет правильный: $q = 'select * from hm2_users where username= '' . $email . ' or email=' . $email . ' or email = "а_тут_email_ взломщика"' ; и вернет данные как по админу, так и по нашему акку, и все последующие действия будут верны как для почты админа, так и для почты хеккера, т.е. мы МОЖЕМ поменять пароль как себе, так и админу а проверка на id, которая типо существует, работает как раз на хеккера: if (($settings['demomode'] == 1 AND $row['id'] <= 3)) { } else - тут как раз наоборот должно быть типо "Хеккер дай!" т.е. это ровным счетом означает, что чувак, надо чтобы у тебя id было >3, флаг тебе в руки ну а дальше идет while, который делает необходимые действия СО ВСЕМИ РЕЗУЛЬТАТАМИ первого sql запроса (где выбирается юзер по email), которых может быть не один, ибо проверки нет PS: Ну и не фильтруется нифига ничего, это понятно. Диагноз не факт что правильный, беглый просмотр т.е. при восстановлении вписать в поле мыла чонить вроде этого: [email protected]' or email='[email protected]
Вот пытаюсь подставить сюда Code: $q = '' . 'select * from hm2_users where username=\'' . $email . '\' or email=\'' . $email . '\' and (status=\'on\' or status=\'suspended\')'; admin\' or username= \'aveo.ssx Насколько я понимаю таким образом я закрою 1 юзернейм и будет закрыт 2, а дальше все исполнится как надо, НО ничего не выходит может это из-за Code: $email = quote ($frm['email']); Пробывал еще так [email protected] ' or email= '[email protected] толку 0 -( Может кто-то еще что-то посоветует?
понимаешь, не видя всего исходного кода, включая все функции и т.д. $email = quote ($frm['email']); трудно что-то говорить. Но суть взлома по идее в этом
Вообще-то устранение уязвимостей денег стоит. Ссылку дал в личку. Основное тебе тут сказал. Дальше или сам, или извини PS: Тут надо весь код нахрен переписывать, а не просто сказать "как"
мне нужно просто узнать как юзать уязвимость,а вот как её править я уже сам разберусь! Точнее будет сказать как разобраться со слешами подставляемыми к кавычкам.(если я не ошибаюсь) Вот не могу понять почему на такие данные в форме Code: [email protected]' or email= '[email protected] получаю No accounts found слеши подставляются насколько я понял+ судя по коду запросакавычки будут тоже закрыты для email и username
Неужели ни у кого нету мыслей по реализации? Буду благодарен за любую помощь, идею или просто толковый совет!
config.inc.php Вот тут интересный участок генерации пароля, если исходить из статьи Неслучайные числа можно организовать брут пароля используя сгенерированный для своего аккаунта пароль, если не терять соединение. Я в правильном направлении иду?Не хочется париться с брутом, чтобы потом обламаться! _______________________________________________ Вот допустим у меня пароль сгенерированый 4wmirzc8 то есть номер первого сгенерированного числа = 3(в массиве а соответствует 4). Если я подставлю сид равный 3, то результат rand(0,34) должен быть равен 32 и соответствовать 'w'?? Я правильно все понял, а то чот не клеится....