Безопастность CNSTATS

Статус
В этой теме нельзя размещать новые ответы.

bucharest

Писатель
Регистрация
30 Июл 2007
Сообщения
1
Реакции
0
Я бы хотел спросить, что вы думаете по поводу безопасности CNSTATS? Несколько раз слышал что именно через нее сломали сервер людам :(

Заранее спасибо за ответы.
 
В 2.12 дыр очень много, причем об этом говорит даже cn-software. Выдают ключики бесплатно тем у кого кончилась лицензия. Но говорят, что даж там не все пофиксили.
Тут человек находил:
- фаил /export/exp_n_print.php?st= // локальный инклайд(если мэджик квотес выключены + просмотр статистики без пароля)
- многие файлы в папке /reports/
/reports/help.php?from=XSS
/reports/who_c.php?bo=phpinc
/reports/ipinfo.php?rid=SQLing
и еще если поискать то дофига найдется
- если есть возможность залить файл в /lang/ то можно и его инклюдить через js.php?language=

если закрыт доступ к файлам то можно сделать так:
создать сайт на народе, сдублировать его сайт, вставить туда ифрейм с src=site.ru/cnstats/export/exp_n_print.php?st=ipinfo&rid=SQLing
 
А можно попросить тебя потестить 2.13 ?
 
Скрипт для увеличения безопасности cnstats

Друзья, представляю вашему вниманию скрипт, который должен, по моему мнению, улучшить безопасность cnstats.
К его написанию, в первую очередь, меня подтолкнула моя нелюбовь к тому, чтобы скрипты с кодом лежат в том же месте, куда имеет доступ пользователь. Кроме того, меня насторожили сообщения о том, что cnstats дыряв. Предлагаю обсудить адекватность представленного мной скрипта, для увеличения безопасности cnstats.
Кроме того доступ к статистике имеет толко определенный список ip адресов - этот функционал отслеживает класс class.OwnerIPs.php - простой как три копейки, в связи с чем его здесь не привожу
Работа скрипта отлаживалась на версии CNStats STD 2.13 представленного здесь.
Для корректной работы требуется установка переменной $STATS_CONF["cnstats_http_path"] самого cnstats.
Как это выглядит у меня, относительно корня проекта:
В папке outsourceing/cnstats – лежит сам cnstats
Папка htdocs – это веб корень проекта доступный по адресу httр://domen.ru
В папке htdocs/stat/ - лежит моя оболочка представленная ниже.
PHP:
<?php
/**
 * скрипт перекидывающий показ статистики из корня
 */
chdir(dirname(__FILE__));
chdir('../..');
/**
 * место где находится скрипт статистики на самом деле 
 */
DEFINE('CN_SOURCE_LOCATION','outsourceing/cnstats/');
/**
 * где он должен находится относительно корня на веб 
 */
DEFINE('CN_WEB_LOCATION','stat');
require_once 'common/General/class.OwnerIPs.php';
$ownerIPs = new OwnerIPs();
$alesGut=false;
$debug = false;
if (preg_match('/^\/'.CN_WEB_LOCATION.'\/cntc\.php.*$/',$_SERVER['REQUEST_URI']) || $ownerIPs->checkIP($_SERVER['REMOTE_ADDR'])) 
{
    if ($debug)
        $handle = fopen('logs/stat_soft_requirer.log','a+');
    if ($debug)
        fwrite($handle,"request: ".$_SERVER['REQUEST_URI']."\n");
    /**
     * Затычка возвращающая GET в норму 
     */
    if (preg_match('/([^?]*)$/',$_SERVER['REQUEST_URI'],$match))
    {
        $params = explode("&",$match[1]);
        foreach ($params  as $_value)
        {
            list($key,$value) = split('=',$_value);
            $_GET[$key]=urldecode($value);
        }
    }
    if ($debug)
        fwrite($handle,"get: ".var_export($_GET,true)."\n");
    chdir(CN_SOURCE_LOCATION);
    $req = $_SERVER['REQUEST_URI'];
    if (preg_match('/^\/'.CN_WEB_LOCATION.'\/index\.php\??(.*)$/',$req,$match))
    { 
        if ($debug)
        {
            fwrite($handle,"index.php\n");
            fwrite($handle,"params: ".$match[1]."\n");
        }
        $_SERVER["QUERY_STRING"]=$match[1];
        require_once('index.php');
        $alesGut=true;
    } elseif (preg_match('/^\/'.CN_WEB_LOCATION.'\/(.*\.php)\??(.*)$/',$req,$match) )
    { 
        $file = $match[1];
        if ($debug)
        {
            fwrite($handle,"open: ".$match[1]."\n");
            fwrite($handle,"params: ".$match[2]."\n");
        }
        $_SERVER["QUERY_STRING"]=$match[2];
        $_returnToRoot = false;
        if (preg_match('/^\/'.CN_WEB_LOCATION.'\/([^\/]*)\/(.*\.php)\??(.*)$/',$req,$match) )
        { 
            if ($debug)
            {
                fwrite($handle,"chdir: ".$match[1]."\n");
                fwrite($handle,"open: ".urldecode($match[2])."\n");
            }
            if (file_exists($match[1]))
            {
                chdir($match[1]);
                $file = urldecode($match[2]);
            }
            $_returnToRoot = true;
        }
        if (file_exists($file))
        {
            require_once($file);
            $alesGut=true;
        }
        if ($_returnToRoot)
        {
            chdir('..');
        }
    } elseif (strstr($_SERVER['REQUEST_URI'],'css'))
    { 
         if ($debug)
            fwrite($handle,"css\n");
        if (file_exists('cnstats.css'))
        {
            readfile('cnstats.css');
            $alesGut=true;
        }
    } elseif (preg_match('/^\/'.CN_WEB_LOCATION.'\/img\/(.*\.gif)$/',$req,$match))
    { 
         if ($debug)
            fwrite($handle,$match[1]."\n");
        if (file_exists(urldecode('img/'.$match[1])))
        {
           readfile(urldecode('img/'.$match[1]));
           $alesGut=true;
        }
    } else 
    { 
        require_once('index.php');
        $alesGut=true;
    }
    if ($debug)
        fwrite($handle,"\n");
}
if (!$alesGut)
{
    header("HTTP/1.0 404 Not Found");
    header("Location: ../index.html"); 
}
?>
Содержимое .htaccess папки stat
HTML:
RewriteEngine on
RewriteRule ^.htaccess$ - [F]
RewriteRule ^(.*)$ index.php?$1 [L]
RewriteRule ^(img\/.*)?$ index.php [L]
<IfModule mod_php4.c>
    php_flag session.use_trans_sid off
    php_value register_globals off
</IfModule>
<IfModule mod_php5.c>
    php_flag session.use_trans_sid off
    php_value register_globals off
</IfModule>
<IfModule mod_security.c>
SecFilterCheckURLEncoding Off
</IfModule>

Господа, отпишите хотябы в личку, помог этот скрипт или нет?
 
а может просто запаролить папку со статитстикой с помощью .htpasswd ???

правда тогда придется использывать счетчик только PHP-Include (
 
а может просто запаролить папку со статитстикой с помощью .htpasswd ???
правда тогда придется использывать счетчик только PHP-Include (
Такой вариант уже здесь обсуждался, в другой ветке (h**p://www.nulled.ws/showthread.php?t=18169) и как ты совершенно верно заметил он накладывает определенные ограничения.
Предложенный мной вариант, позволяет ограничить доступ не только по ip адресам, но и добавить http авторизацию. Конкретную реализацию пока не приведу, так как у себя еще не дошел до этого, но будет позже.
Проверка будет стандартная, в сессии будет хранится два ключа: логин пользователя и некий хеш - если с ними все ок, показываем статистику, если нет, переадресуем на корень сайта.
При такой реализации, пользователь авторизируется только в админской панели. В админке добавляем ссылку на статистику, ткнув на которую заходим в статистику минуя авторизацию cnstats. Для этого необходимо будет установить свойство cnstats disablepassword в yes.

p.s. Если скрестить мой скрипт с о скриптом, который приведен в вышеупомянутой ветке, получится то, что я описал.
 
Да CNStats ацтой...
установил без проблем, но дыр у него ужас как много. Вчера захожу на свой сайт и NOD32 выдаёт что там троян :read: Да ещё и ничего не отображалось (картинки, текст). Пришлось убрать его. :confused:
 
Да CNStats ацтой...
установил без проблем, но дыр у него ужас как много. Вчера захожу на свой сайт и NOD32 выдаёт что там троян :read: Да ещё и ничего не отображалось (картинки, текст). Пришлось убрать его. :confused:
Кривые руки ацтой, а не CNStats, говоришь дыры - давай фрагменты кода - народ поправит ... а по поводу трояна, поменяй пароль к ftp и почисти от бяк.
 
Кривые руки ацтой, а не CNStats, говоришь дыры - давай фрагменты кода - народ поправит ... а по поводу трояна, поменяй пароль к ftp и почисти от бяк.

CNStats я скачал отсюда самую последню версию, установил как положено и написано в readme (не у меня кривые руки а тот кто писал readme получаеТся.). Примерно около месяца всё было отлично, а вчера зашол и такая бяка. Как его удалил, всё снова заработало. А пароли я поменял сразу.
 
  • Заблокирован
  • #10
Вопрос. Как много места она сжирает под логи и вообше насколько сильно она грузит сервер и можно ли её поставить на шеред хост ??
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху