[ Обзор уязвимостей DX Board ]

Discussion in 'Веб-уязвимости' started by d_x, 19 Apr 2008.

  1. d_x

    d_x Banned

    Joined:
    25 Mar 2008
    Messages:
    558
    Likes Received:
    650
    Reputations:
    210
    Спасибо всем, кто тестил и нашёл ошибки в движке, а я выкладываю его исходники, как и обещал. Скачать можно тут:
    http://dxboard.ru/DX%20Board%202.1.13.zip

    На сайте http://dxboard.ru по-прежнему можно проводить тесты, писать отзывы и т.д.
    Ставить форум так: заливаем на хост все файлы и папки из архива и обращаемся к index.php.
    Думаю, в ближайшее время напишу доки, как создавать новые оформления. Кстати, форум работает исключительно с windows-1251.

    P.S. Для тех, кто не в теме: https://forum.antichat.ru/thread67620.html
    Описание движка:
    http://dxboard.ru/viewtopic.php?id=3

    Жду ваших мнений:)
     
    #1 d_x, 19 Apr 2008
    Last edited: 27 Apr 2008
    5 people like this.
  2. Doom123

    Doom123 Elder - Старейшина

    Joined:
    11 Nov 2006
    Messages:
    749
    Likes Received:
    244
    Reputations:
    22
    preg_match("/^(\d)+$/",$uid) === is_numeric

    думаю хорошо бы было еслиб ты раставил все фалы по папкам как в ВБ
    и можно также сделать перaиксы для файлов .. типо
    function_db.php
     
    #2 Doom123, 19 Apr 2008
    Last edited: 19 Apr 2008
    1 person likes this.
  3. d_x

    d_x Banned

    Joined:
    25 Mar 2008
    Messages:
    558
    Likes Received:
    650
    Reputations:
    210
    Ну, is_numeric в общем то не совсем то же, что и preg_match("/^(\d)+$/",$uid), так как
    is_numeric возвратит true, если передать, например, число 0.123, или -123, или 5e10, или даже 0xFF. А регулярка только цифры пропускает.

    Да, исходники не в лучшем виде, как я и говорил, но если сейчас начать файлы сортировать и переименовывать - то это наверняка будет куча ошибок, они же друг на друга ссылаются многие.
     
    #3 d_x, 20 Apr 2008
    Last edited: 20 Apr 2008
  4. Nelzone

    Nelzone Banned

    Joined:
    12 Apr 2008
    Messages:
    172
    Likes Received:
    134
    Reputations:
    6
    Хороший движок! афтару респект поюзайем)
     
  5. Elekt

    Elekt Banned

    Joined:
    5 Dec 2005
    Messages:
    944
    Likes Received:
    427
    Reputations:
    508


    Результаты проверки на безопасность.
    Тестирование на XSS атаки не проводилось.

    ===================================

    DX Board 2.1.12 final

    ===================================

    Дефолтные настройки:

    Database: dxboard
    Table prefix: dx_
    Admin login: admin


    Желательно сделать немного рэндомными или оставить пустыми и добавить проверку на пустоту, чтоб пользователь заполнял при установке сам.

    ===================================

    Основные настройки с низким уровнем безопасности по дефолту.

    Желательно отключить:

    [v]Разрешать регистрироваться пользователям с повторными адресами e-mail
    [v]Разрешить незарегистрированным пользователям просматривать профили
    [v]Разрешить незарегистрированным пользователям просматривать список пользователей
    [v]Разрешить незарегистрированным пользователям просматривать список групп пользователей
    [v]Разрешить незарегистрированным пользователям просматривать онлайн-статистику
    [v]Разрешить незарегистрированным пользователям пользоваться поиском
    [v]Разрешать незарегистрированным пользователям читать чат
    [v]Разрешить модераторам менять авторов сообщений и тем

    Рекомендую добавить настройку регулировку длинны сообщения из админки. Сейчас отведено строго 150 символов на сообщение.

    ===================================

    Система контроля целостности файлов.

    Следит только за .php фалайми. Необходимо отслеживать ВСЕ файлы в каталогах.

    Мне ничто не мешает загрузить в /dxsmiles вебшелл lol.png и .htaccess с содержимым:

    HTML:
    <Files lol.png>
    AddType application/x-httpd-php .png
    </Files>
    ===================================

    ereg() NULL-byte bypass

    Движок форума на ~90% полагается в защите на ereg(),eregi() , которые не совместимы бинарно
    и потому уязвимы к нулл-байту, прекращая обработку строки при встрече с ним.

    Форум уязвим при magic_quotes=OFF.

    Необходимо заменить эти функции на preg_match().

    Например этот URL-эксплоит меняет пароль администратора:

    /lostpass.php?dat=2&code=12345678901234567890123456789012&nick=h4ck%00'+or+nick='admin'/*

    ===================================

    Движок форума потенциально уязвим к возможным новым уязвимостям,
    поскольку нет защиты от register_globals=ON что дает возможность определить неопределенные переменные,
    а также magic_quotes=OFF что дает потенциальную уязвимость к SQL-атакам.

    Рекомендуеццо сделать следующее:

    [1] Самый простой способ - положить в корень .htaccess с содержимым:
    HTML:
    # Security
    php_flag safe_mode on
    php_flag register_globals off
    php_flag magic_quotes_gpc on
    [2] Однако 1й способ не всегда работает.
    Желательно внести небольшие изменения в код:
    1) При фиксе register_globals=ON возникает проблема с сохранением админской сессии. Не разбирался почему.
    Вызвать в начале headers.php:
    PHP:
    if(@ini_get('register_globals')) run_unset();
    function 
    run_unset() {
        if ( isset(
    $_REQUEST['GLOBALS']) ) die('GLOBALS overwrite attempt detected');
        
    $nounset = array('GLOBALS''_GET''_POST''_COOKIE''_REQUEST''_SERVER''_ENV''_FILES''_SESSION''nounset','input');
        
    $input array_merge($_REQUEST$_FILES);
        foreach ( 
    $input as $k => $v )
            if ( !
    in_array($k$nounset) && isset($GLOBALS[$k]) ) {
                
    $GLOBALS[$k] = NULL;
                unset(
    $GLOBALS[$k]);
            }
    }
    2) При фиксе magic_quotes=OFF будет необходимо заменить вызовы "if(ini_get('magic_quotes_gpc')==1)" на "if(1)" в common.php, backup.php, adminmain.php
    Вызвать в начале headers.php:
    PHP:
    if (!@get_magic_quotes_gpc())
     {
      function 
    addslashes_deep($value
       {
         
    $value is_array($value) ? array_map('addslashes_deep'$value) : addslashes($value);
         return 
    $value;
       }
      
    $_GET array_map('addslashes_deep'$_GET);
      
    $_POST array_map('addslashes_deep'$_POST);
      
    $_COOKIE array_map('addslashes_deep'$_COOKIE);
      
    $_REQUEST array_map('addslashes_deep'$_REQUEST);
     }
    ===================================

    Недостаточная проверка имени файла.

    Дело в том, что файл вида lol.php.jpg в некоторых случаях обрабатывается апачем как пхп.

    В аттачах(lol.php.zip)
    /files.php
    Тоже самое с аватарами и галереей(lol.php.jpg)
    /profile.php

    ===================================

    Аттакующий, имея привилегии администратора, может загрузить вебшелл как смайл.
    Недостаточная проверка имени файла, точнее её полное отсутствие.

    Валидный смайл с шелом в EXIF-тэгах прилагается.

    /adminsmiles.php

    PHP:
          if(!copy($_FILES["sfile"]["tmp_name"],"dxsmiles/".$_FILES["sfile"]["name"]))
          {
            @
    unlink($_FILES["sfile"]["tmp_name"]);
            
    redir("<span class='err'>{$lang['txt970']}!</span>","adminsmiles.php");
          }
    ===================================

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


    Необходимо установить пароль для смены адреса сервера.

    Эксплоит прилагается в аттаче.

    /update.php

    Формат команд

    PHP:
        preg_match_all("/>>>>>EVAL<<<<<(.+)>>>>>ENDEVAL<<<<</isU",$ans,$evlist);
        
    preg_match_all("/>>>>>SQL<<<<<(.+)>>>>>ENDSQL<<<<</isU",$ans,$sqllist);
        
    preg_match_all("/>>>>>FILE<<<<<:::::(\S+):::::(.+)>>>>>ENDFILE<<<<</isU",$ans,$fllist);
    ===================================

    SQL-inj возможна для забанненого пользователя =))

    NEED: magic_quotes=OFF

    /index.php?PHPSESSID='[SQL-inj-more1row]


    PHP:
    if(!isset($PHPSESSID) && isset($_REQUEST['PHPSESSID'])) $PHPSESSID=$_REQUEST['PHPSESSID'];
    if(!isset(
    $PHPSESSID)) $PHPSESSID=session_id();

    if(!isset(
    $_SESSION['username']))
    {
      if(
    mygetcookie('username') && mygetcookie('pass'))
      {
        if(!
    ereg("[{$lang['nickletters']}]",mygetcookie('username')) && !ereg("[^a-f0-9]",mygetcookie('pass')))
          
    $result=@dbquery("select * from ".$pref."dxusers where nick='".mygetcookie('username')."' and pass='".mygetcookie('pass')."'");
        else
          
    $result=0;

        if(
    $result)
        {
          if(@
    dbnumrows($result)>0)
          {
            
    $uid=dbresult($result,0,'id');
            
    $utp=dbresult($result,0,'usertype');
            
            if((!
    checkban($uid) && @dbresult($result,0,'activated')==1) || $utp==1)
            {
              if(!@
    dbquery("delete from ".$pref."dxsessions where sess='$PHPSESSID' or uid=$uid"))
    ===================================

    Читалка файлов.
    Работает при отключенном интеллектуальном изменении изображений(по дефолту включено)

    Меню->Основные настройки->
    [ ]Применять интеллектуальное изменение размеров изображений gif, jpeg и png форматов

    /check.php?act=2&addr=../../../../../../../etc/passwd


    /check.php

    PHP:
    $act=isset($_POST['act']) ? $_POST['act'] : 0;
    if(!
    $act)
    {
      
    $act=isset($_GET['act']) ? $_GET['act'] : 0;
    }

    switch(
    $act)
    {
      case 
    '2':
        
    $addr=isset($_GET['addr']) ? $_GET['addr'] : '';
        
        if(
    get_param('imgresize')=='0')
         @
    readfile($addr);
    ===================================

     

    Attached Files:

  6. d_x

    d_x Banned

    Joined:
    25 Mar 2008
    Messages:
    558
    Likes Received:
    650
    Reputations:
    210
    Вот это супер просто, спасибо огромное! Буду патчить:)

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


    Думал над этим, но если сделать полную проверку, то замучаешься следить за загружаемыми пользователями аватарами, файлами и рисунками...


    Этот кусок наоборот за незабаненных отвечает:)


    Насчёт XSS - как раз к этому моменту нашёл ещё парочку с register_globals=on, тоже пофиксю


    А по поводу сервера обновлений - я его вообще переписать полностью думаю, а пароль на изменение добавлю.
     
    #6 d_x, 26 Apr 2008
    Last edited: 26 Apr 2008
  7. Doom123

    Doom123 Elder - Старейшина

    Joined:
    11 Nov 2006
    Messages:
    749
    Likes Received:
    244
    Reputations:
    22
    Elekt Зверь! Вот что значит человек знает своё дело +) я когда смотрел форум думал что движок не пробить а тут оказывается ...
     
  8. d_x

    d_x Banned

    Joined:
    25 Mar 2008
    Messages:
    558
    Likes Received:
    650
    Reputations:
    210
    Понял, почему сессия админская не начиналась, если фиксить register_globals. Скрипт, который вставляется в начало всех исходников, просто удалял все переменные (даже неглобальные), которые передавались из cookies. Например, удалялась переменная $_SESSION['username'], потому что $username было определено и бралось из cookies.

    Вот более правильный код:
    PHP:
    if(@ini_get('register_globals'))
    {
      if(isset(
    $_REQUEST['GLOBALS'])) die('GLOBALS overwrite attempt detected');
      
    $nounset=array('GLOBALS','_GET','_POST','_COOKIE''_REQUEST','_SERVER','_ENV','_FILES','_SESSION''nounset','input');
      
    $input=array_merge($_REQUEST,$_FILES);
      foreach(
    $input as $k=>$v)
      {
        if(!
    in_array($k,$nounset) && isset($GLOBALS[$k]))
          unset($
    $k); //удаляем ТОЛЬКО глобальную переменную. Остальные массивы типа $_SESSION не трогаем
      
    }
    }
     
    1 person likes this.
  9. d_x

    d_x Banned

    Joined:
    25 Mar 2008
    Messages:
    558
    Likes Received:
    650
    Reputations:
    210
    Ну, вроде бы всё поправил, форум снова доступен по адресу http://dxboard.ru, скачать новую версию можно тут: http://dxboard.ru/DX%20Board%202.1.13.zip

    Code:
    [2.1.13]
    -Ликвидированы SQL-инъекции в файлах login.php и headers.php при логине пользователя
    -Исправлена уязвимость чтения файлов при выключенном авто-изменении размера изображений в теге [img]
    -Добавлена защита при register_globals=on
    -Усилена проверка имён файлов и изображений пользователя при загрузке, добавлена проверка расширений изображений в галерее и аватаров
    -В инсталлаторе убраны поля по умолчанию, добавлена генерация рандомного префикса имён таблиц
    -Усилены настройки безопасности форума по умолчанию
    -Все регулярные выражения POSIX заменены на PCRE
    [new] Перезагрузка капчи по клику на ней
    -Добавлена проверка длины тем в приватных сообщениях и названий сообщений
    [new] Теперь администратор может указать максимальную длину сообщения
    [new] Теперь длинные строки без разрывов (длина указывается администратором) искусственно дополняются пробелами (HTML теги не трогаются)
    [new] Теперь для работы с обновлением форума можно задать пароль
    -Изменён движок системы обновлений форума
    -Исправлена ошибка при удалении смайлов администратором
    [new] Теперь можно выбрать контроль целостности всех файлов, или только файлов, содержащих в имени подстроку ".php"
    Скоро выложу мануал по созданию оформлений для форума и сделаю нормальный сайт с сервером обновлений
     
    #9 d_x, 27 Apr 2008
    Last edited: 27 Apr 2008
  10. Freakazoitt

    Freakazoitt Elder - Старейшина

    Joined:
    2 Jun 2008
    Messages:
    35
    Likes Received:
    1
    Reputations:
    0
    не работает капча и не показывает картинки в постах. в чем может быть проблема?
     
  11. Freakazoitt

    Freakazoitt Elder - Старейшина

    Joined:
    2 Jun 2008
    Messages:
    35
    Likes Received:
    1
    Reputations:
    0