1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/wizardforcel-mst-sec-lecture-notes

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
В этом репозитории не указан файл с открытой лицензией (LICENSE). При использовании обратитесь к конкретному описанию проекта и его зависимостям в коде.
Клонировать/Скачать
漏洞篇 文件包含.md 10 КБ
Копировать Редактировать Web IDE Исходные данные Просмотреть построчно История
gitlife-traslator Отправлено 27.11.2024 00:48 d9e190e

Перевод текста на русский язык:

Лекция о включении файлов. Тема: уязвимости

Лектор: gh0stkey (https://www.zhihu.com/people/gh0stkey/answers)

Автор: Летающий дракон (https://github.com/)

Лицензия: CC BY-NC-SA 4.0 (http://creativecommons.org/licenses/by-nc-sa/4.0/)

Принцип работы

Включение файла — это процесс, при котором файл включается в другой файл и выполняется. Оно может быть локальным или удалённым. Локальное включение означает включение файла, расположенного на локальном диске, с указанием имени файла в виде относительного или абсолютного пути. Удалённое включение означает включение файла из интернета с использованием URL в качестве имени файла.

Локальное включение

Например, у нас есть файл test.txt, и мы хотим просто проверить его с помощью phpinfo:

<?php phpinfo();?>

Затем мы создаём файл fileinclude.php в том же каталоге:

<?php
$file=@$_GET['file'];
if($file){
    echo "<center>File:".$file."<br/>Result:</center>";
    include $file;
}

Первая строка кода получает значение параметра file из URL. Затем, со второй по четвёртую строку, проверяется, не является ли значение $file пустым. Если нет, то оно выводится и используется как имя файла для включения.

Мы размещаем этот код на сервере localhost, а затем переходим по адресу http://localhost/fileinclude.php?file=test.txt. В результате мы увидим вывод команды phpinfo.

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

Обратите внимание, что если включённый файл не содержит тегов PHP, он будет отображаться как HTML-контент. Например, если мы включим файл top100.txt:

Удалённое включение

Чтобы продемонстрировать удалённое включение, нам нужно установить параметр allow_url_include в конфигурации PHP в положение on, а затем перезапустить PHP. Расположение файла конфигурации PHP можно найти в выводе команды phpinfo, выполнив поиск по ключевому слову ini:

У меня это C:\php-5.5.10\php.ini, но у вас расположение может отличаться. Открыв файл, ищем строку allow_url_include. Если она установлена в Off, меняем её на On:

; Whether to allow include/require to open URLs (like http:// or ftp://) as files.
; http://php.net/allow-url-include
allow_url_include = On

Нам нужно изменить значение параметра file на http://localhost/text.txt, после чего мы получим тот же результат.

Методы обхода защиты

Обрезка

Некоторые программы добавляют к включённому контенту дополнительные символы, например, если файл fileinclude.php выглядит так:

<?php
$file=@$_GET['file'];
if($file){
    $file .= '.php';
    echo "<center>File:".$file."<br/>Result:</center>";
    include $file;
}

Он добавляет расширение .php, что означает, что если мы передадим file=test, всё будет работать нормально, но если мы передадим file=test.txt или test.txt.php, включение не удастся. Как же нам поступить?

Если версия PHP меньше 5.3 и magic_quotes_gpc отключена, мы можем использовать %00 для обрезки. Передав file=test.txt%00, мы сможем успешно включить файл.

Перебор путей
  • ./ (или опущено): текущий каталог
  • ../: родительский каталог
  • /: корневой каталог (в Windows это корень текущего диска)
  • ~/: домашний каталог пользователя

Например, в Linux мы можем использовать file=/etc/passwd для чтения системного пароля.

Вот некоторые распространённые местоположения файлов журналов:

  • Журналы Apache в Linux по умолчанию:
    • /etc/httpd/logs/access.log
    • /var/log/httpd/access.log
  • Журналы Apache на Win2003 по умолчанию:
    • D:\xampp\apache\logs\access.log
    • D:\xampp\apache\logs\error.log
  • Журналы IIS6.0 на Win2003 по умолчанию:
    • C:\WINDOWS\system32\Lognames
  • Журналы IIS7.0 на Win2003 по умолчанию:
    • %SystemDrive%\inetpub\logs\Lognames
  • Журналы nginx:
    • <путь установки>/logs
    • Если путь установки /usr/local/nginx, то /usr/local/nginx/logs
  • Файлы конфигурации Apache+linux по умолчанию:
    • /etc/httpd/conf/httpd.conf
    • /etc/init.d/httpd
  • Файлы конфигурации IIS6.0+win2003:
    • C:/Windows/system32/inetsrv/metabase.xml
  • Файлы конфигурации IIS7.0+WIN:
    • C:\Windows\System32\inetsrv\config\applicationHost.config
PHP псевдопротокол

При включённом удалённом доступе мы можем использовать псевдопротокол php:// для доступа к файлам. Например, php://filter/resource=test.txt позволяет прочитать тот же файл.

Также можно добавить фильтр, который будет отображать содержимое файла в формате BASE64. Для этого используем php://filter/read=convert.base64-encode/resource=test.txt. Если в файле есть непечатаемые символы или мы хотим получить содержимое кода, этот метод позволит нам это сделать, после чего можно будет декодировать данные.

php://input позволяет читать исходный HTTP-запрос. Если мы установим file в значение php://input, а в HTTP-запросе передадим PHP-код, такой как <?php phpinfo();?>, код будет выполнен.

Data URI

Формат Data URI — data://text/plain;base64,<base64>, также требует удалённого доступа. Сначала мы кодируем предложение в base64, получая PD9waHAgcGhwaW5mbygpOz8+, затем устанавливаем file в data://text/plain;base64,PD9waHAgcGhwaW5mbygpOz8%2b (обратите внимание на URL-кодирование), и выполняем код.

Поиск уязвимостей

Сначала проанализируйте URL, чтобы определить, связан ли он с файлами, например www.test.com/xxx.php?file=yyy. Любые чувствительные имена, связанные с файлами, могут стать целью поиска уязвимостей.

Использование уязвимости

Обнаружив уязвимость локального включения, сначала найдите точку загрузки, такую как функция загрузки пользовательских аватаров. Затем мы можем создать текстовый файл с содержимым <?php phpinfo();?> и назвать его xxx.jpg.

После этого мы загружаем xxx.jpg и получаем его местоположение, предположительно /upload/xxx.jpg. Затем мы устанавливаем значение параметра file равным этому местоположению. Используя пример кода, URL будет выглядеть так: http://localhost/fileinclude.php?file=/upload/xxx.jpg.

Если мы изменим содержимое xxx.jpg, чтобы оно содержало фразу, например «нож», мы сможем использовать нож для атаки.

Опубликовать ( 0 )

Вы можете оставить комментарий после Вход в систему

1
https://api.gitlife.ru/oschina-mirror/wizardforcel-mst-sec-lecture-notes.git
git@api.gitlife.ru:oschina-mirror/wizardforcel-mst-sec-lecture-notes.git
oschina-mirror
wizardforcel-mst-sec-lecture-notes
wizardforcel-mst-sec-lecture-notes
master