На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Модераторы: Serafim, fatalist
Закрыто Soul :) 17-10-2007: По просьбе автора
  
  • закрыта
> проверка данных при использовании функции getimagesize()
    скажите подалуйста, можно с примером:) ну закачал ко мне юзер такую gif, а дальше то что? все равно апач отправит клиенту html, с самим то изображением не работают. Не пойму, где подвох... Выполнить скрипт тоже не получится, ведь служебная инфа в начале файла отобъет все желание у интепритатора, да и можно настроить пхп чтоб он из этой папки ничего не выполнял...

    Эта тема была разделена из темы "Что-то вроде bug report"
      Цитата antonn @
      Выполнить скрипт тоже не получится, ведь служебная инфа в начале файла отобъет все желание у интепритатора
      Проверял? :rolleyes: Нисколько не отобъет, читай внимательней.
      Цитата antonn @
      можно настроить пхп чтоб он из этой папки ничего не выполнял...
      Много чего настроить можно, например проверку расширений, об этом и говорится, что нужны дополнительные средства защиты.
      Цитата antonn @
      все равно апач отправит клиенту html, с самим то изображением не работают.
      Причем тут хтмл, будет запрос на картинку, выполнится код и всего то.
        Pr0[)!9Y
        так ведь пхп выполняет код в .php, а остальные расширения отдает как текст (ну смотря что поставить). вот это то я проверял, потому и спрашиваю, где бага то...

        Цитата
        Причем тут хтмл, будет запрос на картинку, выполнится код и всего то.

        запрос на картинку будет у апача, чего бы он отдал файл на выполнение пхп? заголовок "картиночный", расширение тоже...
          Цитата Pr0[)!9Y @
          Опасность заключается в том, что проверка загруженных графических файлов на основе одной лишь функции getimagesize позволяет закачать любой PHP файл.
          Расширение надо проверять, о чем и вся тема, а закачать можно любой файл.
            расширение говорит лишь о том, какую программу запускать при двойном клике на иконке файла.
            можно при закачке проверять на вшивость картинки:)
            ExpandedWrap disabled
              function verify_image($file) {
                  $txt = html_entity_decode(file_get_contents($file), ENT_QUOTES);
                  $image_safe = true;
                  if (preg_match("#&\#x([0-9a-f]+);*#i", $txt)) $image_safe = false;
                  if (preg_match('#&\#([0-9]+);*#i', $txt)) $image_safe = false;
                  if (preg_match("#([a-z]*)=([\`\'\"]*)script:#iU", $txt)) $image_safe = false;
                  if (preg_match("#([a-z]*)=([\`\'\"]*)javascript:#iU", $txt)) $image_safe = false;
                  if (preg_match("#([a-z]*)=([\'\"]*)vbscript:#iU", $txt)) $image_safe = false;
                  if (preg_match("#(<[^>]+)style=([\`\'\"]*).*expression\([^>]*>#iU", $txt)) $image_safe = false;
                  if (preg_match("#(<[^>]+)style=([\`\'\"]*).*behaviour\([^>]*>#iU", $txt)) $image_safe = false;
                  if (preg_match("#</*(applet|link|style|script|iframe|frame|frameset)[^>]*>#i", $txt)) $image_safe = false;
                  return $image_safe;
              }

            (с) ПХП-Фьюжн :)
              Товарищи модеры, почистите все наверно.

              antonn, чего ты доказываешь непонятно? Мы об одном и том же говорим. Да можно(и нужно) проверять расширения, никто этого не отрицает. Все вышесказанное обозначает что функции getimagesize недостаточно для проверки входных данных, и не более. Что ты доказываешь? Надеюсь все почистят, с вопросами обращайся в приват. Хватит тему засорять.
                Цитата
                Что ты доказываешь?

                Я предлагаю. Там чуть выше поста есть немножко кода, можно пообсуждать его, на предмет проверки вшивости картики в контексте недостаточности проверки функцией getimagesize() и расширения закачиваемого файла...

                ЗЫ а вообще я просил объяснить, в чем хак заключался, и, если честно, так и не понял...
                Сообщение отредактировано: antonn -
                  Цитата antonn @
                  а вообще я просил объяснить, в чем хак заключался, и, если честно, так и не понял...
                  В том, что залить могут ЛЮБОЙ файл, и даже с расширением PHP. Естесственно, при проверке такой "картинки" получим в худшем случае дефейс.
                  Я бы всё же сказал, что уязвимость не в getimagesize (она выполняет именно то, чего от неё добиваются) - уязвимость в головах. Находятся идиоты, которые делают include $image вместо вывода банальной ссылки на картинку - объявим функцию include уязвимой?
                  Цитата antonn @
                  Там чуть выше поста есть немножко кода, можно пообсуждать его, на предмет проверки вшивости картики в контексте недостаточности проверки функцией getimagesize() и расширения закачиваемого файла...
                  Функция - бред воспалённого разума.

                  Добавлено
                  Цитата Pr0[)!9Y @
                  Мы об одном и том же говорим.
                  Да нифига не об одном и том же.
                  Цитата Pr0[)!9Y @
                  Да можно(и нужно) проверять расширения, никто этого не отрицает.
                  Отрицает он это или нет, но приведённый им код никакого отношения к проверке расширения не имеет.
                    ИМХО, если работать на ПХП - то лучшего для работы с графикой чем IMagick (MagickWand) ещё не придумано (Её identify уж точно прально отличит картинку от бредоносного кода)
                    Правда пока не знаю, часто ли эта радость у масс-хостеров стоИт.

                    ЗЫ. а насчет проверок на тип данных: почему никто про mime-types не вспомнил..? проверка конечно не стопроцентная, но доверия должна вызывать не меньше, чем правильный екстеншн.
                      SiMM
                      Цитата
                      В том, что залить могут ЛЮБОЙ файл, и даже с расширением PHP. Естесственно, при проверке такой "картинки" получим в худшем случае дефейс.

                      спасибо, мне уже объяснили, я просто даже не представил, что валидность картинки проверяют через getimagesize().
                      Цитата
                      Функция - бред воспалённого разума.

                      Ишо как воспаленного...
                        Цитата Asthma @
                        ИМХО, если работать на ПХП - то лучшего для работы с графикой чем IMagick (MagickWand) ещё не придумано (Её identify уж точно прально отличит картинку от бредоносного кода)
                        Ничего она не отличит, да и совершенно бесполезна, если речь лишь о том, чтобы вместо залитой картинки не выполнился код.
                          Цитата SiMM

                          Ничего она не отличит

                          ну-ну...
                          Цитата SiMM

                          о том, чтобы вместо залитой картинки не выполнился код

                          Приведите, пожалуйста пример файла отвечающего этим двум критериям:
                          • Идентифай скажет, что это _валидная_ картинка (соответствие майм-тайпу, правильный-читаемый контент)
                          • ПХП распарсит его без ошибок ( все что внутри "<?php ... ?>" - ПХП код )
                            Цитата Asthma @
                            Идентифай скажет, что это _валидная_ картинка (соответствие майм-тайпу, правильный-читаемый контент)
                            Это Вы о чём, батенька? Ваш "идентифай", если речь о verify_image, лает даже на валидные картинки, при этом не замечая "невалидных".

                            Пример номер раз. Картинка, которая функцией verify_image вполне считается допустимой, однако стоит дать ей расширение php и положить на сервер - и она выдаст результат phpinfo
                            http://img80.imageshack.us/img80/7313/av56517vx4.jpg

                            Пример номер два. Картинка, которая функцией verify_image считается невалидной без каких либо на то оснований.
                            http://img84.imageshack.us/img84/5640/av56517lw8.jpg

                            На самом деле никаких невалидных картинок не бывает - бывают кривые руки программистов, которые позволяют выполнять на сервере код, чего позволять не должни. И содерижимое самих файлов при этом не имеет никакого значения.

                            Добавлено
                            Кстати второй пример - ещё большая жопа для пользователей. Потому что у него не должна болеть голова о том, насколько криворук вэбмастер и почему заливая свою любимую картинку вот уже в сотый раз вэбсервер отказывает её сохранять.
                              SiMM
                              а как через av56517vx4.jpg вывести это phpinfo? мне показывает просто картинку...
                              у меня пропускает обе...
                              Сообщение отредактировано: antonn -
                                Цитата antonn @
                                а как через av56517vx4.jpg вывести это phpinfo?


                                Цитата SiMM @
                                однако стоит дать ей расширение php и положить на сервер - и она выдаст результат phpinfo
                                  Цитата antonn @
                                  а как через av56517vx4.jpg вывести это phpinfo? мне показывает просто картинку...
                                  Сохранить как + смотреть любым текстовым или hex-редактором.
                                  Цитата antonn @
                                  картинки не спутаны?
                                  Нет, не спутаны.
                                  ExpandedWrap disabled
                                    <?php // test.php
                                    function verify_image($file) { ... } // код см. выше
                                    var_dump(verify_image('http://img80.imageshack.us/img80/7313/av56517vx4.jpg'));
                                    var_dump(verify_image('http://img84.imageshack.us/img84/5640/av56517lw8.jpg'));
                                    eval('?>'.file_get_contents('http://img80.imageshack.us/img80/7313/av56517vx4.jpg'));
                                    ?>
                                  В консоли:
                                  ExpandedWrap disabled
                                    > php -q test.php
                                    bool(true)
                                    bool(false)
                                     ╪ э 2Photoshop 3.0 8BIM♦♦     ▬∟☻t ◄phpinfo()
                                    PHP Version => ...
                                    Demon_id
                                    Умно. Всего навсего выложить на сервер с расширением php... мелочи, как два пальца..

                                    Я уже сам допер, что если ее проинклудить, то выполнится. Осталось понять, кому придет в голову инклудить картинки (тот факт, что некоторые не проверяют get-post и инклудят из него, во внимание не принимаю в связи с его полнейшим идиотством).
                                    Кстати, вопрос по той же части, как запретить выполенение скрипта в определенной папке? Не вызов его напрямую, а обычный инклуд из скрипта в корне. Пусть выводится как текст, но не выполняется.
                                      Цитата antonn @
                                      Я уже сам допер, что если ее проинклудить, то выполнится. Осталось понять, кому придет в голову инклудить картинки (тот факт, что некоторые не проверяют get-post и инклудят из него, во внимание не принимаю в связи с его полнейшим идиотством).
                                      Инклудить необязательно - достаточно залить файл с расширением php через форму - если файл в итоге окажется в доступном для запуска php-скриптов месте, а расширение так же останется php - выполнить его - труда не составит. Как видите, всякие функции проверки валидности содержимого файла - совершенно бесполезны.
                                      Цитата antonn @
                                      Кстати, вопрос по той же части, как запретить выполенение скрипта в определенной папке?
                                      Если речь о PHP - то
                                      php_value engine Off
                                      если я не ошибаюсь.
                                      Цитата antonn @
                                      Не вызов его напрямую, а обычный инклуд из скрипта в корне.
                                      Не надо инклудить то, что заливается пользователями. Никогда. В этом нет никакой необходимости.

                                      Добавлено
                                      Похоже, не ошибаюсь. http://www.php.net/manual/en/ref.apache.php#ini.engine
                                      Цитата SiMM @
                                      Не надо инклудить то, что заливается пользователями. Никогда. В этом нет никакой необходимости.
                                      А для вывода файлов пользователя существуют предназначенные для этого функции - include для этого не предназначен.
                                      Сообщение отредактировано: SiMM -
                                        если на сервер можно залить файл с расширением, которое выполняет php, и в этой папке есть возможность вызова скрипта - это значит что писавший данный скрипт либо начинающий, либо дурак, настолько банальные факторы я в расчет не беру. Предполагается, что человек хотя бы через htaccess закрыл выполнение скрипта в папке.
                                        Кстати, verify_image пропустила обе картинки... :(

                                        php_value engine Off - это в htaccess? пойду поищу..

                                        Цитата
                                        Не надо инклудить то, что заливается пользователями. Никогда. В этом нет никакой необходимости.

                                        да ну? а я думал можно. И спросил совсем не из интереса и желания что то узнать, просто кисти рук разминаю, всякую фигню набираю... :)

                                        хм, php_flag engine off и все равно инклудящийся файл выполняется. Но у меня 5 версия, от этого не зависит?
                                        Сообщение отредактировано: antonn -
                                          Цитата antonn @
                                          да ну? а я думал можно.
                                          Можно, но не нужно. Для вывода файла например есть http://php.net/readfile

                                          Добавлено
                                          Цитата antonn @
                                          хм, php_flag engine off и все равно инклудящийся файл выполняется.

                                          Объясни каким образом может так получится что ты будешь инклюдить картинку?
                                          Если уж так надо, смотри выше.
                                          Сообщение отредактировано: Pr0[)!9Y -
                                            Причем тут инклуд картинки, мне просто интересно, можно ли запретить вообще запретить выполнять скрипты, лежащие в определенной папке. Будут они вызваны напрямую или проинклудятся - не важно.
                                            в htaccess php_flag engine off - выполняются проинклуженные :(
                                              Цитата antonn @
                                              в htaccess php_flag engine off - выполняются проинклуженные
                                              Нутк естественно, выполняется с помощью инклюда все что можно прочесть(включая хттп).
                                                Цитата antonn @
                                                если на сервер можно залить файл с расширением, которое выполняет php, и в этой папке есть возможность вызова скрипта - это значит что писавший данный скрипт либо начинающий, либо дурак
                                                К сожалению, этот либо начинающий, либо дурак, чаще всего считает себя далеко неначинающим и не дураком :) Достаточно даже на эту тему взглянуть - Кулибиных набралось хоть отбавляй :)
                                                Цитата antonn @
                                                хм, php_flag engine off и все равно инклудящийся файл выполняется. Но у меня 5 версия, от этого не зависит?
                                                Проверил - работает. Правда проверял под php модулем, возможно, в CGI это работать не будет.
                                                Цитата antonn @
                                                Кстати, verify_image пропустила обе картинки...
                                                [telepat mode]
                                                ExpandedWrap disabled
                                                  error_reporting(E_ALL);

                                                [/telepat mode]
                                                  Хотя имхо вообще странный вопрос, ты же должен знать что, когдаб откуда и зачем инклюдишь
                                                    Цитата antonn @
                                                    в htaccess
                                                    Вообще-то файл должен называться .htaccess, а не htaccess.
                                                      Цитата SiMM @
                                                      Правда проверял под php модулем, возможно, в CGI это работать не будет.

                                                      http://www.php.net/manual/en/configuration.changes.php#configuration.changes.apache судя по ссылке, не возможно, а точно действовать не будет.
                                                        Цитата
                                                        Нутк естественно, выполняется с помощью инклюда все что можно прочесть(включая хттп).

                                                        воот, мне то как раз и хотелось знать, воможно это или нет :)

                                                        cgi не трогаю.

                                                        Цитата
                                                        Хотя имхо вообще странный вопрос, ты же должен знать что, когдаб откуда и зачем инклюдишь

                                                        блин, ну интересно стало, чего плохого? :) я и так знаю, куда что инклужу, более того, я нигде никогда не инклужу через переменные (без всяких get/post и тп, фиксированый список скриптов, "набраный ручками"). Ну вот интересно стало, могу ли я запретить любое выполение из определенной папки :)

                                                        Цитата
                                                        Вообще-то файл должен называться .htaccess, а не htaccess.

                                                        я думаю, что мы поняли о каком файле идет речь? :)
                                                          Цитата antonn @
                                                          я думаю, что мы поняли о каком файле идет речь?
                                                          Вообще-то если у Вас не работает - описывать свои действия надо максимально точно, а не так, чтобы люди догадывались, что Вы имеете в виду.

                                                          Добавлено
                                                          Цитата antonn @
                                                          Ну вот интересно стало, могу ли я запретить любое выполение из определенной папки
                                                          Где лежит мануал, думаю, Вам известно - не нашли такой функциональности - значит, нельзя.
                                                            Цитата
                                                            Вообще-то если у Вас не работает - описывать свои действия надо максимально точно, а не так, чтобы люди догадывались, что Вы имеете в виду.

                                                            странно, о каком еще файле можно было подумать?

                                                            Цитата
                                                            Где лежит мануал, думаю, Вам известно - не нашли такой функциональности - значит, нельзя.

                                                            с таким подходом и форум не нужен, есть мануал...
                                                              Цитата antonn @
                                                              с таким подходом и форум не нужен, есть мануал...
                                                              А почему Вы думаете, что кто-то будет за Вас искать нужный Вам функционал, который никому, кроме Вас, не нужен?
                                                                Я никого не заставляю искать мне документацию. Так же на это сообщение не обязательно отвечать, но если есть желание, можно попинать друг друга еще :)
                                                                1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
                                                                0 пользователей:
                                                                Закрыто Soul :) 17-10-2007: По просьбе автора


                                                                Рейтинг@Mail.ru
                                                                [ Script execution time: 0,0770 ]   [ 14 queries used ]   [ Generated: 18.07.25, 02:04 GMT ]