Подключить удаленный файл php

Обновлено: 07.07.2024

Этичный хакинг и тестирование на проникновение, информационная безопасность

Иногда внедрение файлов называют инклудом, иногда рассматривают как часть PHP инъекции (инъекция кода). Последнее не совсем верно, поскольку уязвимость внедрение файлов не обязательно связана с выполнением кода.

Уязвимость может возникнуть при использовании (в PHP) таких выражений как:

  • require_once,
  • include_once,
  • include,
  • require,

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

Кстати, да, это именно выражения, а не функции. Необзятельно писать так:

Более предпочтительным является такой вариант:

Но это отступление, которое не имеет никакого отношения к уязвимости.

Если инклуд файлов осуществляется выражениями require_once, include_once, include, require, то можно сказать, что в это же время имеет место и инъекция кода. Тем не менее, возможен инклуд файлов без выполнения кода на сервере. Например, веб-сайт меняет внешний вид исходя из выбранной пользователем темы. Название тем соответствует названию HTML файлов, которые считываются на сервере. В данной ситуации если запрос сформирован так, чтобы осуществить считывание файла, который для этого не предназначен (например, файл PHP), то вместо выполнения команд, будет выведен исходный код PHP.

Пользователь может указать в качестве файла для инклуда удалённый или локальный файл. На основании этого выделают две соответствующие разновидности:

  • локальное внедрение файлов
  • удалённое внедрение файлов

Опасность удалённого инклуда заключается в выполнении произвольного кода на уязвимом сервере. Обычно это используется для заражения бэкдором.

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

Локальный инклуд файлов является не менее опасным, чем внедрение удалённых файлов.

Эксплуатация локального внедрения файлов

Попробовать свои силы на этой уязвимости можно в Damn Vulnerable Web Application (DVWA). Я использую Web Security Dojo, где DVWA уже установлен.

Начнём с низкого уровня (low) безопасности (настраивается в DVWA Security).

01

Там нам предлагаются три ссылки для перехода:

Если в качестве аргумента переменной передаётся значение, похожее на имя файла (file1.php, file2.php), то можно предположить, что используется инклуд. Поскольку расширение файла .php, то вероятнее всего файл исполняется на сервере (т.е. возможно выполнить внедрение кода), а не просто выводится для показа.

02

Да, уязвимость локальный инклуд присутствует. При вводе не фильтруются переходы в верхние директории (../), список файлов для инклуда не является исчерпывающим (вместо предлагаемых file*.php мы выбрали about.php).

Часто в качестве примера эксплуатации локального инклуда файлов любят приводить что-то вроде такого:

04

Как видим, это сработало. Но поскольку веб-браузеры игнорируют /r/n (символы новой строки), то нам нужно открыть исходный код, чтобы записи стали читаемыми:

05

К сожалению, никаких паролей в файле /etc/passwd уже давно нет.

С сервера можно стянуть разные файлы настроек, SSL-сертификаты, в принципе, любой файл, который открыт для чтения всем пользователям или на чтения которого у веб-сервера достаточно прав:

06

07

Что касается общих хостингов, то иногда удаётся заглянуть в чужие папки (опять же, при неправильной настройке прав пользователей).

03

Задача усложняется тем, что нам нужно знать путь до файла.

Эксплуатация удалённого внедрения файлов

PHP очень гибкий и дружественный для разработчиков язык программирования. Команды внедрения (инклуда) файлов и некоторые другие прекрасно распознают и правильн6о обрабатывают не только локальные файлы, но и URL…

Посмотрите, как интересно получается:

Конечно эта уязвимость интересна нам не тем, что мы через один сайт можем просматривать другие сайты.

Мы можем сохранить наш бэкдор на уязвимом сайте. Алгоритм следующий:

  1. Генерируем / находим исходный код бэкдора
  2. Создаём правильный с точки зрения PHP файл для выполнения на сервере, который сохраняет исходный код бэкдора в PHP файл
  3. Сохраняем полученный код в ТЕКСТОВЫЙ файл
  4. Загружаем этот текстовый файл на подконтрольный сервер
  5. На уязвимом сервере с помощью удалённого инклуда файлов сохраняем наш бэкдор

Я выделил слово «текстовый» по той причине, что на подконтрольном нам сервере должен быть именно текстовый файл, который не должен исполнятся на нашем сервере. Наш сервер должен только показать его содержимое.

Для создания бэкдора можно воспользоваться Weevely, PhpSploit, а можно взять готовые решения. Давайте в этот раз воспользуемся готовым.

Я присвою переменной $backdoor исходный код бэкдора, который скачаю с гитхаба. Затем использую функцию file_put_contents для сохранения полученного исходного кода в файл c99unlimited.php.

Код, который я разместил в текстовом файле

11

Теперь, используя удалённый инклуд, мы загружаем бэкдор на уязвимый сервер.

10

Обратите внимание на надпись done!, она выведена скриптом, т.е. вероятно всё получилось.

12

Отлично, теперь у нас есть все функции, которые только могут понадобиться администратору веб-сервера… и тем, кто имеет доступ к его серверу.

Обход фильтрации при локальном инклуде файлов

Перейдём на средний уровень (medium) безопасности (настраивается в DVWA Security).

Если мы заглянем в исходный код (кнопка View Source):

13

то мы увидим, что теперь символы ../ фильтруются. Это не даст нам перейти на каталоге выше того, в которой работает уязвимый скрипт.

Т.е. так уже ничего не получится:

Давайте подумаем, как работает фильтрация в этом случае? Допустим, фильтруется слово « плохо », тогда строка вида

хорошо плохо хорошо

после фильтрации будет такой:

А если вставить такую строку

то после фильтрации (будет удалено « плохо ») получится

14

Ещё одним вариантом обхода может быть кодировка символов в шестнадцатеричную кодировку, пример такой строки:

Также практикуется двойное кодирование в шестнадцатеричную кодировку, при котором «../» заменяется на «%252E%252E%252F»

Локальный инклуд файлов при добавлении расширения в скрипте

Если код с инклудом файлов имеет вид:

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

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

Использование нулевого байта %00 (null byte)

В конце запроса для игнорирования расширения добавляется нулевой байт:

Обход фильтрации при удалённом внедрении файлов

15

И ещё обратите внимание, что не фильтруется, например ftp, т.е. такой вариант сработал бы вообще без всяких ухищрений:

Получение исходного кода PHP скриптов при инклуде файлов с php://filter

Для этого трюка не требуется удалённый инклуд файлов. Будет использоваться своего рода мета-обёртка php://filter.

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

16

Обратите внимания на бессмысленную строчку из букв и цифр – это исходный код файла file1.php в кодировке base64. Поскольку это base64, то поддерживаются и бинарные файлы.

17

Удалённое выполнение кода с php://input

Это не похоже на внедрение файлов и для этого опять не требуется загружать файлы.

Для помощи я воспользуюсь расширением FireFox HackBar, вы также можете использовать его или любую другую программу (например, curl) умеющую передавать данные методом POST.

А в теле запроса отправьте правильный PHP код (например, с помощью метода POST). Это позволит вам выполнить любую разрешённую на удалённом сервере функцию!

Удалённое выполнение кода с data://

Кроме этого, PHP поддерживает URL-схему data:// Вы можете разместить код прямо в параметре GET! Следующий тест не требует каких-либо специальных инструментов, просто обычный браузер для выполнения атаки.

19

Некоторые файерволы веб-приложений могут заметить подозрительную строку в URL и заблокировать злой запрос. Но есть способ зашифровать строку как минимум в base64 кодировку:

20

Выполнение произвольных команд с /proc/self/environ

/proc/self/environ – это хранилище переменных процесса. Если у процесса Apache достаточно прав для доступа к нему, то при открытии веб-страницы, на которой присутствует инклуд с подобным URL,

выведет что-то вроде

40

Травление и внедрение логов при локальном инклуде файлов

К сожалению, на последних версиях Apache этот метод больше не работает.

Его суть заключается в том, что в логи веб-сервера внедряется код атакующего. Это можно сделать путём подмены User-Agent, либо даже просто передачей в GET параметре.

Далее необходимо сделать инклуд файла лога.

Статичное внедрение удалённого файла

Пример статичного инклуда:

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

Заключение

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

В этой статье я расскажу о том, как в PHPStorm настраивать FPT/SFTP-подключения для работы с файлами на удалённом сервере. После прочтения этой статьи вы будете знать, как в PHPStorm работает загрузка файлов на сервер. Как добавить несколько FTP-подключений и одновременно загружать файлы на все настроенные сервера.

Для чего это нужно

Очень часто так бывает, что вы разрабатываете проект локально, и после приобретения проектом лицеприятного вида появляется необходимость в публикации этого сайта на хостинге, или личном сервере. Допустимый вариант - использовать фтп-менеджер, по типу FileZilla, WinSCP, или им подобные. И с их помощью загружать файлы на сервер, как только вы закончите работу. Однако, во-первых, иногда очень напрягает постоянные переключение между вкладками, особенно, когда правки происходят в режиме лайф. И, во-вторых, PHPStorm имеет встроенный функционал по работе с удалёнными серверами, и, во-многом, мощнее большинства файловых менеджеров.

Благодаря PHPStorm-у теперь можно настроить подключения к удалённому серверу, настроить автоматическую загрузку файлов и их синхронизацию, можно редактировать удалённый файлы по FTP прямо из любимой IDE. В общем, что только не делают разработчики IDE, только бы мы писали качественный код. Потому, преимущества использования встроенных инструментов, по сравнению с FileZilla и компанией - есть.

Настройка FTP-подключения в PHPStorm

Для демонстрации процесса настройки FTP в PHPStorm я создам новый проект, а так же, создам новый дроплет на DigitalOcean, на который буду загружать файлы проекта.

Прежде всего, нужно настроить FTP соединение с удалённым сервером. Для этого нужно перейти в меню настроек File > Settings , где открыть вкладку Build, Execution, Deployment > Deployment , и нажать на кнопку добавления нового подключения:

settings_add_server_select_type

Где во всплывающем меню будет предложено выбрать тип подключения, который мы будем использовать: FTP , FTPS , SFTP :

Какую опцию выбирать зависит от того, куда вы подключаетесь. Грубо говоря, если у вас собственный сервер, и к примеру, вы хотите подключиться от имени root-а, или другого пользователя на сервере, то нужно выбрать SFTP .
Если вы подключаетесь к shared-хостингу, то они обычно предоставляют доступ только по FTP .

settings

И указав имя, получим такое окно с настройками, на котором остановимся подробнее:

где 1 - это опция, которая указывает на то, будет ли доступен этот сервер в других ваших PHPStorm-проектах. То есть, вы можете настроить это подключение один раз, и выставив эту галочку, работать в любом своём проекте, не настраивая его повторно в других проектах
2 - тип подключения, который указывали шагом назад (который можем изменить в любой момент)
3 - хост, к которому подключаемся
4 - порт сервера (для SFTP обычно 22, но на сервере можно настроить какой угодно)
5 - имя пользователя
6 - пароль (и галочка сохранить пароль, чтобы не вводить его повторно)

После того, как указали все параметры, нужно протестировать это подключение на корректность введённых данных, нажав на кнопку Test Connection (соглашаясь со всеми всплывающими окнами).

select_path

Теперь осталось только настроить пути к проекту, папку выгрузки на сервер. Здесь нужно указать, в какой директории на сервере находятся файлы вашего проекта. К примеру, на VDS, файлы, обычно расположены по пути /var/www/html , если это хостинг, то username/public_html , public_html , или что-то типа того. Потому укажем путь, нажав на кнопку:

paths

Теперь, последний шаг для удачного деплоя - укажем путь, куда будут загружаться файлы. Для этого нужно перейти на вкладку Mappings и выбрать путь Deployment path (обычно, при указанном пути к проекту на предыдущей вкладке, Deployment path задаётся как / ).

Если вы хотите, чтобы на удалённый сервер заливался проект, без определённых папок/файлов, то можете указать исключения на вкладке Excluded Paths , какие папки/файлы будут игнорироваться при деплое.

Готово! Нажимаем OK , и сервер добавлен.

Подключаемся к настроенному серверу

tolls

Подключение мы настроили. Но пока непонятно, как к нему подключиться. Для того, чтобы появилась удобная панель работы с FTP-серверами, откроем в меню Tools > Deployment > Browse Remote Host , в результате чего, появится новая панель Remote Host , которую можете открыть кликнув по ней

upload_to

И всё, теперь мы полноценно настроили подключение по FTP, и можем из PHPStorm загружать, или редактировать файлов на удалённом сервере. Удобство в том, что можно перенести файлы на сервер либо выделив все нужные локальные файлы, скопировав Ctrl + C , перевести фокус на удалённый сервер, и Ctrl + V .
Или же, выделив нужные файлы, нажмите правую кнопку мыши, Deployment > Upload to .

Теперь в правом меню Remote Host , в списке файлов сервера появятся ваши файлы, которые вы можете открывать, и редактировать по фтп. И к примеру, если вы открыли файл, отредактировали его, то редактор сам подскажет вам, что в файле были произведены изменения, которые стоило бы залить на сервер. И для того, чтобы загрузить изменения на FTP сервер, нужно нажать на кнопку:

Как синхронизировать файлы по фтп с удалённым сервером

Теперь мы уже знаем, как можно добавлять и редактировать файлы в PHPStorm по FTP. Осталось только настроить проект таким образом, чтобы была возможность загружать файлы на сервер без подтверждения, без постоянных кликов на кнопку загрузки файлов. То есть, чтобы мы могли отредактировать файл локально, и он, в лайв режиме загрузился на сервер без дополнительных подтверждений с нашей стороны.

setting_auth2-1

Для этого опять зайдём на страницу настроек File > Settings , настройки деплоя Build, Execution, Deployment > Deployment > Options

где 1 - режим загрузки файлов при их изменении:

  • Always - синхронизировать сразу же при изменении
  • On explicit save action - загрузка на сервере при нажатии Ctrl + S
  • Never - не синхронизировать

2 - режим поиска и разрешения конфликтов версий файлов:

  • No - загружать локальный файл на сервер без дополнительных проверок
  • Compare timestamp & size - сравнивать дату изменения локального файла с серверным, или его размер
  • Compare content - сравнивать содержимое файла с его предыдущей версией

То есть, когда PHPStorm обнаружит, что за то время, пока вы редактировали свой файл локально, его кто-то изменил на сервере. И, если настроено разрешение конфликтов версий файлов, то он уведомит вас о том, файл отредактирован кем-то, чтобы вы не затёрли чужие правки. Удобно, когда над проектом работает несколько человек.

Применив все настройки и отредактировав локальный файл, можем убедиться, что изменения на сервер были отправлены незамедлительно. И теперь вы знаете, как насроить лайв синхронизацию файлов с сервером в PHPStorm.

Загрузка файлов не несколько серверов одновременно (группа серверов)

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

server_grou-p

Для того, чтобы создать такую группу серверов, откроем панель File > Settings , и перейдём на вкладку Build, Execution, Deployment > Deployment , где нажмём на кнопку добавления нового сервера (как было в предыдущих шагах), только в этот раз выбираем опцию Server group

add_new_server_to_grou

Во всплывающем окне укажем имя для этой группы серверов, после чего, можем начать добавление сколько угодно серверов в эту группу:

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

2-servers-list

В итоге, группа из двух сервером выглядит так:

upload_to_server_group

Теперь, когда всё настроено, можем выделить нужные файлы проекта, которые необходимо залить, нажать ПКМ, и в контекстном меню Deployment кликнуть Upload to . server group

Upload_to_one_server_edited

Нажав на кнопку, запустится процесс деплоя на каждый из этих серверов. Если же, вам понадобится загрузить только на один сервер из этой группы, то в том же меню Deployment , можете выбрать Upload to. , во всплывающем окне, выбрав нужный сервер

На момент создания группы серверов у вам уже могут иметься добавленные сервера. Вы можете переместить их в группу, используя drag-n-drop.
Если в PHPStorm не работает drag-n-drop, то попробуйте, используя зажатую кнопку Alt .

Так же важно понимать, что относительно группы серверов так же работает автоматическая синхронизация файлов с вашим проектом (если она настроена).

Резюме

Теперь вы знаете, как в PHPStorm работать по FTP, как работает загрузка файлов одновременно на несколько серверов, как всё это настраивать и успешно применять в своей работе. В этой статье я, для демонстрации использовал демо-сервер, который заказывал на DigitalOcean. И если вам нужен дешевый и качественный сервер (топ за свои деньги), то приглашаю вас зарегистрироваться по инструкции из этой статьи, и получить дополнительные 50$ на использование их услуг.

Я хотел бы прочитать удаленный текстовый файл (в идеале, используя fopen), используя PHP. Мой скрипт работает с использованием fopen, когда я использую эту функцию в локальном файле.

Я прочитал это phpseclib может быть хорошим вариантом, и так как я могу получить доступ к своим файлам с помощью WinSCP (SFTP) или с помощью Puttyfor, я попробовал это (после копирования всех файлов из phpseclib в мой каталог), надеясь, что я смогу скопировать файл локально, а затем прочитать его с помощью fopen (не самая лучшая вещь для удовлетворения, но я мог бы жить с этим):

Любая идея о том, как я мог заставить его работать? В идеале я бы использовал fopen, но я открыт для другого решения.

Решение

С fopen я столкнулся с похожими проблемами.
Curl полезен для этих целей.

Другие решения

Я только что проработал эту проблему сам и не смог найти ни одной хорошей документации в каком-либо одном месте, как это сделать.

Я только что создал службу регистрации, которая использует Monolog и в основном создает собственный обработчик потока на основе файлов журнала, которые записываются / создаются. Как таковой, он требует ресурса (например, созданного fopen ) для записи файлов журнала на сервер SFTP.

У меня было это работает с использованием библиотеки ssh2, как это:

Все работало прекрасно, пока я не пошел интегрировать сервис в другой проект и не понял, что это работает только на моей машине разработки, потому что она имеет libssh2 библиотека установлена как указано в этом вопросе .

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

я использовал phpseclib в других проектах, но только для основных get() , put() и немного nlist() звонки.

Чтобы заставить это работать, я должен был использовать Stream объект. Не очень хорошо документировано, но есть хорошая дискуссия здесь .

Основанный на информации там, плюс некоторое копание в SFTP класс, особенно get() функция, это то, как мне удалось достичь той же функциональности, используя phpseclib

обратите внимание на точку ( . ) после sftp:// в призыве к fopen() , Это потратило на меня добрых полчаса!

Так я решил проблему с помощью phpseclib, как это было предложено @neubert в комментариях к моему вопросу.

Я впервые добавил phpseclib папка на моем сервере. Затем я использовал этот код в своем PHP-файле, чтобы получить доступ к моему файлу на удаленном сервере:

Заранее извиняюсь если промазал с темой или тема повтор, однако поиском пользовался - ответа на свой вопрос не нашел. Уже второй день пытаюсь найти решение своей проблемы, прочитал 358 Мб форумов и мануалов, мозг взрывается, результат - отсутствует. Замечу, что знания в PHP чуть более, чем нулевые, мозга хватило лишь на то, чтобы собрать несколько примеров воедино и подкорректировать под собственные потребности.

Задача:
необходимо получить содержимое файла с удаленного сервера (данные в xml)

Суть проблемы:
на предыдущем хостинге все работало при помощи SimpleXML

Люди добрые, не проходите мимо! Помогите слабоумному. Какие есть еще способы для получения содержимого файла с удаленного сервера? __________________
Помощь в написании контрольных, курсовых и дипломных работ здесь


Получить пользвателей удаленного сервера
Добрый день! Можно ли программным путем получить список windows пользователей удаленного сервера.

Получить данные из mySLQ с удаленного сервера
У меня на сайте есть база данных, подскажите как с ней работать? Можно пример? Нигде не нашел

Последняя возможность это fsockopen. Хотя раз cURL вырубили, то . скорее придётся общаться Вам с хостером.

Если вдруг кому понадобится, решил проблему при помощи следующей конструкции:

P.S. В данной конструкции локальный файл local-file.xml должен быть создан заранее, и иметь доступ на запись.

И опять нубский вопрос: как сделать так, что бы не было проверки на доступность файла для записи, в случае отсутствия файла он бы создавался, и главное - что бы файл очищался перед записью?

Добавлено через 22 минуты
Опять затупил, но искуплю свою вину и сам отвечу на свой вопрос:

Добавлено через 2 часа 1 минуту
Не совсем по теме, но возникла новая проблема..
На другом хостинге "For security reasons" запрещен exec(), и соответственно вышеупомянутая конструкция опять не работает. Зато на нем не запрещен fopen(). Попробовал сделать так:
Для вышеописанного случая Вам уже понадобится симулятор веб-браузера, вроде Snoopy.
Потому, что в первом посте я говорил о том, что в настройках сервера "allow_url_fopen=0", и по этому, URL в качестве имени фала в "file_get_contents()" использовать не получится.

Почему бы не использовать?

Потому, что в первом посте я говорил о том, что в настройках сервера "allow_url_fopen=0", и по этому, URL в качестве имени фала в "file_get_contents()" использовать не получится.

В .htaccess допиши

php_value allow_url_include on
php_value allow_url_fopen on

Warning: curl_exec() has been disabled for security reasons У вас очень странный хостер. Бегите от него, просто на всякий случай.

Ребята привет.
Интересует данная тема.
Перепровал массу варианта парсинга.
Но один сайт никак не хочет поддаваться, не хочет отдавать код.
Если сохраняю страницу ctrl + s - то все ок.
А если программными методами PHP - часть кода не отдает, там где наличие размеров. Даже wget пробовал. Нет.

Защита от парсинга стоит? Ничего понять не могу.

Загрузка файла с удаленного сервера
Нужно загрузить файл в временную папку и при загрузке писать загружено n из N мБ Как такое.


Как получить данные с БД или сделать дамп с удаленного сервера зная логин/пароль
Здравствуйте! Я полный ноль в базах данных, так что прошу меня простить если задаю глупый вопрос.

Получить содержимое файла (картинки)
здравствуйте, я ламер в ас и флеше, возникла такая задача: создать swf объект, который бы мог.

Получить содержимое заголовка PE - файла
Подскажите пожалуйста при каком открытии файла заполняются структуры, описывающие заголовок.

Читайте также: