Спасибо всем, кто тестил и нашёл ошибки в движке, а я выкладываю его исходники, как и обещал. Скачать можно тут: 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 Жду ваших мнений
preg_match("/^(\d)+$/",$uid) === is_numeric думаю хорошо бы было еслиб ты раставил все фалы по папкам как в ВБ и можно также сделать перaиксы для файлов .. типо function_db.php
Ну, is_numeric в общем то не совсем то же, что и preg_match("/^(\d)+$/",$uid), так как is_numeric возвратит true, если передать, например, число 0.123, или -123, или 5e10, или даже 0xFF. А регулярка только цифры пропускает. Да, исходники не в лучшем виде, как я и говорил, но если сейчас начать файлы сортировать и переименовывать - то это наверняка будет куча ошибок, они же друг на друга ссылаются многие.
Результаты проверки на безопасность. Тестирование на 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); ===================================
Вот это супер просто, спасибо огромное! Буду патчить Админская сессия сбрасывается после просмотра сообщений, поиска, чтения приватных сообщений и т.д. Это сделано для того, чтобы админ случайно не нажал на подсунутую левую ссылку и не произвёл так что-нибудь плохое в админке. Думал над этим, но если сделать полную проверку, то замучаешься следить за загружаемыми пользователями аватарами, файлами и рисунками... Этот кусок наоборот за незабаненных отвечает Насчёт XSS - как раз к этому моменту нашёл ещё парочку с register_globals=on, тоже пофиксю А по поводу сервера обновлений - я его вообще переписать полностью думаю, а пароль на изменение добавлю.
Elekt Зверь! Вот что значит человек знает своё дело +) я когда смотрел форум думал что движок не пробить а тут оказывается ...
Понял, почему сессия админская не начиналась, если фиксить 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 не трогаем } }
Ну, вроде бы всё поправил, форум снова доступен по адресу 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" Скоро выложу мануал по созданию оформлений для форума и сделаю нормальный сайт с сервером обновлений
капча не работает! картинки не кажет!!! помогите!!! где что надо прописать??? http://fallout.ex6.ru/forum/register.php