Форум АНТИЧАТ

Форум АНТИЧАТ (https://forum.antichat.xyz/index.php)
-   Уязвимости (https://forum.antichat.xyz/forumdisplay.php?f=74)
-   -   Взлом через восстановление пароля[Нужна помощь] (https://forum.antichat.xyz/showthread.php?t=184137)

AveoSS 05.03.2010 14:19

Взлом через восстановление пароля[Нужна помощь]
 
Здравствуйте,есть форма восстановления пароля
с примерно таким кодом
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>&nbsp;</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'] == 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 (80);
        
$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:16

Я так понимаю это происходит на этапе формирования запроса здесь, как сформировать запрос в форме ввода почты для восстановления пароля?

Код:

$q = '' . 'select * from hm2_users where username=\'' . $email . '\' or email=\'' . $email . '\' and (status=\'on\' or status=\'suspended\')';

AveoSS 05.03.2010 18:14

Есть смысл пробовать так в поле ввода логина\мыла
admin\';update hm2_users set pswd ='test' where id =1/*


Подскажите,пожалуйста, хоть в правильном направлении иду или нет.

Pashkela 05.03.2010 19:23

ну тут скуля на лицо, нет проверки на то, что значение при запросе только одно, т.е. просто написав емайл админа и потом свое мыло (мы должны быть предварительно зарегены на сайте и иметь живое мыло), т.е. типо в сторону 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

AveoSS 05.03.2010 19:59

Вот пытаюсь подставить сюда
Код:

$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 -(

Может кто-то еще что-то посоветует?

Pashkela 05.03.2010 20:03

понимаешь, не видя всего исходного кода, включая все функции и т.д.

$email = quote ($frm['email']);

трудно что-то говорить. Но суть взлома по идее в этом

AveoSS 05.03.2010 20:21

quote подставляет слеши?

Pashkela 05.03.2010 20:24

Вообще-то устранение уязвимостей денег стоит. Ссылку дал в личку. Основное тебе тут сказал. Дальше или сам, или извини

PS: Тут надо весь код нахрен переписывать, а не просто сказать "как"

AveoSS 05.03.2010 20:30

мне нужно просто узнать как юзать уязвимость,а вот как её править я уже сам разберусь!
Точнее будет сказать как разобраться со слешами подставляемыми к кавычкам.(если я не ошибаюсь)


Вот не могу понять почему на такие данные в форме
Код:

admin@thebestmoney.ru' or email= 'test@test.ru
получаю No accounts found
слеши подставляются насколько я понял+ судя по коду запросакавычки будут тоже закрыты для email и username

AveoSS 06.03.2010 03:51

Неужели ни у кого нету мыслей по реализации? Буду благодарен за любую помощь, идею или просто толковый совет!

[ DSU ] 06.03.2010 03:57

Профлинк в студию или сам ....

AveoSS 07.03.2010 17:35

Что имеется ввиду? Не совсем понял...

Welemir 09.03.2010 20:03

Имелось в виду ссылку на скрипт в студию,если я правильно понял )

AveoSS 09.03.2010 20:35

Вот залил архив с данной CMS,
http://slil.ru/28766198

AveoSS 09.03.2010 20:58

config.inc.php
Цитата:

function gen_confirm_code ($len, $md = 1)
{
$a = array ('1', '2', '3', '4', '5', '6', '7', '8', '9', '0', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z');
$i = 0;
$str = '';
for ($i = 0; $i < $len; ++$i)
{
$str .= $a[rand (0, sizeof ($a) - 1)];
}

if ($md)
{
$str = md5 ($str);
}

return $str;
}
Вот тут интересный участок генерации пароля, если исходить из статьи Неслучайные числа
можно организовать брут пароля используя сгенерированный для своего аккаунта пароль, если не терять соединение.

Я в правильном направлении иду?Не хочется париться с брутом, чтобы потом обламаться!


_______________________________________________

Вот допустим у меня пароль сгенерированый 4wmirzc8
то есть номер первого сгенерированного числа = 3(в массиве а соответствует 4). Если я подставлю сид равный 3, то результат rand(0,34) должен быть равен 32 и соответствовать 'w'??
Я правильно все понял, а то чот не клеится....


Время: 20:43