Перевод текста на русский язык:
Лекция о включении файлов. Тема: уязвимости
Лектор: 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
для чтения системного пароля.
Вот некоторые распространённые местоположения файлов журналов:
/etc/httpd/logs/access.log
/var/log/httpd/access.log
D:\xampp\apache\logs\access.log
D:\xampp\apache\logs\error.log
C:\WINDOWS\system32\Lognames
%SystemDrive%\inetpub\logs\Lognames
<путь установки>/logs
/usr/local/nginx
, то /usr/local/nginx/logs
/etc/httpd/conf/httpd.conf
/etc/init.d/httpd
C:/Windows/system32/inetsrv/metabase.xml
C:\Windows\System32\inetsrv\config\applicationHost.config
При включённом удалённом доступе мы можем использовать псевдопротокол 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://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 )