Antichat снова доступен.
Форум Antichat (Античат) возвращается и снова открыт для пользователей.
Здесь обсуждаются безопасность, программирование, технологии и многое другое.
Сообщество снова собирается вместе.
Новый адрес: forum.antichat.xyz
 |
|
Взлом через восстановление пароля[Нужна помощь] |

05.03.2010, 14:19
|
|
Новичок
Регистрация: 19.02.2010
Сообщений: 13
Провел на форуме: 58642
Репутация:
4
|
|
Взлом через восстановление пароля[Нужна помощь]
Здравствуйте,есть форма восстановления пароля
с примерно таким кодом
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');
?>
Как взломщику удается отправлять пароль не только на почту админа но и себе???
Последний раз редактировалось AveoSS; 05.03.2010 в 15:14..
|
|
|

05.03.2010, 15:16
|
|
Новичок
Регистрация: 19.02.2010
Сообщений: 13
Провел на форуме: 58642
Репутация:
4
|
|
Я так понимаю это происходит на этапе формирования запроса здесь, как сформировать запрос в форме ввода почты для восстановления пароля?
Код:
$q = '' . 'select * from hm2_users where username=\'' . $email . '\' or email=\'' . $email . '\' and (status=\'on\' or status=\'suspended\')';
|
|
|

05.03.2010, 18:14
|
|
Новичок
Регистрация: 19.02.2010
Сообщений: 13
Провел на форуме: 58642
Репутация:
4
|
|
Есть смысл пробовать так в поле ввода логина\мыла
admin\';update hm2_users set pswd ='test' where id =1/*
Подскажите,пожалуйста, хоть в правильном направлении иду или нет.
|
|
|

05.03.2010, 19:23
|
|
Динозавр
Регистрация: 10.01.2008
Сообщений: 2,841
Провел на форуме: 9220514
Репутация:
3338
|
|
ну тут скуля на лицо, нет проверки на то, что значение при запросе только одно, т.е. просто написав емайл админа и потом свое мыло (мы должны быть предварительно зарегены на сайте и иметь живое мыло), т.е. типо в сторону 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: Ну и не фильтруется нифига ничего, это понятно. Диагноз не факт что правильный, беглый просмотр
т.е. при восстановлении вписать в поле мыла чонить вроде этого:
admin@mail.ru' or email='hekker@mail.ru
Последний раз редактировалось Pashkela; 05.03.2010 в 20:00..
|
|
|

05.03.2010, 19:59
|
|
Новичок
Регистрация: 19.02.2010
Сообщений: 13
Провел на форуме: 58642
Репутация:
4
|
|
Вот пытаюсь подставить сюда
Код:
$q = '' . 'select * from hm2_users where username=\'' . $email . '\' or email=\'' . $email . '\' and (status=\'on\' or status=\'suspended\')';
admin\' or username= \'aveo.ssx
Насколько я понимаю таким образом я закрою 1 юзернейм и будет закрыт 2, а дальше все исполнится как надо, НО ничего не выходит может это из-за
Код:
$email = quote ($frm['email']);
Пробывал еще так
admin@thebestmoney.ru ' or email= 'aveo.ssx@gmail.com
толку 0 -(
Может кто-то еще что-то посоветует?
Последний раз редактировалось AveoSS; 05.03.2010 в 20:03..
|
|
|

05.03.2010, 20:03
|
|
Динозавр
Регистрация: 10.01.2008
Сообщений: 2,841
Провел на форуме: 9220514
Репутация:
3338
|
|
понимаешь, не видя всего исходного кода, включая все функции и т.д.
$email = quote ($frm['email']);
трудно что-то говорить. Но суть взлома по идее в этом
|
|
|

05.03.2010, 20:21
|
|
Новичок
Регистрация: 19.02.2010
Сообщений: 13
Провел на форуме: 58642
Репутация:
4
|
|
quote подставляет слеши?
|
|
|

05.03.2010, 20:24
|
|
Динозавр
Регистрация: 10.01.2008
Сообщений: 2,841
Провел на форуме: 9220514
Репутация:
3338
|
|
Вообще-то устранение уязвимостей денег стоит. Ссылку дал в личку. Основное тебе тут сказал. Дальше или сам, или извини
PS: Тут надо весь код нахрен переписывать, а не просто сказать "как"
Последний раз редактировалось Pashkela; 05.03.2010 в 20:27..
|
|
|

05.03.2010, 20:30
|
|
Новичок
Регистрация: 19.02.2010
Сообщений: 13
Провел на форуме: 58642
Репутация:
4
|
|
мне нужно просто узнать как юзать уязвимость,а вот как её править я уже сам разберусь!
Точнее будет сказать как разобраться со слешами подставляемыми к кавычкам.(если я не ошибаюсь)
Вот не могу понять почему на такие данные в форме
Код:
admin@thebestmoney.ru' or email= 'test@test.ru
получаю No accounts found
слеши подставляются насколько я понял+ судя по коду запросакавычки будут тоже закрыты для email и username
Последний раз редактировалось AveoSS; 05.03.2010 в 20:35..
|
|
|

06.03.2010, 03:51
|
|
Новичок
Регистрация: 19.02.2010
Сообщений: 13
Провел на форуме: 58642
Репутация:
4
|
|
Неужели ни у кого нету мыслей по реализации? Буду благодарен за любую помощь, идею или просто толковый совет!
|
|
|
|
 |
|
|
Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
|
|
|
|