Ucoz файлы с расширением php запрещены
Встала задача запретить использование php сценариев в определённых директориях на сервере. Дело в том, что в некоторые дирректории предназначенные для записи в них изображений позьзователями из свеоей административной панели могут записать php-скрипт. Данная ситуация может крайне негативно сказаться на работе всего хостинга. Обычно после взлома административной панели злоумышленник получает доступ не только к сайту но и другим ресурсам сервера. Часто такие уязвимости используются для рассылки СПАМа.
Давайте разбираться как предотвратить выполнение php программы в директориях, предназначенных для хранения медиа контента. То есть в директориях куда пользователи из своей админ-панели могут записывать свои файлы.
Запретить использование CGI-скриптов в директории
Запрещаем доступ к следующий типам файлов, как к файлам CGI-скриптов. Для этого отключаем работу CGI сценариев. И указываем файлы с каким расширениями относятся к таковым(даже если эти файлы таковыми и не являются).
AddHandler cgi-script .js .asp .html .xml .exe .php .cgi
Запрет на обращение к указанным типам файлов в директории
Прописываем в .htaccess типы файлов к которым будет запрещён доступ и указываем для них правило - Deny from all (запрещено для всех). Этот и предыдущий способ будут выдавать в браузере ошибку "Forbidden" "You don't have permission to access" (у Вас нет прав доступа). Но изображения, текстовые и музыкальные файлы будут нормально скачиваться. Поэтому используйте этот и предыдущий метод, если Вам нужно запретить выполнение php файла и получение его текстового содержания. Одним способом запретить доступ к файлам с расширением или содержанием php. Методы кторые описаны с статье ниже хотя и не выполняют php скрипты, тем не менее выдают их текстовое содержание. Будте аккуратнее в их использовании.
Запрет выполнения php через директиву php_value engine off
php_value engine off
RemoveHandler .pl .cgi .php .php3 .phtml
А если заменить последнюю строчку на следущую, тогда подсветки синтаксиса не будет. Кстати так можно сделать даже с изображениями. Отмените тип файла jpg и добавьте к нему заголовки text/html. В этом случаи вместо картинки в браузере можно увидеть бессмысленный текст.
Ещё один способ отключения php через .htaccess
Метод работает следующим образом. Удаляем тип файлов php (RemoveType php). То есть для файлов с расширением php обработчик более не определён и теперь сервер не знает, как обработать данный файл, поэтому выдаст его как текстовый. Обычно одной этой строки достаточно, но если нет, впишите все остальные в Ваш файл .htaccess. Теперь после обращения к php файлы он будет открываться как обыкновеннй текстовый файл. То есть исполняться такой php-сценарий не будет. Тем не менее если пользователь наберёт в своём браузере адрес где находится такой скрипт, то сможет получить его текстовое содержание. Учитывайте это и обратите внимание особенно чтобы в директории не было конфигурационных файлов, в которых могут храниться Ваши пароли. В этом случаи злоумышленник может получить доступ к сайту через панель администратора или базу данных.
php_flag engine 0
php_flag engine 0
Перенаправление и обработка ситуации в указанном php скрипте.
Ситуацию с вызовом нежелательных php скриптов можно обработать в другом php файле, который мы заранее подготовим. Для этого пропишем в .htaccess правила для перенаправления.
RewriteCond % !^(.*).(jpg|jpeg|png|bmp|tif|css|js|txt|pdf|doc|docx|mp3|mp4) [NC]
RewriteRule ^(.*)$ index.php [L]
Для тех кто не знаком с правилами Rewrite: Директивой RewriteEngine on активируем модуль перенаправлений. В RewriteCond указываем ситуации на которые перенаправление не распространяется, то есть в данном случаи указываем типы фалов на которые перенаправление не распространяется. Флаг [NC] означает, что типы файлов не зависят от регистра. То есть правила не распространяются как на .jpg так и на .JPG. Список типов файлов тут далеко не полный, так что не забудте его дополнить нужными для работы Вашего сайта.
Сам php осуществляющий обработку может выглядеть примерно так:
<?php
$logfile = "log.txt" ;
$fp = fopen ( $logfile , "a" );
fwrite ( $fp , $_SERVER [ "REQUEST_METHOD" ] . " | " . $_SERVER [ "REQUEST_URI" ] . " | " . $_SERVER [ "REMOTE_ADDR" ] . " | " . $_SERVER [ "HTTP_USER_AGENT" ] . "\n" );
fwrite ( $fp , $_SERVER [ "HTTP_ACCEPT" ] . " | " . $_SERVER [ "HTTP_ACCEPT_LANGUAGE" ] . " | " . $_SERVER [ "HTTP_ACCEPT_ENCODING" ] . "\n" );
if (isset( $_POST )) fwrite ( $fp , "POST:\n" );
foreach ( $_POST as $k => $v ) fwrite ( $fp , $k . ":" . $v . "\n" );
>
>
if (isset( $_COOKIE )) fwrite ( $fp , "COOKIE:\n" );
foreach ( $_COOKIE as $k => $v ) fwrite ( $fp , $k . ":" . $v . "\n" );
>
>
fwrite ( $fp , "_____________________________________________________________\n" );
header ( "Location: /" , true , 301 );
У нас произошло одно из самых ожидаемых обновлений системы - теперь в uCoz возможно использование языка программирования PHP и функционала API.
PHP - это платная услуга, она доступна как в рамках пакета (Максимальный), так и как дополнительная услуга ($1.99 в месяц).
АPI - это бесплатная возможность, её нужно просто активировать в Основных настройках сайта:
Что теперь можно сделать?
PHP вводится для того, чтобы наши пользователи могли расширить и кастомизировать свои сайты. Добавить им гибкости и разнообразных полезных функций. С помощью нового функционала возможно реализовать различные фичи на сайте, использовать скрипты для взаимодействия с модулями системы и вывода данных в необходимом виде и месте, их преобразование. Открываются возможности к реализации необычных сервисов на своих сайтах.
Для чего данное решение не предназначено?
Данное решение не подходит для установки портальных систем, монстрообразных движков форумов, и прочих высоконагрузочных скриптов с неоптимальным исходным кодом, дающих высокие необоснованные нагрузки на сервер. Собственно, подобные ограничения в реальности есть у любых виртуальных хостингов. К тому же, в ряде случаев это будет дублировать функционал uCoz, и врядли будет иметь целесообразность.
Примеры того, что можно реализовать при помощи PHP
3. Смена группы пользователей, при помощи отправки SMS - реализацию этой функции давно просили в нашем сообществе. Например, для организации исключительно платного доступа к некоторым разделам сайта.
Данная функция станет доступна в панели управления как виджет и ей сможет воспользоваться любой сайт, который считает, что ему данный функционал необходим. К сожалению, по некоторым причинам мы не приводим исходный код данного решения, но при этом для его реализации был использован стандартный функционал API и подобный виджет может теперь создать любой желающий.
В каком формате мы внедряем эту функцию?
Это именно возможность использовать язык PHP. Под запретом функции работы с памятью, системные вызовы и низкоуровневые функции по работе с файловой системой.
Да, быть может вы уверенны в своих познаниях PHP и готовы поставить на кон голову, что именно ваши скрипты не положат сервер. Но представьте, что будет, если владелец соседнего сайта, того, что расположен на одном с вами сервере, начнет экспериментировать и результат работы его пытливого мозга и шаловливых рук уронит не только его сайт, но и все 100 тысяч, которым не посчастливилось хоститься рядом. Именно поэтому подобные функции есть и будут оставаться под запретом.
Все остальные же функции языка использовать можно.
Можно работать с POST и GET запросами.
Как это работает?
Для вашего аккаунта при активации функции создается отдельная учетная запись на отдельном сервере, папка scripts, где будут храниться все файлы с расширением *.php. Только файлы с таким расширением будет можно вызывать непосредственно в редакторе шаблонов путем специального обращения. Все остальные файлы (их содержимое) можно получать только посредством самих php-скриптов (т.е. нельзя напрямую из шаблона обратиться к картинке в папке /scripts/ или файлу с базой данных, но можно вызвать их через скрипт, а сам скрипт уже вызвать в шаблоне). Сама папка хранится на отдельном сервере, на котором и происходит исполнение всех скриптов. Доступ к ней осуществляется через FTP.
Для того, чтобы запустить скрипт на исполнение, его нужно вызвать в любом нужном вам месте шаблона или материала (или даже напрямую, ссылкой в браузере) в текущем домене через проксирование, используя вот такой синтаксис:
В шаблонах для вызова php-скрипта можно использовать функцию PHPCODE следующим образом:
- SITE_ADDRESS - адрес сайта пользователя, на котором выполняется скрипт.
- SCRIPT_NAME - путь (относительно папки scripts) и имя скрипта, который выполняется.
- ?param0=valueA¶m1=valueB. ¶mN=valueM - параметры для скрипта, которые могут как быть, так и не быть.
- <?$PHPCODE$()?> - синтаксис вызова php функции в шаблоне системы uCoz.
Как это выглядит на практике?
Рассмотрим на примере скрипта, который хранит какую-либо дополнительную информацию о пользователе. Скрипт создает на странице форму с дополнительными полями для текущего пользователя, которые он заполняет и нажимает кнопку "Обновить".
Если во время пентестов система или приложение позволяет загружать любые файлы, то задача, связанная с получением доступа к серверу и выполнением вредоносного кода, упрощается.
Автор: Haboob Team
Если во время пентестов система или приложение позволяет загружать любые файлы, то задача, связанная с получением доступа к серверу и выполнением вредоносного кода, упрощается. С другой стороны, если есть ограничения и фильтр загружаемых файлов по расширению, то сначала нужно обойти эту проверку. В этой статье мы поговорим о том, как в веб-приложениях обрабатывают и проверяют файлы, загружаемые на сервер, а также методы обхода этих проверок.
Фильтрация на стороне клиента
В этом случае проверка происходит в браузере средствами JavaScript, VBScript или HTML5 перед отправкой файлов на сервер. Программисты используют этот метод для того, чтобы оптимизировать взаимодействие пользователя с приложением и быстро выдать ответ на уровне браузера.
Обход фильтрации на стороне клиента
1. <script type="text/javascript">
2. var _validFileExtensions = [".jpg", ".jpg", ".bmp", ".jpg", ".jpg"];
3. function Validate(oForm)
4. var arrInputs = oForm.getElementsByTagName("input");
5. for (var i = 0; i < arrInputs.length; i++)
6. var oInput = arrInputs[i];
7. if (oInput.type == "file")
8. var sFileName = oInput.value;
9. if (sFileName.length > 0)
10. var blnValid = false;
11. for (var j = 0; j < _validFileExtensions.length; j++)
12. var sCurExtension = _validFileExtensions[j];
13. if (sFileName.substr(sFileName.length - sCurExtension.length, sCurExtension.length).toLowerCase() == sCurExtension.toLowerCase())
14. blnValid = true;
21. return false;
Как показано выше, JavaScript обрабатывает запрос перед отсылкой на сервер. Внутри кода происходит проверка, принадлежит ли расширение файла графическому формату (jpg, jpeg, bmp, gif, png). Этот метод фильтрации можно обойти после изменения содержимого запроса и самого файла на вредоносный код с расширением, способствующим выполнению этого кода.
Рисунок 1: Результат проверки файла на предмет присутствия расширения из списка графических форматов
Как показано на рисунке, загрузчик файлов приостанавливает отправку запроса, если мы пытаемся загрузить php-файл напрямую.
Рисунок 2: Запрос, формируемый во время загрузки файла
Мы смогли обойти эту проверку посредством загрузки изображения через браузер, последующего изменения расширения в запросе, который будет отсылаться на сервер, а также изменения содержимого файла. Мы поменяли расширения с .jpg на .php и заменили содержимое файла на вредоносный код.
Проверка на стороне сервера
Более тщательная проверка имени файла происходит во время загрузки на сервер. В этом случае анализ расширения может выполняться множеством способов, но основных два: проверка по черному и белому спискам.
В черном списке находятся расширения файлов, которые не принимаются к загрузке ни при каких обстоятельствах, например, php, aspx. В случае с белым списком ситуация полностью противоположная. В этом перечне находятся только те расширения файлов, которые разрешены для загрузки на сервер, например, jpg, jpeg, gif.
Обход проверки на стороне сервера
Некоторые типы проверок можно обойти при помощи загрузки файла с не очень популярным расширением или используя различные трюки во время загрузки.
В случае с обходом черного списка можно попробовать загрузить файлы со следующими расширениями: pht, phpt, phtml, php3, php4, php5, php6.
Обход белого списка осуществляется при помощи некоторых трюков, как, например, добавление пустого байта в имя файла (shell.php%00.jpg) или использование двойного расширения (shell.jpg.php).
В некоторых случаях проверку можно обойти при помощи расширений с измененным регистром одного из символов: pHp, Php, phP.
1. if($imageFileType != "jpg" && $imageFileType != "png" && $imageFileType != "jpeg"
2. && $imageFileType != "gif" )
3. echo "Sorry, only JPG, JPEG, PNG & GIF files are allowed.";
В коде выше показан пример кода загрузчика файлов, принимающего лишь несколько расширений (jpg, jpeg, gif). Далее рассмотрим пример обхода различных типов проверок.
Пример обхода черного списка
Рисунок 3: Обход фильтра при помощи загрузки файла с непопулярным расширением
На рисунке выше показан обход проверки при помощи загрузки файла с расширением .php5, который принимается сервером Apache и далее запускается автоматически как обычный php-файл.
Пример обхода белого списка
Пример обхода белого списка
Рисунок 4: Обход фильтра при помощи загрузки файла с двойным расширением
На рисунке выше показано, как можно обойти белый список через загрузку php-файла с двойным расширением.
Проверка заголовка CONTENT-TYPE
Обход проверки Content-Type
Этот класс фильтров можно обойти посредством изменения в файле shell.php или shell.aspx содержимого параметра Content-Type на значение «image/png», «image/jpeg» или «image/gif».
3. $mimetype = mime_content_type($_FILES['file']['tmp_name']);
4. if(in_array($mimetype, array('image/jpeg', 'image/gif', 'image/png')))
5. move_uploaded_file($_FILES['file']['tmp_name'], '/uploads/' . $_FILES['file']['name']);
9. echo 'Upload a real image';
В коде выше мы видим, что проверяется MIME-тип, являющийся частью заголовка Content-Type, у файла, загружаемого на сервер. В данном случае загрузчик принимает только файлы со следующими типами: image/jpeg, image/gif и image/png. Мы можем легко обойти этот фильтр, изменив поле Content-Type во время загрузки исполняемого файла на тот MIME-тип, который принимается веб-сервером.
Рисунок 5: Пример измененного поля Content-Type при загрузке php-скритпа
Проверка заголовка CONTENT-LENGTH
В этом случае сервер проверяет размер содержимого заголовка Content-Length у загружаемого файла и не допускает загрузку файлов, у которых этот размер превышает определенное значение. Хотя этот метод не настолько популярен, но может использоваться в некоторых загрузчиках.
Обход проверки CONTENT-LENGTH
Этот фильтр обходится при помощи загрузки вредоносного кода очень небольшого размера в зависимости от того, какое максимальное значение используется при сравнении веб-сервером. Максимальное значение можно выяснить через загрузку нескольких файлов различного размера с целью выяснения, какие файлы будут приниматься, а какие нет.
1. if ($_FILES["fileToUpload"]["size"] > 30)
2. echo "Sorry, your file is too large.";
В коде выше загрузчик не принимает файлы более 30 байт. Как было сказано выше, этот фильтр можно обойти при помощи загрузки вредоносного кода очень маленького размера.
Сортировка массивов по возрастанию и убыванию в PHP
Звезды блога ТОП 3
Загрузка файлов на сервер является очень важным скриптом на сайте, так как от него в большую часть зависит безопасность вашего сайта. Если мы не уделим должного внимание к процессу загрузки файлов, то есть, не будем подвергать файл строгим проверкам на его расширение, размер и т.д. то злоумышленник сможет загрузить вредоносный скрипт, тем самым удалит или получит доступ к закрытым файлам и данным.
Для чего используется данный скрипт?
- Профиль пользователя (загрузка собственной картинки - аватара)- Баннерная реклама (Загрузка флеш или графического баннера)
- Онлайн фото галерея (Не будем же мы для очередной фотографии заходить по FTP, нужно автоматизировать процесс сделав загрузку изображении через админку)
- Офисная свалка (Загрузка отчетов или других важных документов формата: doc, pdf, djvu. )
Все сводится к одному и тому же - загрузка файла на сервер.
Какие файлы не нужно допускать к загрузке ?
Без вашего ведома не должны допускаться к загрузке файлы которые выполняют программный код.Злоумышленник загрузит так называемый скрипт "B ackdoor - Черный вход " и у него появится древо всех папок и файлов на вашем сервере, он сможет открывать и редактировать все файлы на сервере(конечно если нет ограничение прав пользователей) если он получит доступ к конфигурационному файлу базы данных то он получит данные для подключения к ней.
Расширения которые не должны позволяться к загрузке со стороны обычного пользователя
php, cgi, pl, php3, php4, php5, php6, phps, phtml, shtml, py, exe
Как предотвратить выполнение скриптов если хакер смог загрузить файл?
Для этого нам понадобится помощь .htaccess он не позволит запуск скриптов расширение которых находится в списке запрещенных (1. Смотрим код ниже.) (2. Данный пример подходит для сайтов на Apache)Теоретическая часть закончена, подходим к просмотру скриптов изнутри.
Иерархия файлов и папок данного скрипта
Файл upload.html - Содержит обыкновенную форму загрузки файла на сервер.
Файл upload.php берет на себя главную роль в загрузке файла на сервер.
Я постарался предельно понятнее назвать переменные и комментировать их для читателей не знающих английского языка. Если не будет ясен определенный участок кода, задавайте вопросы в комментариях ниже.
Файл .htaccess из папки uploads запрещает выполнение файлов с определенным расширением.
Все появившейся вопросы задавайте в комментариях ниже. Буду рад объяснить все непонятные моменты. Благодарю за внимание!
Еще записи по теме
Комментариев: 5
Скрипт работает, спасибо.
1. Загружаемому файлу присваивается случайное имя
2. Создается превьюшка для изображений
Я абсолютный нуль-PHP. Но вот решила создать сайт на хостинге с поддержкой PHP и БД, последнее, правда не хочу использовать, нашла cms на файлах.
Очень прошу Вас как PHP-специалиста написать мне, модифицируя выложенное здесь, следующее:
в процессе диалога с юзером у меня появляется ссылка на изображение с другого сервера (не с его локального компьютера, как это у Вас здесь, а с буржуйского сервера картинок jpg,png,gif). Я могу вызвать созданный Вами upload.php и
передать ему эту ссылку. Каковы опции вызова upload.php?опция1=значение1&опция2=значение2 - это нужно уточнить, т.к. вызов будет не отправкой формы,
файла upload.html мне не нужно, а с помощью JavaScript, обрабатывающего
запрос юзера с получением адреса картинки. Новое имя и адрес загрузки
может формировать и JS. Но можно оставить это в upload.php, только в случае
успешной загрузки upload.php должен как-то сообщить в JS эти параметры,
чтобы JS сценарий мог оперировать ими дальше, встраивая это изображение,
предлагая юзеру его скачать и т.п.
Кроме того, изображений может быть много и просьба встроить в upload.php
сервис их удаления через заданное время, например, 24 часа.
Все echo для юзера надо заменить информацией для JS - юзер этого диалога
касаться не должен.
О взаимодействии php и js пока представление имею смутное, но, например,
диалог с юзером в моём index.php, в котором прописан сценарий JS
и чего-нибудь скрытое display:none типа input,
как только в индексе от JS получен адрес изображения, индекс обращается
к upload.php - но не отправкой формы с перезагрузкой страницы, а
как-то без перезагрузки и сообщает ему адрес изображения. upload.php
дает ему имя, загружает его и в скрытое поле ввода сообщает либо false.
либо true с именем и адресом новой картинки, JS на таймере SetInterval считывает value из скрытого поля ввода, как только там появилась запись,
прекращает процесс отслеживания, считывает инфо, обнуляет value, работает
Читайте также: