Уязвимости типа php-include и директива allow_url_include

Hint: flag is not a frag: once you've got it, you can get one more...

//Старый мой пост, плавал на форумах…

Многие уязвимости типа php-include остаются нераскрученными из-за директивы allow_url_include=Off в php.ini. Так вот, эта директива распространяется на все обёртки, но было замечено, что это не касается ветки php 5.2.0.
Таким образом, обойти это ограничение при версии php 5.2.0 не составляет труда: достаточно воспользоваться обёрткой data (пример: data:;base64,PD9waHBpbmZvKCk7Pz4=) или php (пример: в инклуд-параметр прописать php://input, отправить post-запрос с произвольным кодом).

Наглядно убедить в том, что allow_url_include распространяется не на все обёртки можно в исходниках php (директория /streams/). Вот участок кода из memory.c (php 5.2.0):


708 php_stream_wrapper php_stream_rfc2397_wrapper = {
709 &php_stream_rfc2397_wops,
710 NULL,
711 0, /* is_url */
712 };

А вот тот же участок в 5.2.1:


745 php_stream_wrapper php_stream_rfc2397_wrapper = {
746 &php_stream_rfc2397_wops,
747 NULL,
748 1, /* is_url */
749 };

А теперь смотрим в исходник streams.c (там нижеследующий код одинаков вроде бы во всех версиях):


1605 if ((wrapperpp && (*wrapperpp)->is_url) && (!PG(allow_url_fopen) || ((options & STREAM_OPEN_FOR_INCLUDE) && !PG(allow_url_include))) ) {
1606 if (options & REPORT_ERRORS) {
1607 php_error_docref(NULL TSRMLS_CC, E_WARNING, "URL file-access is disabled in the server configuration");
1608 }
1609 return NULL;
1610 }