Как правильно экплаутировать?

Discussion in 'Песочница' started by guest3297, 9 Nov 2007.

  1. guest3297

    guest3297 Banned

    Joined:
    27 Jun 2006
    Messages:
    1,246
    Likes Received:
    639
    Reputations:
    817
    Есть код интересует exec.
    И откуда берется переменная __FILE__ ?
    PHP:
    <?
    if(
    array_key_exists('config',$_GET)){

        
    $source '<?'."\n";
        
    $source .= '$SDATA[\'THEME\']  = \''.$_GET['theme'].'\';'."\n";
        
    $source .= '$SDATA[\'SUPPORT-MAIL\'] = \''.$_GET['sem'].'\';'."\n";
        
    $source .= '$SDATA[\'SUPPORT-HOST\'] = \''.$_GET['sh'].'\';'."\n\n";

        
    $source .= '$SDATA[\'PRICE_MODIFIER\'][\'default\'] = '.$_GET['pr'].';'."\n";
        
    $source .= '$SDATA[\'USE_FREE_VIAGRA_PILLS\'] = true;'."\n";
        
    $source .= '$SDATA[\'USE_REWRITE_URLS\'] = true;'."\n";
        
    $source .= '?>';
        
    //mkdir(dirname(__FILE__).'/_cnf/'.$_GET['url'],0777);
        
    if($fp = @fopen(dirname(__FILE__).'/_cnf/unknown/config.inc','w')){
            
    fwrite($fp,$source);
            
    fclose($fp);
            die(
    'OK:-:');
        }
        else die(
    'ERROR:-:writeconfig');
    }
    else{
        
    $CMD = array();
        include_once 
    dirname(__FILE__).'/cmd.php';
        
    $cnt count($CMD);
        for(
    $i=0;$i<$cnt;$i++){
            
    exec($CMD[$i],$out,$res);
            if((
    $CMD[$i] != 'chmod -R 777 ./_cnf') && ($CMD[$i] != 'chmod -R 777 ./var'))
            if(
    $res != 0) die('ERROR:-:'.$CMD[$i]);
        }
    }
    ?>
     
  2. gibson

    gibson Elder - Старейшина

    Joined:
    24 Feb 2006
    Messages:
    391
    Likes Received:
    247
    Reputations:
    88
    у тебя эта строчка закоментированна
    //mkdir(dirname(__FILE__).'/_cnf/'.$_GET['url'],0777);
    создает директорию, где dirname это директория на хосте, __FILE__ скорее всего это какая то константа, дальше еще одна папка и файл, и выставляются чмоды.
    Из манов:
    mkdir ("/path/to/my/dir", cmod);

    У тя где то в скриптах должно быть такое
    define ("_FILE_", "samehit.php");
     
  3. inv

    inv Banned

    Joined:
    3 Aug 2007
    Messages:
    261
    Likes Received:
    143
    Reputations:
    -58
    http://php.ru.manual.osdevel.com/language.constants.predefined.html
     
    1 person likes this.
  4. guest3297

    guest3297 Banned

    Joined:
    27 Jun 2006
    Messages:
    1,246
    Likes Received:
    639
    Reputations:
    817
    Еще раз интересует exec()
     
  5. FraiDex

    FraiDex Elder - Старейшина

    Joined:
    16 Jun 2006
    Messages:
    193
    Likes Received:
    68
    Reputations:
    -11
    я думаю из [DOCUMENT_ROOT]
    вот например при открытии файла
    if($fp = @fopen(dirname(__FILE__).'/_cnf/unknown/config.inc','w'))
    имя каталога она берёт из _FILE_ потом добавляет адрес нужного файла.
     
  6. gemaglabin

    gemaglabin Green member

    Joined:
    1 Aug 2006
    Messages:
    772
    Likes Received:
    842
    Reputations:
    1,369
    C exec ты ничего не поделаешь зато в конфиг можешь записать php код . config=1&theme=';eval($_REQUEST['c']);# если конечно ковычки не эскейпятся
     
    #6 gemaglabin, 9 Nov 2007
    Last edited: 9 Nov 2007
    1 person likes this.
  7. ZaCo

    ZaCo Banned

    Joined:
    20 Jun 2005
    Messages:
    737
    Likes Received:
    336
    Reputations:
    215
    2gibson это предопределенная интепретатором константа.

    >> include_once dirname(__FILE__).'/cmd.php';
    ну мы же не знаем чего в cmd.php находится, а там как раз и идет определение массива $cmd.

    зы я бы на твоем месте смотрел, что у нас в первом if идет)
    зыы ужасные исходники
     
    1 person likes this.
  8. groundhog

    groundhog Elder - Старейшина

    Joined:
    12 May 2007
    Messages:
    1,159
    Likes Received:
    425
    Reputations:
    180
    [ cash ], константа __FILE__ является одной из предопределённых констант и всегда резолвится в полный путь до текущего файла, т.е. в нашем случае данная константа резолвится в полный путь к этому бажному скрипту. Что касается exec - в данном случае мы ничего поделать не можем, т.к. единственный параметр, который содержит выполняемую команду это $CMD и он обнуляется ($CMD = array()) перед использованием. Как правильно заметил Гема, в данном случае единственное само-собой напрашивающее действие - проинжектить параметры и прописать в конфиг свой php-код. То есть уязвимые параметры у нас: theme, sem, sh, pr. Можно использовать любой из них. Единственное - если на серваке включены magic_quotes это может обернуться для нас проблемой и лишит ряда удобств. Вот пример вызова этого скрипта:

    Обрати внимание, я использовал параметр pr, т.к. в конфиге его значение не обрамляется кавычками.
     
    1 person likes this.
  9. guest3297

    guest3297 Banned

    Joined:
    27 Jun 2006
    Messages:
    1,246
    Likes Received:
    639
    Reputations:
    817
    В cmd.php и есть масив с командами.

    PHP:
    <?
    $CMD[] = 'rm -Rf ./core';
    $CMD[] = 'rm -Rf ./data';
    $CMD[] = 'rm -Rf ./themes';

    $CMD[] = 'rm -Rf ./thumbs';
    $CMD[] = 'rm -Rf ./temp';
    $CMD[] = 'rm -Rf ./var';
    ?>
    Да токо пишеться inc файл...

    Тоесть как я понял внедрить в массив CMD свою команду не реально?

    И сам конфиг не куда не инклудиться... он всего лишь остаток скрипта который забыли удалить...
     
    #9 guest3297, 9 Nov 2007
    Last edited: 9 Nov 2007
  10. groundhog

    groundhog Elder - Старейшина

    Joined:
    12 May 2007
    Messages:
    1,159
    Likes Received:
    425
    Reputations:
    180
    Ну ничто не мешает открыть конфиг тебе, если парсится расширение inc и он доступен через веб. В массив CMD влезть нереально, так как он жёстко забит в файле и нету никакого интерфейса общения с ним.
     
  11. Scipio

    Scipio Well-Known Member

    Joined:
    2 Nov 2006
    Messages:
    733
    Likes Received:
    544
    Reputations:
    190
    [QUOTE='[ cash ]Тоесть как я понял внедрить в массив CMD свою команду не реально?[/QUOTE]

    Еслиб не было строчки $CMD = array();
    и был бы register_globals? тогда можно было бы, а так нет
     
    1 person likes this.
  12. guest3297

    guest3297 Banned

    Joined:
    27 Jun 2006
    Messages:
    1,246
    Likes Received:
    639
    Reputations:
    817
    Ну приведи пример... будет интересно лично мне.
     
  13. Scipio

    Scipio Well-Known Member

    Joined:
    2 Nov 2006
    Messages:
    733
    Likes Received:
    544
    Reputations:
    190
    ну там массив CMD - список (автомассив)

    если в $_request добавить CMD[]="ls -la";

    то это значение попадет в массив, а так ка там в exec пердается весь массив, то и твоя комманда выполнится
    а тут $CMD = array(); - его обнуляет

    (помоему так или просто невыспалсяч)
     
    #13 Scipio, 9 Nov 2007
    Last edited: 9 Nov 2007
  14. gibson

    gibson Elder - Старейшина

    Joined:
    24 Feb 2006
    Messages:
    391
    Likes Received:
    247
    Reputations:
    88
    2[ cash ] ты задал вопрос
    я тебе ответил, минус поставлен не заслуженно.
    Как правильно заметил groundhog бажной является только это строка
    через нее можно записать произвольный код на выполнение, например в тот же cmd.php.
    2Scipio посмотри внимательно на первую и вторую часть скрипта там совсем разные действия выполняются и ты не как не можешь повлиять на то что находится в массиве $CMD.
     
  15. Scipio

    Scipio Well-Known Member

    Joined:
    2 Nov 2006
    Messages:
    733
    Likes Received:
    544
    Reputations:
    190
    Нда, минус то тебе правильно поставили, т.к. __FILE__ - является предопределенной константой, и в ней содержится имя выполняемого скрипта, т.е. define(__FILE__ ,"bla-bla") - это действительно бред

    Посмотрел я на оба скрипта, и на свои посты, и так и не понял в чем потвоему моя ошибка