Skip to content

Latest commit

 

History

History
178 lines (123 loc) · 17.8 KB

01-Testing_Directory_Traversal_File_Include.md

File metadata and controls

178 lines (123 loc) · 17.8 KB
layout title tags
col-document
WSTG - Latest
WSTG

{% include breadcrumb.html %}

Тестирование включения файлов при обходе каталогов

ID
WSTG-ATHZ-01

Обзор

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

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

Привилегии назначаются в списках контроля доступа (англ.: Access Control Lists, ACL), которые определяют, какие пользователи или группы должны иметь возможность получать доступ, изменять или исполнять тот или иной файл на сервере. Эти механизмы предназначены для предотвращения доступа злоумышленников к чувствительным файлам (например, /etc/passwd на UNIX-подобных платформах) или для предотвращения исполнения системных команд.

Многие web-приложения используют скрипты на стороне сервера для включения различных типов файлов. Довольно часто этот метод используется для управления изображениями, шаблонами, загрузкой статичных текстов и т.д. К сожалению, если входные параметры (например, в формах, в cookie) должным образом не контролируются, то такие приложения уязвимы.

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

В данном Руководстве будут рассматриваться только угрозы безопасности, связанные с web-приложениями, а не угрозы для web-серверов (например, печально известный escape-код %5c в Microsoft IIS). Дополнительные материалы для заинтересованных читателей будут представлены ниже в разделе Ссылки.

Этот тип атаки также известен как атака точка-точка-слэш (англ.: dot-dot-slash) (../), обход каталогов (англ.: directory traversal), восхождение по каталогам (англ.: directory climbing), или возврат (англ.: backtracking).

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

  1. Перебор входных векторов (анализ каждого входного вектора)
  2. Перебор методов тестирования (анализ каждого метода атаки, используемого злоумышленником для эксплуатации уязвимости)

Задачи тестирования

  • Определить точки инъекции, доступные при обходе пути.
  • Оценить методы обхода и определить глубину обхода пути.

Как тестировать

Тестирование методом чёрного ящика

Перебор входных векторов

Чтобы определить, какая часть приложения уязвима для обхода контроля входных данных, необходимо проанализировать все части приложения, которые принимают контент от пользователя. Сюда входят HTTP-запросы GET и POST, а также загрузка файлов и HTML-формы.

Вот несколько примеров вопросов, на которые необходимо ответить на этом этапе:

  • Есть ли в запросах параметры, которые можно использовать для операций с файлами?
  • Встречаются ли необычные расширения файлов?
  • Есть ли интересные имена переменных?
    • http://example.com/getUserProfile.jsp?item=ikki.html
    • http://example.com/index.php?file=content
    • http://example.com/main.cgi?home=index.htm
  • Встречаются ли cookie, используемые web-приложением для динамического создания страниц или шаблонов?
    • Cookie: ID=d9ccd3f4f9f18cc1:TM=2166255468:LM=1162655568:S=3cFpqbJgMSSPKVMV:TEMPLATE=flower
    • Cookie: USER=1826cc8f:PSTYLE=GreenDotRed

Методы тестирования

Следующим этапом тестирования является анализ функций контроля входных данных, имеющихся в web-приложении. В предыдущем примере, динамическая страница с именем getUserProfile.jsp загружает статичную информацию из файла и показывает её содержимое пользователю. Злоумышленник может вставить вредоносную строку ../../../../etc/passwd, чтобы посмотреть файл со всеми хэшированными паролями системы Linux/UNIX. Очевидно, что такого рода атака возможна только в случае сбоя точки контроля; в соответствии с привилегиями файловой системы само web-приложение должно иметь возможность читать этот файл.

Примечание: Чтобы успешно протестировать эту уязвимость, необходимо иметь представление о тестируемой системе и местоположении запрашиваемых файлов. Не имеет смысла запрашивать /etc/passwd с web-сервера IIS.

http://example.com/getUserProfile.jsp?item=../../../../etc/passwd

Другой распространённый пример — включение контента из внешнего источника:

http://example.com/index.php?file=http://www.owasp.org/malicioustxt

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

Больше полезных нагрузок с включением файлов можно найти на PayloadsAllTheThings — File Inclusion

Важно отметить, что разные операционные системы используют разные разделители для пути:

  • Unix-подобные системы:
    • корневой каталог: /
    • разделитель каталогов: /
  • Windows:
    • корневой каталог: <буква названия диска>:
    • разделитель каталогов: \ или /
  • Классическая macOS:
    • корневой каталог: <буква названия диска>:
    • разделитель каталогов: :

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

Способы кодировки и готовые к использованию полезные нагрузки для обхода каталога можно найти на PayloadsAllTheThings — Directory Traversal.

Особенности Windows

  • Командная строка Windows: добавление любого из следующих параметров к пути не приводит к изменениям в функциях:
    • Угловые скобки < и > в конце пути
    • Двойные кавычки (правильно закрытые) в конце пути
    • Сторонние маркеры текущего каталога, такие как ./ или .\\
    • Сторонние маркеры родительского каталога с произвольными элементами, которые могут существовать или не существовать:
      • file.txt
      • file.txt...
      • file.txt<spaces>
      • file.txt""""
      • file.txt<<<>>><
      • ./././file.txt
      • nonexistent/../file.txt
  • Windows API: при использовании в любой команде оболочки или вызове API, где в качестве имени файла берётся строка, отбрасываются:
    • точки
    • пробелы.
  • Пути к файлам в формате Windows UNC (Universal Naming Convention, англ.: универсальное соглашение о наименовании): используются для ссылок на ресурсы в общих папках SMB. Иногда приложение может ссылаться на удалённо расположенные файлы посредством UNC-пути. Если это так, сервер Windows SMB может отправить хранимые им учётные данные злоумышленнику. Такие пути также могут использоваться с перенаправляющим на себя IP-адресом или доменным именем, чтобы обойти фильтры, или использоваться для доступа к файлам на общих ресурсах SMB, недоступным злоумышленнику, но доступным с web-сервера.
    • \\server_or_ip\path\to\file.abc
    • \\?\server_or_ip\path\to\file.abc
  • Пространство имён устройств Windows NT: используется для ссылки на пространство имен устройств Windows. Некоторые ссылки разрешат доступ к файловым системам по другому пути.
    • Может быть тождественно букве диска, например, c:\, или даже тому (логическому разделу) диска без присвоенной буквы: \\.\GLOBALROOT\Device\HarddiskVolume1\
    • Относится к первому дисководу на машине: \\.\CdRom0\

Тестирование методом серого ящика

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

  • PHP: include(), include_once(), require(), require_once(), fopen(), readfile(), ...
  • JSP/Servlet: java.io.File(), java.io.FileReader(), ...
  • ASP: include file, include virtual, ...

Найти недостатки обхода пути в приложениях с открытым исходным кодом, опубликованных в Интернете можно посредством онлайн-систем поиска кода (например, Searchcode).

Для PHP можно использовать следующее регулярное выражение:

(include|require)(_once)?\s*['"(]?\s*\$_(GET|POST|COOKIE)

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

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

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

Рассмотрим web-приложение со следующими командами:

filename = Request.QueryString("file");
Replace(filename, "/","\");
Replace(filename, "..\","");

Тестирование на наличие дефекта здесь достигается посредством строк:

file=....//....//boot.ini
file=....\\....\\boot.ini
file= ..\..\boot.ini

Инструменты

Ссылки

Технические руководства