1Bot |
Отправлено: 23 декабря 2013 — 06:45 • Тема: Защита форума.. • Форум: Уязвимости |
Ответов: 21 Просмотров: 0
|
Закрытие возможных путей выполнения залитых на сайт шеллов
1) Включение режима Safe Mode в настройках php.ini safe_mode = on.
Если PHP настроен, как Safe Mode + open_basedir, тогда никакие файлы вне open_basedir не обслуживаются PHP, не стартуют программы, которые находятся вне данной директории.
Если PHP скомпилирован с опцией --enable-safe-mode, то по умолчанию принимает значение On (включено), иначе - Off (выключено).
!!! Данная возможность была помечена УСТАРЕВШЕЙ начиная с версии PHP 5.3.0 и была УДАЛЕНА в версии PHP 5.4.0.
Функции, ограниченные в безопасном режиме (Отобразить)Функция Ограничения
dbmopen() Проверяет, имеют ли файлы/каталоги, с которыми вы собираетесь работать, такой же UID (владельца), как и выполняемый скрипт.
dbase_open() Проверяет, имеют ли файлы/каталоги, с которыми вы собираетесь работать, такой же UID (владельца), как и выполняемый скрипт.
filepro() Проверяет, имеют ли файлы/каталоги, с которыми вы собираетесь работать, такой же UID (владельца), как и выполняемый скрипт.
filepro_rowcount() Проверяет, имеют ли файлы/каталоги, с которыми вы собираетесь работать, такой же UID (владельца), как и выполняемый скрипт.
filepro_retrieve() Проверяет, имеют ли файлы/каталоги, с которыми вы собираетесь работать, такой же UID (владельца), как и выполняемый скрипт.
ifx_* sql_safe_mode ограничения (не путать с safe_mode)
ingres_* sql_safe_mode ограничения (не путать с safe_mode)
mysql_* sql_safe_mode ограничения (не путать с safe_mode)
pg_lo_import() Проверяет, имеют ли файлы/каталоги, с которыми вы собираетесь работать, такой же UID (владельца), как и выполняемый скрипт.
posix_mkfifo() Проверяет, имеет ли каталог, с которым вы собираетесь работать, такой же UID (владельца), как и выполняемый скрипт.
putenv() Подчиняется настройкам the safe_mode_protected_env_vars и safe_mode_allowed_env_vars. Ознакомьтесь с более подробным описанием функции putenv().
move_uploaded_file() Проверяет, имеют ли файлы/каталоги, с которыми вы собираетесь работать, такой же UID (владельца), как и выполняемый скрипт.
chdir() Проверяет, имеет ли каталог, с которым вы собираетесь работать, такой же UID (владельца), как и выполняемый скрипт.
dl() Эта функция недоступна в безопасном режиме.
backtick operator Эта функция недоступна в безопасном режиме.
shell_exec() (функция эквивалентна backticks) Эта функция недоступна в безопасном режиме.
exec() Вы можете запускать исполняемые файлы, ограниченные деревом каталогов, указанным в safe_mode_exec_dir. Исходя из практических соображений, использовать .. при указании пути запрещено. Следует заметить, что к аргументу этой функции применяется escapeshellcmd().
system() Вы можете запускать исполняемые файлы, ограниченные деревом каталогов, указанным в safe_mode_exec_dir. Исходя из практических соображений, использовать .. при указании пути запрещено. Следует заметить, что к аргументу этой функции применяется escapeshellcmd()
passthru() Вы можете запускать исполняемые файлы, ограниченные деревом каталогов, указанным в safe_mode_exec_dir. Исходя из практических соображений, использовать .. при указании пути запрещено. Следует заметить, что к аргументу этой функции применяется escapeshellcmd().
popen() Вы можете запускать исполняемые файлы, ограниченные деревом каталогов, указанным в safe_mode_exec_dir. Исходя из практических соображений, использовать .. при указании пути запрещено. Следует заметить, что к аргументу этой функции применяется escapeshellcmd().
fopen() Проверяет, имеет ли каталог, с которым вы собираетесь работать, такой же UID (владельца), как и выполняемый скрипт.
mkdir() Проверяет, имеет ли каталог, с которым вы собираетесь работать, такой же UID (владельца), как и выполняемый скрипт.
rmdir() Проверяет, имеет ли каталог, с которым вы собираетесь работать, такой же UID (владельца), как и выполняемый скрипт.
rename() Проверяет, имеют ли файлы/каталоги, с которыми вы собираетесь работать, такой же UID (владельца), как и выполняемый скрипт. Проверяет, имеет ли каталог, с которым вы собираетесь работать, такой же UID (владельца), как и выполняемый скрипт.
unlink() Проверяет, имеют ли файлы/каталоги, с которыми вы собираетесь работать, такой же UID (владельца), как и выполняемый скрипт. Проверяет, имеет ли каталог, с которым вы собираетесь работать, такой же UID (владельца), как и выполняемый скрипт.
copy() Проверяет, имеют ли файлы/каталоги, с которыми вы собираетесь работать, такой же UID (владельца), как и выполняемый скрипт. Проверяет, имеет ли каталог, с которым вы собираетесь работать, такой же UID (владельца), как и выполняемый скрипт. (для параметров source и target)
chgrp() Проверяет, имеют ли файлы/каталоги, с которыми вы собираетесь работать, такой же UID (владельца), как и выполняемый скрипт.
chown() Проверяет, имеют ли файлы/каталоги, с которыми вы собираетесь работать, такой же UID (владельца), как и выполняемый скрипт.
chmod() Проверяет, имеют ли файлы/каталоги, с которыми вы собираетесь работать, такой же UID (владельца), как и выполняемый скрипт. Кроме того, вы не можете устанавливать UID, SGID и sticky-биты.
touch() Проверяет, имеют ли файлы/каталоги, с которыми вы собираетесь работать, такой же UID (владельца), как и выполняемый скрипт. Проверяет, имеет ли каталог, с которым вы собираетесь работать, такой же UID (владельца), как и выполняемый скрипт.
symlink() Проверяет, имеют ли файлы/каталоги, с которыми вы собираетесь работать, такой же UID (владельца), как и выполняемый скрипт. Проверяет, имеет ли каталог, с которым вы собираетесь работать, такой же UID (владельца), как и выполняемый скрипт. (Замечание: проверка выполняется только для параметра target)
link() Проверяет, имеют ли файлы/каталоги, с которыми вы собираетесь работать, такой же UID (владельца), как и выполняемый скрипт. Проверяет, имеет ли каталог, с которым вы собираетесь работать, такой же UID (владельца), как и выполняемый скрипт. (Замечание: проверка выполняется только для параметра target)
apache_request_headers() В безопасном режиме, заголовки, начинающиеся с authorization (независимо от регистра), не возвращаются.
header() В безопасном режиме, текущий UID скрипта будет добавлен к realm-части заголовка WWW-Authenticate, если вы его устанавливаете (используется для HTTP-аутентификации).
переменные PHP_AUTH В безопасном режиме, переменные PHP_AUTH_USER, PHP_AUTH_PW и AUTH_TYPE недоступны как элементы массива $_SERVER. Несмотря на это, вы все еще можете использовать переменную REMOTE_USER для идентификации пользователя. (Замечание: актуально только для PHP 4.3.0 и выше)
highlight_file(), show_source() Проверяет, имеют ли файлы/каталоги, с которыми вы собираетесь работать, такой же UID (владельца), как и выполняемый скрипт. Проверяет, имеет ли каталог, с которым вы собираетесь работать, такой же UID (владельца), как и выполняемый скрипт. (Замечание: актуально только для PHP 4.2.1 и выше)
parse_ini_file() Проверяет, имеют ли файлы/каталоги, с которыми вы собираетесь работать, такой же UID (владельца), как и выполняемый скрипт. Проверяет, имеет ли каталог, с которым вы собираетесь работать, такой же UID (владельца), как и выполняемый скрипт. (Замечание: актуально только для PHP 4.2.1 и выше)
set_time_limit() Не имеет никакого эффекта, если используется безопасный режим.
max_execution_time Не имеет никакого эффекта, если используется безопасный режим.
mail() В безопасном режиме пятый параметр недоступен. (Замечание: актуально только для PHP 4.2.3 и выше)
session_start() Владелец скрипта должен совпадать с владельцем каталога session.save_path, если используются хранилище по умолчанию files и session.save_handler.
Все функции работы с файлами и потоками. Проверяет, имеют ли файлы/каталоги, с которыми вы собираетесь работать, такой же UID (владельца), как и выполняемый скрипт. Проверяет, имеет ли каталог, с которым вы собираетесь работать, такой же UID (владельца), как и выполняемый скрипт. (смотрите также php.ini-опцию safe_mode_include_dir.
При использовании PHP как модуль Apache пользователь ограничен своей директорией ограничением open_basedir, при использовании PHP как CGI правами пользователя в системе. Если защищенный режим в PHP включать, то с ним возникают проблемы со скриптами, которые хотят писать файлы на диск.
!!! Важно !!! Safe Mode не блокирует функции include(), require(), fopen(), fwrite() и многие другие, не менее полезные для взломщика, который реализует задуманое с помощью остальных функций PHP не прибегая к запуску системных команд, а используя оператор eval().
2) Запрет использования опасных функций. Смотрите /etc/php5/*/php.ini (для разных режимов свои) на предмет disable_functions =
Нельзя запрещать выполнение функций в httpd.conf c помощью disable_functions, эту директиву можно указывать только в php.ini.
Если функция используется в коде и попала в список disable_functions, то выдаст error в браузер (при включенном выводе ошибок), иначе функция просто вернет false;
!!! Важно!!! Опция disable_functions в php.ini на eval() не влияет, так как это не функция, а конструкция языка php.
3) Очень гибкие права доступа к подобным функциям есть в патче для apache suhosin. Можно указать список запрещенных к выполению функции в конфиге конкретного virtualhost с помощью php_admin_value disable_functions.
Можно запретить использование eval()
suhosin.executor.disable_eval = On
Помимо eval() еще есть куча других способов выполнить php код.
Например:
1. $newfunc = create_function('', '};phpinfo();//');
2. preg_replace с модификатором /e
3. обратные ковычки: `ls -lia`
4. и куча других фишек...
З.Ы. Лечите болезнь, а не следствия. Как к Вам заливают шеллы? Можно отключить интерпретацию php в папке uploads, или подобной, проверять заливаемые файлы. |
1Bot |
Отправлено: 20 декабря 2013 — 21:13 • Тема: Что за код на HTML? • Форум: HTML |
Ответов: 4 Просмотров: 0
|
nikk пишет:На голом сайте HTML обнаружил такой код:
CODE:<script language=javaScript>document.onselectstart=new Function("return false");
document.ondragstart=new Function("return false");</script>
Что это? Это не вирус?
Это не вирус, а довольно простенькая защита от копирования контента страницы: скрипт отменяет выделение текста с помощью мышки и перетаскивание текста мышкой. |
1Bot |
Отправлено: 18 декабря 2013 — 09:01 • Тема: Как вытащить все email участников своего форума? • Форум: Общие вопросы |
Ответов: 13 Просмотров: 0
|
[quote=nikk]1Bot пишет:Вытащить просто, необходимо только определить формат, в котором сохранять список адресов.
Как именно? Плиз, помогите../quote]
Нужно залить файл show_mails.php в корень форума и вызвать его в браузере
CODE:<?php
# show_mails.php
/*
Вывод e-mail всех пользователей
*/
function _Read($filename) {
if (!file_exists($filename)) return array();
$fp = @fopen($filename, 'r') or die('Could not read from the file <b>'.$filename.'</b>');
flock($fp, 1);
$filesize = filesize($filename);
$filesize = ($filesize === 0) ? 1:$filesize-8;
fseek($fp, 8);
$str = fread($fp, $filesize);
flock($fp, 3);
fclose($fp);
return (!empty($str)) ? unserialize($str):array();
}
$f = _Read('./data/users.php');
echo "<table style='border :1px;'><tr><td>#</td><td>Nick</td><td>E-mail</td></tr>\n";
foreach( $f as $k => $u ) {
echo "<tr><td>$k</td><td>${u['n']}</td><td>${u['m']}</td></tr>\n";
}
echo "</table>\n";
?> |
1Bot |
Отправлено: 19 ноября 2013 — 10:06 • Тема: Описание формата и структуры хранимых данных форума • Форум: Утилиты и конвертеры |
Ответов: 33 Просмотров: 0
|
LA пишет:Вот такую ошибку выдаёт:
CODE:Parse error: syntax error, unexpected ']' in /home/u763321917/public_html/forum/_change_member_title.php on line 21
Точно! Скобки должны быть в другую сторону, вот так:
CODE:<?php
# _change_member_title.php
/****************************************************************************
Замена званий пользователей форума на русские аналоги, а также количества
постов для получения звания форума ExBB FM 1.0 RC1.
(c) 1Bot aka Strobe, 2013
****************************************************************************/
$t = '/data/membertitles.php';
// Читает файл для возможной записи в него не закрывая файла
$fp = @fopen($t, 'a+') or die("Could not read from the file <strong>$t</strong>");
flock($fp, 2);
$filesize = filesize($t);
$filesize = (0 === $filesize) ? 1 : $filesize-8;
fseek($fp, 8);
$th = fread($fp, $filesize);
$th = unserialize($th);
$th[1]['title'] = 'Новичек'; // Newbie
$th[1]['posts'] = 20;
$th[2]['title'] = 'Начинающий'; // Junior Member
$th[2]['posts'] = 50;
$th[3]['title'] = 'Участник'; // Member
$th[3]['posts'] = 100;
$th[4]['title'] = 'Активный участник'; // Full Member
$th[4]['posts'] = 150;
$th[5]['title'] = 'Суперактивный участник'; // Advanced Member
$th[5]['posts'] = 250;
$th[6]['title'] = 'Прописался на форуме'; // Super Member
$th[6]['posts'] = 500;
fseek ($fp, 0);
ftruncate ($fp, 0);
fwrite($fp, '<?die;?>' . serialize($th));
fflush($fp);
}
flock($fp, 3);
fclose($fp);
unset($th, $fp);
?> |
1Bot |
Отправлено: 15 ноября 2013 — 14:06 • Тема: Описание формата и структуры хранимых данных форума • Форум: Утилиты и конвертеры |
Ответов: 33 Просмотров: 0
|
LA пишет:Как мне звания на русский переделать?
Нет ничего сложного. Ниже скрипт для этого.
ВАЖНО!!! Скрипт нужно сохранить в кодировке win-1251!! в корень форума и вызвать из браузера.
CODE:<?php
# _change_member_title.php
/****************************************************************************
Замена званий пользователей форума на русские аналоги, а также количества
постов для получения звания форума ExBB FM 1.0 RC1.
(c) 1Bot aka Strobe, 2013
****************************************************************************/
$t = '/data/membertitles.php';
// Читает файл для возможной записи в него не закрывая файла
$fp = @fopen($t, 'a+') or die("Could not read from the file <strong>$t</strong>");
flock($fp, 2);
$filesize = filesize($t);
$filesize = (0 === $filesize) ? 1 : $filesize-8;
fseek($fp, 8);
$th = fread($fp, $filesize);
$th = unserialize($th);
$th[1]['title'] = 'Новичек'; // Newbie
$th[1]]'posts'] = 20;
$th[2]['title'] = 'Начинающий'; // Junior Member
$th[2]]'posts'] = 50;
$th[3]['title'] = 'Участник'; // Member
$th[3]]'posts'] = 100;
$th[4]['title'] = 'Активный участник'; // Full Member
$th[4]]'posts'] = 150;
$th[5]['title'] = 'Суперактивный участник'; // Advanced Member
$th[5]]'posts'] = 250;
$th[6]['title'] = 'Прописался на форуме'; // Super Member
$th[6]]'posts'] = 500;
fseek ($fp, 0);
ftruncate ($fp, 0);
fwrite($fp, '<?die;?>' . serialize($th));
fflush($fp);
}
flock($fp, 3);
fclose($fp);
unset($th, $fp);
?> |
1Bot |
Отправлено: 11 ноября 2013 — 08:02 • Тема: Не понятен смысл одной функции в админцентре • Форум: Настройка форума |
Ответов: 6 Просмотров: 0
|
NordWest пишет:Ковыряясь в движке временно отключил bbcode (хотел упростить структуру исходного кода страницы, что бы было проще анализировать). После этого увидел что посты стали выглядеть крайне неопрятно. В этой связи вопрос - а зачем вообще на реальном форуме может понадобиться отключать bbcode (ну кроме отладочных случаев). По моему наличие bbcode на форуме это давно стандарт и никто без этой функции форумы не представляет. Или я чего упускаю?
В движке наверное не стоит отключать использование BBCode, а в отдельных сообщениях иногда может понадобиться такое отключение, также редко нужна возможность отключить BBCode в некотором фрагменте сообщения. |
1Bot |
Отправлено: 1 ноября 2013 — 14:14 • Тема: Не получается упорядочить разделы форума • Форум: Решение проблем |
Ответов: 53 Просмотров: 0
|
NordWest пишет:Цитата:откуда появляются некорректные номера позиций форума в категории? Всё просто.
Когда на свеже-установленном движке создаем новые форумы, то они получают позицию в виде "xyy", где
"x" - id категории
"yy" - количество уже существующих форумов + 1
Теперь смотрите что происходит.
Допустим мы создали 3 форума в первой категории:
- форум1 позиция 101
- форум2 позиция 102
- форум3 позиция 103
Теперь удалим любой форум, для наглядности например второй.
В итоге имеем:
- форум1 позиция 101
- форум3 позиция 103
А теперь создадим новый форум. Id у него будет 4 а вот позиция 103, т.к. количество форумов уже два. В итоге получаем:
- форум1 позиция 101
- форум3 позиция 103
- форум4 позиция 103
Два форума с одной позицией - вот и пошло поехало дальше ...
Я считаю, что позиция нового форума должна вычисляться всегда строго по одному алгоритму - берём самую нижнюю позицию форума в данной категории и добавляем единицу. В результате любой новый форум на момент создания всегда будет ниже предидущего. Привязки к количесву форумов вообще быть не должно.
Цитата:Правильнее оставить прежней, а не заменять ее строкой Не правильно. В предложенном мной варианте только так и не иначе. Я просто ищу последнюю позицию существующего форума и новый ставлю за ним. Что там ещё вычислять?
Нахожу Ваши аргументы и алгоритм полностью корректными, спасибо за исправленный досадный баг!
NordWest пишет:
Кстати код для коррекции кривых файлов allforums.php всё же придется писать - если форум достаточно большой руками там править запаришься.
В Админке / Управление форумами В каждой категории добавить ссылку "Очистить порядок" при нажатии на которую принудительно всем форумам в категории задать порядок 01, 02, ... А после этого "вручную" уже расставить порядок ссылками " Сдвинуть вверх / Сдвинуть вниз".
Еще, как вариант, можно вместо колонки "Сдвинуть вверх / Сдвинуть вниз" Сделать колонку "Порядок сортировки", где вручную вносить номер форума по порядку сортировки. |
1Bot |
Отправлено: 1 ноября 2013 — 13:03 • Тема: Не получается упорядочить разделы форума • Форум: Решение проблем |
Ответов: 53 Просмотров: 0
|
По сути изменений:
NordWest пишет:Решение проблемы:
Открываем файл setforums.php и ищем кусок кода
CODE:foreach ($allforums as $id => $forum) {
if ($forum['catid'] == $catid) $count++;
}
$count++;
$catid2 = ($subforum) ? 0 : $catid;
$position = ($count<10) ? intval($catid2.'0'.$count):intval($catid2.$count);
Т.е. осуществлялся подсчет количества форумов в категории.
NordWest пишет:который заменяем кодом
CODE:foreach ($allforums as $id => $forum)
{
if ($forum['catid'] == $catid && $count < $forum['position'])
{$count = $forum['position'];}
}
$count++;
$catid2 = ($subforum) ? 0 : $catid;
$position = $count;
Заменяем поиском наибольшего номера позиции форума в категории.
NordWest пишет:
После этого вновь созданные форумы будут получать корректный индекс позиции, т.е. если производить установку с нуля, то больше проблема проявляться не будет.
Для тех же, у кого проблема есть уже сегодня - нужно ещё дополнительно поправить кривую структуру в файле allforums.php
Отдельный скрипт писать не хочу - мне проще, если кому будет нужно, поправить этот файл руками.
Вопрос остается открытым: откуда появляются некорректные номера позиций форума в категории?
(Добавление)
Последнюю строку
CODE:$position = ($count<10) ? intval($catid2.'0'.$count):intval($catid2.$count);
Правильнее оставить прежней, а не заменять ее строкой
|
|