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

Тема в разделе "CNStats", создана пользователем bucharest, 7 авг 2007.

Статус темы:
Закрыта.
  1. bucharest

    bucharest Писатель

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

    Заранее спасибо за ответы.
     
  2. InoffLine

    InoffLine

    Регистр.:
    18 апр 2007
    Сообщения:
    573
    Симпатии:
    155
    В 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
     
  3. ArchyMFR

    ArchyMFR Прохожие

    А можно попросить тебя потестить 2.13 ?
     
  4. nnmkayf

    nnmkayf

    Регистр.:
    25 июл 2007
    Сообщения:
    153
    Симпатии:
    98
    Скрипт для увеличения безопасности cnstats

    Друзья, представляю вашему вниманию скрипт, который должен, по моему мнению, улучшить безопасность cnstats.
    К его написанию, в первую очередь, меня подтолкнула моя нелюбовь к тому, чтобы скрипты с кодом лежат в том же месте, куда имеет доступ пользователь. Кроме того, меня насторожили сообщения о том, что cnstats дыряв. Предлагаю обсудить адекватность представленного мной скрипта, для увеличения безопасности cnstats.
    Кроме того доступ к статистике имеет толко определенный список ip адресов - этот функционал отслеживает класс class.OwnerIPs.php - простой как три копейки, в связи с чем его здесь не привожу
    Работа скрипта отлаживалась на версии CNStats STD 2.13 представленного здесь.http://www.nulled.ws/showthread.php?t=22976
    Для корректной работы требуется установка переменной $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>
    Господа, отпишите хотябы в личку, помог этот скрипт или нет?
     
    mazaxaker и tonagra нравится это.
  5. AchiLLeSS

    AchiLLeSS

    Регистр.:
    13 дек 2006
    Сообщения:
    841
    Симпатии:
    415
    а может просто запаролить папку со статитстикой с помощью .htpasswd ???

    правда тогда придется использывать счетчик только PHP-Include (
     
  6. nnmkayf

    nnmkayf

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

    p.s. Если скрестить мой скрипт с о скриптом, который приведен в вышеупомянутой ветке, получится то, что я описал.
     
  7. Diablos86

    Diablos86 Писатель

    Регистр.:
    15 июл 2007
    Сообщения:
    9
    Симпатии:
    0
    Да CNStats ацтой...
    установил без проблем, но дыр у него ужас как много. Вчера захожу на свой сайт и NOD32 выдаёт что там троян :read: Да ещё и ничего не отображалось (картинки, текст). Пришлось убрать его. :confused:
     
  8. KPOWKA

    KPOWKA Постоялец

    Регистр.:
    31 янв 2007
    Сообщения:
    104
    Симпатии:
    120
    Кривые руки ацтой, а не CNStats, говоришь дыры - давай фрагменты кода - народ поправит ... а по поводу трояна, поменяй пароль к ftp и почисти от бяк.
     
  9. Diablos86

    Diablos86 Писатель

    Регистр.:
    15 июл 2007
    Сообщения:
    9
    Симпатии:
    0
    CNStats я скачал отсюда самую последню версию, установил как положено и написано в readme (не у меня кривые руки а тот кто писал readme получаеТся.). Примерно около месяца всё было отлично, а вчера зашол и такая бяка. Как его удалил, всё снова заработало. А пароли я поменял сразу.
     
  10. ynetshare

    ynetshare Читатель

    Заблокирован
    Регистр.:
    9 авг 2007
    Сообщения:
    7
    Симпатии:
    0
    Вопрос. Как много места она сжирает под логи и вообше насколько сильно она грузит сервер и можно ли её поставить на шеред хост ??
     
Статус темы:
Закрыта.