Недостаточная фильтрация в модуле восстановления пароля

Баг-фиксы найденные в DataLife Engine

Недостаточная фильтрация в модуле восстановления пароля

Сообщение Брупт » 12 ноя 2009, 20:45

Сегодня был обнаружен баг в модуле восстановления пароля пароля, который просто меня ошеломил, таких дыр в dle не было давненько, с помощью этой "дырки" можно в одну команду взломать любой сайт на dle 8.2, думаю сейчас начнется что то не вероятное, потому что такую возможность стырить базу, снести чужой сайт или просто по выпендриваться, что крайне любят делать малолетки, возможно больше не появится :)

Исправление баг-фикса смотрите здесь: Недостаточная фильтрация входящих данных в модуле восстановления пароля.

Как только все пользователи DLE исправят эту ошибку я опубликую в чем заключается проблема и как можно взломать сайт с помощью этой ошибки.
Аватара пользователя
Брупт
DLE-Infa group ©
 
Сообщения: 21
Зарегистрирован: 31 окт 2009, 22:13

Re: Недостаточная фильтрация в модуле восстановления пароля

Сообщение Брупт » 14 ноя 2009, 16:48

Как не печально, но действительно как я и предполагал было слито множество баз и снесено множество сайтов, в этом можно убедится зайдя на любой форум посвященный dle, даже на тот же forum.dle-news.ru или просто форум для программистов, а сколько народу еще промолчали :)

Мое личное мнение, то что celsoft не правильно публикует патчи и баг-фиксы, так как любой юзер, даже плохо знающий php может сравнить 2 файла, разобраться в исходном коде и "поломать" множество сайтов, ради интереса или просто слить базу у конкурента, как это собственно произошло. Нужно просто обновлять весь дистрибутив, и разослать уведомления, что нужно перезалить движок, тем самым становится сложнее найти ту самую "дыру" в коде и взломов было бы меньше, но не как не вылаживать отдельным патчем и тем более делать его доступным для скачивания всем подряд. Вообщем это проблемы только SoftNews Media Group и они их решают как считают нужным.

Собственно перейду к самому багу и рассмотрим его подробнее, надеюсь все уже обновились. Для начала вот часть исходного кода, бага
Код: Выделить всё
} elseif( intval( $_GET['douser'] ) ) {
   
   $douser = intval( $_GET['douser'] );
   $lostid = $_GET['lostid'];
   
   $row = $db->super_query( "SELECT lostid FROM " . USERPREFIX . "_lostdb WHERE lostname='$douser'" );
   
   if( $row['lostid'] == $lostid ) {

Как мы видим переменная $lostid не проверяется и никак не фильтруется, а if( $row['lostid'] == $lostid ) { говорит о том, что она должна быть равна значению поля lostid с базы, но если передать переменную $douser которой нету в таблицы _lostdb, и переменную $lostid оставить пустой, то они будут равны так как mysql вернет null и переменной $lostid тоже равно нулю, тем самым выражение if( $row['lostid'] == $lostid ) будет истинным if(0==0) следовательно выполнится php код генерации и вывода нового пароля в браузер и мы получим новый пароль пользователя, id которого мы передали в переменной $douser.

Вывод: Если сделать запрос http://site.ru/index.php?do=lostpassword&douser=ID Юзера которого ломаем, например если ломаем админа, то будет "1" (http://site.ru/index.php?do=lostpassword&douser=1), то получим новый пароль и полный доступ к сайту, а в некоторых случаях еще получим пизд*, и проломленный череп с переломанными ребрами.

Вообщем не делаем глупостей, и у Вас, и у других все будет отлично :)
Аватара пользователя
Брупт
DLE-Infa group ©
 
Сообщения: 21
Зарегистрирован: 31 окт 2009, 22:13


Вернуться в Баг-фиксы

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей

cron