Включая полное имя файла

Обновлено: 04.07.2024

Это пример страницы проекта или главы.

Описание

Уязвимости полного раскрытия пути (FPD) позволяют злоумышленнику увидеть путь к корневому каталогу/файлу. например: /home/omg/htdocs/file/. Некоторые уязвимости, такие как использование запроса load_file() (внутри SQL-инъекции) для просмотра исходного кода страницы, требуют от злоумышленника полного пути к файлу, который он хочет просмотреть.

Факторы риска

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

В сочетании, скажем, с незащищенным использованием PHP-функции file_get_contents злоумышленник получает возможность украсть файлы конфигурации.

Исходный код index.php:

Утечка исходного кода config.php:

Не обращая внимания на приведенный выше пример, FPD также можно использовать для выявления лежащей в основе операционной системы путем наблюдения за путями к файлам. Например, Windows всегда начинается с буквы диска, например; C:\, в то время как операционные системы на основе Unix, как правило, начинаются с одной косой черты.

*NIX:

Майкрософт Windows:

КВП может раскрыть намного больше, чем люди обычно подозревают. Два приведенных выше примера также показывают имена пользователей в операционных системах; «Алиса» и «Боб». Имена пользователей, конечно, являются важной частью учетных данных. Злоумышленники могут использовать их по-разному: от брутфорса по различным протоколам (SSH, Telnet, RDP, FTP…) до запуска эксплойтов, требующих рабочих имен пользователей.

Примеры

Пустой массив

Если у нас есть сайт, использующий такой метод запроса страницы:

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

Это делает страницу недействующей и выдает ошибку:

Файл cookie нулевого сеанса

Еще один популярный и очень надежный метод создания ошибок, содержащих FPD, – создание для страницы пустого сеанса с помощью JavaScript-инъекций. Простая инъекция с использованием этого метода будет выглядеть примерно так:

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

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

Недействительный файл cookie сеанса

В дополнение к нулевому файлу cookie сеанса очень длинный сеанс также может привести к ошибке, содержащей FPD. Это также может быть выполнено с помощью внедрения JavaScript следующим образом:

Просто установив для файла cookie PHPSESSID значение 129 байт или более, PHP может выдать предупреждение.

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

Оба варианта приводят к следующему.

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

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

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

Вышеуказанные три проверки можно выполнить с помощью инструмента inspathx.

Связанные агенты угроз

Связанные атаки

Связанные уязвимости

Связанные элементы управления

Ссылки

НОТОК

Фонд OWASP ® работает над повышением безопасности программного обеспечения с помощью своих проектов программного обеспечения с открытым исходным кодом под руководством сообщества, сотен отделений по всему миру, десятков тысяч членов и проведения местных и глобальных конференций.

Важные ссылки сообщества

Предстоящие глобальные мероприятия OWASP

Корпоративные сторонники

OWASP, Open Web Application Security Project и Global AppSec являются зарегистрированными товарными знаками, а AppSec Days, AppSec California, AppSec Cali, SnowFROC, LASCON и логотип OWASP являются товарными знаками OWASP Foundation, Inc. Если не указано иное, все содержимое на сайте Creative Commons Attribution-ShareAlike v4.0 и предоставляется без гарантии обслуживания или точности. Для получения дополнительной информации см. наш Общий отказ от ответственности. OWASP не одобряет и не рекомендует коммерческие продукты или услуги, что позволяет нашему сообществу оставаться нейтральным в отношении поставщиков, руководствуясь коллективным мнением лучших умов в области безопасности программного обеспечения во всем мире. Copyright 2022, OWASP Foundation, Inc.

(Я знаю, что <> обычно используется для внешнего, но я нахожу его более понятным)

Как это сделать из любой точки проекта?

Использование относительного пути для файлов, которые всегда перемещаются вместе, является просто здравым смыслом. И для них вы должны использовать "".

3 ответа 3

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

Например, если ваш заголовок находится в:

затем вам нужно включить (при условии, что компилятор POSIX-совместимый; AFAICR, даже MSVC использует /I как аналог -I ):

как один из параметров компилятора. Вы можете использовать этот путь из любой точки вашего проекта, так как он абсолютный. Вам просто нужен определенный способ, чтобы ваша система сборки знала, каким должен быть параметр, чтобы при его перемещении в /home/someone/src/ у вас был только один параметр для изменения.

Укажите компилятор вне Windows, если это не -I ? Я добавил оговорку к ответу и упомянул, что, по моему мнению, Windows использует /I, поскольку параметры там начинаются с / вместо - .

Я еще не встречал компилятор, который не использует -I , но, конечно, возможно, есть компиляторы, которые этого не делают. Даже компиляторы MS принимают -I (даже если они "предпочитают" /I)

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

@πάνταῥεῖ — ОК; и вы не собираетесь приводить пример такой экзотической цепочки инструментов, поэтому мы никогда не узнаем, о чем вы думаете, если только мы не столкнемся с этим? С одной стороны, я не очень беспокоюсь; Я рассмотрел подавляющее большинство практических случаев. OTOH, мне нравится собирать эзотерические сведения, такие как знания о системах, где параметры компилятора совершенно чокнутые по сравнению с обычными.

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

Важно отметить, что в ответе, на который я ссылался выше, объясняется, что включения «<>» ЗАВИСЯТ ОТ РЕАЛИЗАЦИИ, поэтому нам действительно нужно знать, какой компилятор вы используете, чтобы сказать вам, можете ли вы или можете не делай этого.

Для этого можно просто использовать параметр include directorys вашего текущего компилятора (обычно -I).

Также обратите внимание, что использование двойных кавычек "" просто добавляет запасной вариант для стандартных заголовков компилятора. Файлы, включенные с помощью <> , гарантированно будут искать файлы только из стандартных заголовков компилятора.

Не тот ответ, который вы ищете? Просмотрите другие вопросы с меткой c++ include include-path или задайте свой вопрос.

Связано

Связанные

Горячие вопросы о сети

Чтобы подписаться на этот RSS-канал, скопируйте и вставьте этот URL-адрес в программу для чтения RSS.

дизайн сайта / логотип © 2022 Stack Exchange Inc; вклады пользователей под лицензией cc by-sa. версия 2022.3.23.41750

Члены многих типов в пространстве имен System.IO включают параметр пути, который позволяет указать абсолютный или относительный путь к ресурсу файловой системы. Затем этот путь передается API-интерфейсам файловой системы Windows. В этом разделе обсуждаются форматы путей к файлам, которые можно использовать в системах Windows.

Традиционные пути DOS

Стандартный путь DOS может состоять из трех компонентов:

  • Буква тома или диска, за которой следует разделитель томов ( : ).
  • Имя каталога. Символ разделителя каталогов разделяет подкаталоги во вложенной иерархии каталогов.
  • Необязательное имя файла. Символ разделителя каталогов разделяет путь к файлу и имя файла.

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

< td>Абсолютный путь от корня текущего диска.
Путь Описание
C:\Documents\Newsletters\Summer2018 .pdf Абсолютный путь к файлу от корня диска C: .
\Program Files\Custom Utilities\StringFinder.exe
2018\January.xlsx Относительный путь к файлу в подкаталоге текущий каталог.
..\Publications\TravelBrochure.pdf Относительный путь к файлу в каталоге, начиная с текущего каталога.
C:\Projects\apilibrary\apilibrary.sln Абсолютный путь к файлу из корня диска C: .
C:Projects\apilibrary\apilibrary.sln Относительный путь от текущего каталога диска C:.

Обратите внимание на разницу между двумя последними путями. Оба указывают необязательный спецификатор тома ( C: в обоих случаях), но первый начинается с корня указанного тома, а второй — нет. В результате первый — это абсолютный путь от корневого каталога диска C:, а второй — относительный путь от текущего каталога диска C:. Использование второй формы вместо первой является частым источником ошибок, связанных с путями к файлам Windows.

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

В следующем примере показана разница между абсолютным и относительным путями. Предполагается, что каталог D:\FY2018\ существует и что вы не задали текущий каталог для D:\ из командной строки перед запуском примера.

Если вы хотите, чтобы комментарии к коду были переведены на языки, отличные от английского, сообщите нам об этом в этом обсуждении на GitHub.

UNC-пути

Пути универсального соглашения об именах (UNC), которые используются для доступа к сетевым ресурсам, имеют следующий формат:

  • Имя сервера или хоста, перед которым стоит \\ . Имя сервера может быть именем компьютера NetBIOS или IP/FQDN-адресом (поддерживаются как IPv4, так и v6).
  • Имя общего ресурса, которое отделяется от имени хоста символом \ . Вместе имя сервера и общего ресурса составляют том.
  • Имя каталога. Символ разделителя каталогов разделяет подкаталоги во вложенной иерархии каталогов.
  • Необязательное имя файла. Символ разделителя каталогов разделяет путь к файлу и имя файла.

Ниже приведены некоторые примеры путей UNC:

Путь Описание
\\system07\C$\< /td> Корневой каталог диска C: в system07 .
\\Server2\Share\Test\Foo.txt Foo.txt в тестовом каталоге тома \\Server2\Share.

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

Пути устройств DOS

Операционная система Windows имеет единую объектную модель, которая указывает на все ресурсы, включая файлы. Эти пути к объектам доступны из окна консоли и отображаются на уровне Win32 через специальную папку символических ссылок, с которыми сопоставляются устаревшие пути DOS и UNC. Доступ к этой специальной папке осуществляется с помощью синтаксиса пути устройства DOS, который может быть одним из следующих:

Помимо идентификации диска по его букве, вы можете идентифицировать том по его GUID. Это принимает форму:

Путь устройства DOS состоит из следующих компонентов:

Спецификатор пути к устройству ( \\.\ или \\?\ ), который идентифицирует путь как путь к устройству DOS.

Символическая ссылка на «реальный» объект устройства (C: в случае имени диска или Volume в случае GUID тома).

Первый сегмент пути устройства DOS после спецификатора пути устройства идентифицирует том или диск. (Например, \\?\C:\ и \\.\BootPartition\ .)

Существует специальная ссылка для UNC, которая, что неудивительно, называется UNC . Например:

Для UNC устройств часть сервера/общего ресурса образует том. Например, в \\?\server1\e:\utilities\\filecomparer\ часть server/share — это server1\utilities . Это важно при вызове такого метода, как Path.GetFullPath(String, String) с относительными сегментами каталога; невозможно пройти мимо тома.

Пути устройств DOS являются полными по определению и не могут начинаться с сегмента относительного каталога ( . или .. ). Текущие каталоги никогда не входят в их использование.

Пример: способы ссылки на один и тот же файл

В следующем примере показаны некоторые способы обращения к файлу при использовании API в пространстве имен System.IO. В примере создается экземпляр объекта FileInfo и используются его свойства Name и Length для отображения имени файла и длины файла.

Нормализация пути

Почти все пути, передаваемые API Windows, нормализованы. Во время нормализации Windows выполняет следующие шаги:

  • Определяет путь.
  • Применяет текущий каталог к ​​частично определенным (относительным) путям.
  • Канонизирует разделители компонентов и каталогов.
  • Вычисляет относительные компоненты каталога ( . для текущего каталога и .. для родительского каталога).
  • Удаляет определенные символы.

Эта нормализация происходит неявно, но вы можете сделать это явно, вызвав метод Path.GetFullPath, который заключает в себе вызов функции GetFullPathName(). Вы также можете вызвать функцию Windows GetFullPathName() напрямую, используя P/Invoke.

Определить путь

Первым шагом в нормализации пути является определение типа пути. Пути относятся к одной из нескольких категорий:

  • Это пути к устройствам; то есть они начинаются с двух разделителей и вопросительного знака или точки ( \\? или \\. ).
  • Это пути UNC; то есть они начинаются с двух разделителей без знака вопроса или точки.
  • Это полностью определенные пути DOS; то есть они начинаются с буквы диска, разделителя тома и разделителя компонентов ( C:\ ).
  • Они обозначают устаревшее устройство ( CON , LPT1 ).
  • Они относятся к корню текущего диска; то есть они начинаются с одного разделителя компонентов ( \ ).
  • Они относятся к текущему каталогу указанного диска; то есть они начинаются с буквы диска, разделителя томов и без разделителя компонентов ( C: ).
  • Они относятся к текущему каталогу; то есть они начинаются с чего-то еще ( temp\testfile.txt ).

Тип пути определяет, применяется ли каким-либо образом текущий каталог. Он также определяет, что является «корнем» пути.

Обработка устаревших устройств

Если путь представляет собой устаревшее устройство DOS, такое как CON , COM1 или LPT1 , он преобразуется в путь устройства путем добавления \\.\ и возврата.

Путь, начинающийся с имени устаревшего устройства, всегда интерпретируется методом Path.GetFullPath(String) как устаревшее устройство. Например, путь устройства DOS для CON.TXT — \\.\CON , а путь устройства DOS для COM1.TXT\file1.txt — \\.\COM1 .

Применить текущий каталог

Если путь не указан полностью, Windows применяет к нему текущий каталог. К UNC и путям устройств не применяется текущий каталог. Не работает и полный диск с разделителем C:\ .

Если путь начинается с одного разделителя компонентов, применяется диск из текущего каталога. Например, если путь к файлу — \utilities, а текущий каталог — C:\temp\ , нормализация дает C:\utilities .

Если путь начинается с буквы диска, разделителя томов и без разделителя компонентов, применяется последний текущий каталог, заданный в командной оболочке для указанного диска. Если последний текущий каталог не был установлен, применяется только диск. Например, если путь к файлу — D:sources, текущий каталог — C:\Documents\, а последний текущий каталог на диске D: — D:\sources\, результатом будет D:\sources\sources. Эти «относительные» пути являются распространенным источником логических ошибок программ и сценариев. Предполагать, что путь, начинающийся с буквы и двоеточия, не является относительным, явно неверно.

Если путь начинается не с разделителя, применяются текущий диск и текущий каталог. Например, если путь — filecompare, а текущий каталог — C:\utilities\ , результатом будет C:\utilities\filecompare\ .

Канонизировать разделители

Все прямые косые черты ( / ) преобразуются в стандартный разделитель Windows — обратную косую черту ( \ ). Если они присутствуют, ряд косых черт, следующих за первыми двумя косыми чертами, сворачивается в одну косую черту.

Оценить относительные компоненты

По мере обработки пути оцениваются любые компоненты или сегменты, состоящие из одной или двух точек ( . или .. ):

На один период текущий сегмент удаляется, так как он ссылается на текущий каталог.

Для двойной точки текущий сегмент и родительский сегмент удаляются, поскольку двойная точка относится к родительскому каталогу.

Родительские каталоги удаляются только в том случае, если они не находятся за корнем пути. Корень пути зависит от типа пути. Это диск ( C:\ ) для путей DOS, сервер/общий ресурс для UNC ( \\Server\Share ) и префикс пути к устройству для путей к устройствам ( \\?\ или \\.\ ).

Обрезать символы

Помимо удаленных ранее серий разделителей и относительных сегментов, при нормализации удаляются некоторые дополнительные символы:

Если сегмент заканчивается одним периодом, этот период удаляется. (Сегмент из одной или двух точек нормализуется на предыдущем шаге. Сегмент из трех и более точек не нормализуется и фактически является допустимым именем файла/каталога.)

Если путь не заканчивается разделителем, все завершающие точки и пробелы (U+0020) удаляются. Если последний сегмент представляет собой просто одинарную или двойную точку, он подпадает под действие приведенного выше правила относительных компонентов.

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

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

Пропустить нормализацию

Обычно любой путь, переданный API Windows, (фактически) передается функции GetFullPathName и нормализуется. Есть одно важное исключение: путь к устройству начинается со знака вопроса, а не с точки. Если путь не начинается точно с \\?\ (обратите внимание на использование канонической обратной косой черты), он нормализуется.

Почему вы хотите пропустить нормализацию? Есть три основные причины:

Чтобы получить доступ к путям, которые обычно недоступны, но разрешены. Файл или каталог, называемый скрытым. , например, невозможно получить доступ каким-либо другим способом.

Чтобы повысить производительность, пропустив нормализацию, если она уже была выполнена.

Пропуск проверки нормализации и максимального пути — единственное различие между двумя синтаксисами пути к устройству; в остальном они идентичны. Будьте осторожны, пропуская нормализацию, так как вы можете легко создать пути, с которыми "обычным" приложениям будет сложно работать.

Пути, начинающиеся с \\?\, по-прежнему нормализуются, если вы явно передаете их функции GetFullPathName.

Вы можете передавать пути, содержащие более MAX_PATH символов, в GetFullPathName без \\?\ . Он поддерживает пути произвольной длины вплоть до максимального размера строки, который может обрабатывать Windows.

Case и файловая система Windows

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

Файловая система хранит и упорядочивает файлы на каком-либо носителе, как правило, на одном или нескольких жестких дисках, таким образом, чтобы их можно было легко извлечь. Большинство используемых сегодня файловых систем хранят файлы в древовидной (или иерархической) структуре. На вершине дерева находится один (или несколько) корневых узлов. В корневом узле находятся файлы и каталоги (папки в Microsoft Windows). Каждый каталог может содержать файлы и подкаталоги, которые, в свою очередь, могут содержать файлы и подкаталоги и т. д., потенциально до почти безграничной глубины.

В этом разделе рассматриваются следующие вопросы:

Что такое путь?

На следующем рисунке показано примерное дерево каталогов, содержащее один корневой узел. Microsoft Windows поддерживает несколько корневых узлов. Каждый корневой узел сопоставляется с томом, например C:\ или D:\ . ОС Solaris поддерживает один корневой узел, который обозначается косой чертой / .

Пример структуры каталога

Файл идентифицируется по его пути в файловой системе, начиная с корневого узла. Например, файл statusReport на предыдущем рисунке описывается следующей нотацией в ОС Solaris:

В Microsoft Windows отчет о состоянии описывается следующими обозначениями:

Символ, используемый для разделения имен каталогов (также называемый разделителем), зависит от файловой системы: ОС Solaris использует прямую косую черту ( / ), а Microsoft Windows использует обратную косую черту ( \).

Относительно или абсолютно?

Путь может быть относительным или абсолютным. Абсолютный путь всегда содержит корневой элемент и полный список каталогов, необходимых для поиска файла. Например, /home/sally/statusReport — это абсолютный путь. Вся информация, необходимая для поиска файла, содержится в строке пути.

Для доступа к файлу относительный путь необходимо объединить с другим путем. Например, joe/foo — это относительный путь. Без дополнительной информации программа не сможет надежно найти каталог joe/foo в файловой системе.

Символические ссылки

Объекты файловой системы чаще всего представляют собой каталоги или файлы. С этими предметами знаком каждый. Но некоторые файловые системы также поддерживают символические ссылки. Символическая ссылка также называется символической ссылкой или мягкой ссылкой.

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

На следующем рисунке logFile кажется пользователю обычным файлом, но на самом деле это символическая ссылка на каталог dir/logs/HomeLogFile . HomeLogFile является целью ссылки.

Пример символической ссылки.

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

Фраза разрешение ссылки означает замену символической ссылки фактическим местоположением в файловой системе. В этом примере разрешение logFile дает dir/logs/HomeLogFile .

В реальных сценариях большинство файловых систем широко используют символические ссылки. Иногда небрежно созданная символическая ссылка может привести к циклической ссылке. Циклическая ссылка возникает, когда цель ссылки указывает на исходную ссылку. Циклическая ссылка может быть косвенной: каталог a указывает на каталог b, который указывает на каталог c, содержащий подкаталог, указывающий обратно на каталог a. Циклические ссылки могут вызвать хаос, когда программа рекурсивно перемещается по структуре каталогов. Однако этот сценарий был учтен и не приведет к бесконечному циклу вашей программы.

На следующей странице обсуждается сердцевина файлового ввода-вывода в языке программирования Java — класс Path.

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