1

Тема: Известные уязвимости DLE-Forum (2.2 - 2.5)

Ругают разработчика DLE форума видимо не зря. Действительно, его отношение к своему детищу явно желает желать лучшего. У меня создается впечатление, что выпустив очередной релиз, у него напрочь пропадает желание поддерживать прошлые версии.
Понять его конечно можно, но тогда почему даже текущие версии своевременно не обновляются, если на том же родительском форуме люди не только выявляют баги, но и предлагают свои решения для их устранения. Ну а пользователям DLE-форума приходится усиленно рыскать по сети, чтобы хоть где-нибудь найти техническую поддержку для своего форума.
_______________

Теперь по делу:

1. Обнаружена недостаточная фильтрация данных в DLE Forum версий 2.2 - 2.5, воспользовавшись которой злоумышленник может удалить все изображения и файлы, загруженные через форум. Способ устранения был найден ShapeShifter'ом.

Инструкция (для версии 2.2):

1. Открыть engine\forum\sources\modules\uploads.php

Найти:

foreach ($del as $key => $value)
{
$mysql_array .= "file_id = '$key' OR ";
}

Заменить на:

$mysql_array = "";
    foreach ($del as $key => $value)
    {
        $key = intval($key);
        if ($key)
          $mysql_array .= "file_id = '$key' OR ";
    }

    if ($mysql_array)
    {

Найти:

}
}

echo "<div><strong>Загрузка файлов на сервер</strong><br /><br /></div>";

Заменить на:

}
}
}

echo "<div><strong>Загрузка файлов на сервер</strong>

</div>";

Инструкция (для версий 2.3 - 2.5):

1. Открыть engine\forum\sources\modules\uploads.php

Найти:

if (intval($file_id)) $del_id[$file_id] = $file_id;

Заменить на:

$file_id = intval($file_id);
if ($file_id) $del_id[$file_id] = $file_id;

Поделиться

2

Re: Известные уязвимости DLE-Forum (2.2 - 2.5)

SV пишет:

Ну а пользователям DLE-форума приходится усиленно рыскать по сети, чтобы хоть где-нибудь найти техническую поддержку для своего форума.

С таким же успехом можно найти не только техническую помощь, но и наоборот самолично установить на свой скрип дыру, которой не существовало. Кто поручится за то, что в написанных выше исправлениях(например) не находится скрытая уязвимость? Вы бы тогда хоть давали ссылку на сайт, откуда взята информация, или приписывайте авторство себе.

Не все хорошо могут разобраться в коде, чтобы понять что они делают и сразу бросаются делать исправления. Что произойдет впоследствии одному богу, черту известно. Хорошо, если ваш сайт не подвергнется взлому, а если найдется умник?

Поделиться

3

Re: Известные уязвимости DLE-Forum (2.2 - 2.5)

Очередной, очень серьезный баг заключается в том, что любой пользователь при желании может отредактировать любой, даже администраторский пост. Какие могут быть последствия понятно без объяснений.

Закрыть дыру для DLE-форума 2.4 можно отредактировав файл  /engine/forum/ajax/editpost.php следующим образом (автор фикса ShapeShifter (SaVGroup.ru))

Открываем файл,
Находим:

include 'init.php';

Добавить ниже:

require_once ENGINE_DIR.'/forum/classes/cache.php';
$fcache = new forum_cache;

Найти:

include_once ENGINE_DIR.'/forum/classes/parse.class.php';

Добавить выше:

$forum_groups = $fcache->get('forum_groups');
    
if (!$forum_groups)
{
    $get_forum_groups = $db->query("SELECT * FROM " . USERPREFIX . "_forum_groups ORDER BY group_id ASC");
    $forum_groups = array();
    while ($row = $db->get_row($get_forum_groups))
    {
        $forum_groups[$row['group_id']] = array ();
        foreach ($row as $key => $value)
        {
            $forum_groups[$row['group_id']][$key]
; = $value;
        }
    }
}

Найти:

$row = $db->super_query("SELECT * FROM " . PREFIX . "_forum_posts WHERE pid = $id");

Заменить на:

$row = $db->super_query("SELECT p.*, t.forum_id, t.tid FROM " . PREFIX . "_forum_posts p, " . PREFIX . "_forum_topics t WHERE p.pid = '$id' AND t.tid = p.topic_id");

Найти:

if ($id != $row['pid']) die ("error");

Добавить ниже:

    $have_perm = 0;
    
    $get_forum = $db->super_query("SELECT * FROM " . PREFIX . "_forum_forums WHERE id = '$row[forum_id]'");
    $value = explode(":", $get_forum['access_mod']);
    $check = in_array($member_id['user_group'], $value);
    $check_e = false;
    $check_n = false;
    if (!$check and $get_forum['moderators'])
    {
        $moderators = explode(":", $get_forum['moderators']);
        $check = in_array($member_id['user_id'], $moderators);
        $check_n = true;
    }
    if ($check) $check_e = true;

    if (!$check_n)
        $get_moder = $db->super_query("SELECT edit_post FROM " . PREFIX . "_forum_moderators WHERE group_id = '$member_id[user_group]'");
    else
        $get_moder = $db->super_query("SELECT edit_post FROM " . PREFIX . "_forum_moderators WHERE member_name = '$member_id[name]'");

    
    if( $is_logged and (($member_id['name'] == $row['post_author'] and $row['is_register'] and $forum_groups[$member_id['user_group']]['post_edit']) OR ($check_e AND $get_moder['edit_post'])) ) {
        $have_perm = 1;
    }

    if( ! $have_perm ) die( "error" );

Найти:

elseif ($_REQUEST['action'] == "save")
{

Добавить ниже:

    $row = $db->super_query("SELECT p.*, t.forum_id, t.tid FROM " . PREFIX . "_forum_posts p, " . PREFIX . "_forum_topics t WHERE p.pid = '$id' AND t.tid = p.topic_id");

    if ($id != $row['pid']) die ("error");

    $have_perm = 0;
    
    $get_forum = $db->super_query("SELECT * FROM " . PREFIX . "_forum_forums WHERE id = '$row[forum_id]'");
    $value = explode(":", $get_forum['access_mod']);
    $check = in_array($member_id['user_group'], $value);
    $check_e = false;
    $check_n = false;
    if (!$check and $get_forum['moderators'])
    {
        $moderators = explode(":", $get_forum['moderators']);
        $check = in_array($member_id['user_id'], $moderators);
        $check_n = true;
    }
    if ($check) $check_e = true;

    if (!$check_n)
        $get_moder = $db->super_query("SELECT edit_post FROM " . PREFIX . "_forum_moderators WHERE group_id = '$member_id[user_group]'");
    else
        $get_moder = $db->super_query("SELECT edit_post FROM " . PREFIX . "_forum_moderators WHERE member_name = '$member_id[name]'");

    
    if( $is_logged and (($member_id['name'] == $row['post_author'] and $row['is_register'] and $forum_groups[$member_id['user_group']]['post_edit']) OR ($check_e AND $get_moder['edit_post'])) ) {
        $have_perm = 1;
    }

    if( ! $have_perm ) die( "error" );

Поделиться

4

Re: Известные уязвимости DLE-Forum (2.2 - 2.5)

Обнаружена недостаточная фильтрация входящих данных в модуле репутаций пользователя.

http://softvopros.ru/uploads/forum/images/1308266226.jpg

Ошибка в версии: Все версии
Степень опасности: Высокая

Для исправления (баг-фикс обнародован 30 мая текущего года) нужно скачать архив с файлом и залить полученный (распакованный) файл в папку: /engine/forum/ajax/.

Поделиться