Я действительно беспокоюсь о том, что люди могут загружать вредоносные файлы php, большой риск для безопасности!
Верхушка айсберга!
Мне также нужно знать, что люди, меняющие расширения php-файлов, пытаются обойти эту функцию безопасности.
Как правило, изменение расширений не позволит PHP интерпретировать эти файлы как сценарии. Но это не единственная проблема. Есть больше вещей, чем "... php", которые могут повредить серверную часть; «.Htaccess» и файлы с установленным битом X - очевидные, но далеко не все, о чем вам нужно беспокоиться. Даже если игнорировать вещи на стороне сервера, существует огромная проблема на стороне клиента.
Например, если кто-то может загрузить файл «.html», он может включить в него тег , который перехватывает сеанс стороннего пользователя и удаляет все загруженные им файлы или меняет свой пароль или что-то в этом роде. Это классическая атака между сайтами (XSS).
Кроме того, благодаря поведению некоторых браузеров (в основном IE), «перехвата содержимого», файл, загруженный как «.gif», может фактически содержать вредоносный HTML, такой как этот. Если IE видит контрольные сигналы, такие как (но не ограничиваясь ими) ‘’, в начале файла, он может игнорировать обслуживаемый Type Content-Type ’и отображаться как HTML, что приводит к XSS.
Кроме того, можно создать файл, который и является допустимым изображением, которое будет принимать ваш анализатор изображений, и содержат встроенный HTML. Существуют различные возможные результаты в зависимости от точной версии браузера пользователя и точного формата файла изображения (в частности, JPEG имеют очень переменный набор возможных форматов заголовков). В IE8 есть смягчения , но сейчас это бесполезно, и вам нужно задаться вопросом, почему они не могут просто перестать заниматься перехватом контента, вы, идиоты MS , вместо того, чтобы обременять нас с нестандартными нестандартными расширениями заголовков HTTP, которые в первую очередь должны были иметь Just Worked.
Я снова нападаю. Я остановлюсь. Тактика безопасного обслуживания предоставленных пользователем изображений:
1: Никогда не сохраняйте файл в файловой системе вашего сервера, используя имя файла, взятое из пользовательского ввода. Это предотвращает как ошибки, так и атаки: разные файловые системы имеют разные правила о том, какие символы допустимы в имени файла, и это гораздо сложнее, чем вы думаете, «санировать» имена файлов.
Даже если вы взяли что-то очень ограничительное, например «только буквы ASCII», вам все равно придется беспокоиться о слишком длинных, слишком коротких и зарезервированных именах: попробуйте сохранить файл с таким же безобидным именем, как «com.txt». На сервере Windows и наблюдайте за тем, как ваше приложение отключается. Думаешь, ты знаешь все странные слабости путей к именам каждой файловой системы, на которой может работать твое приложение? Уверенный?
Вместо этого сохраните сведения о файле (например, имя и тип носителя) в базе данных и используйте первичный ключ в качестве имени в вашем хранилище файлов (например, «74293.dat»). Затем вам потребуется способ обслуживания их с разными видимыми именами файлов, например сценарий загрузчика, выплевывающий файл, сценарий загрузчика, выполняющий внутреннее перенаправление веб-сервера, или перезапись URL-адреса.
2: Будьте очень, очень осторожны, используя ZipArchive. В экстракте * были обнаружены уязвимости того же типа, которые затронули большинство наивных ZIP-экстракторов на основе путей. Кроме того, вы открываете себя для атаки из ZIP бомб . Лучше всего избегать опасности неправильных имен файлов, просматривая каждую запись файла в архиве (например, используя zip_read / zip_entry _ *) и проверяя его детали, прежде чем вручную распаковывать свой поток в файл с известным именем и флаги режима, которые вы создали без помощи архива. Игнорируйте пути к папкам внутри ZIP.
3: если вы можете загрузить файл изображения и сохранить его снова , особенно если вы обрабатываете его каким-то образом (например, изменяете размер / уменьшаете его изображение или добавляете водяной знак), вы можете быть достаточно уверены, что результаты будут чистыми. Теоретически возможно создать изображение, нацеленное на конкретный компрессор изображений, чтобы при сжатии результаты также выглядели как HTML, но мне это кажется очень сложной атакой.
4: Если вы можете обойтись без загрузки всех ваших изображений (т. Е. Используя «Content-Disposition: attachment» в скрипте загрузчика), вы, вероятно, в безопасности. Но это может быть слишком неудобно для пользователей. Это может работать в тандеме с (3), тем не менее, предоставляя встроенные обработанные изображения меньшего размера и имея исходные изображения более высокого качества, доступные только для загрузки.
5: Если вам нужно показывать неизмененные изображения встроенными, вы можете устранить риск межсайтовых сценариев, обслуживая их из другого домена. Например, используйте «images.example.com» для ненадежных изображений и «www.example.com» для основного сайта, который содержит всю логику. Убедитесь, что файлы cookie ограничены только правильным виртуальным хостом и что виртуальные хосты настроены таким образом, что они не могут отвечать ни на что, кроме своих собственных имен (см. Также: Атаки на повторное связывание DNS). Это то, что делают многие службы веб-почты.
Таким образом, пользовательский медиа-контент является проблемой.
В кратком изложении, AAAARRRRRRRGGGGHHH.
ETA re comment:
вверху вы упомянули про 'файлы с установленным битом X', что вы подразумеваете под этим?
Я не могу говорить за ZipArchive.extractTo()
, так как я не проверял его, но многие экстракторы, когда их просят сбросить файлы из архива, воссоздают [некоторые из] флагов режима файла Unix, связанных с каждым файлом ( если архив был создан на Unix и поэтому фактически имеет флаги режима). Это может вызвать проблемы с разрешениями, если, например, отсутствует разрешение на чтение для владельца. Но это также может быть проблемой безопасности, если ваш сервер поддерживает CGI: бит X может позволить интерпретировать файл как скрипт и передавать его любому интерпретатору скриптов, указанному в хэш-банге в первой строке.
Я подумал, что .htaccess должен быть в главном корневом каталоге, разве это не так?
Зависит от настройки Apache, в частности, от директивы AllowOverride. Хостам общего назначения свойственно AllowOverride в любом каталоге.
что произойдет, если кто-то еще загрузит файл вроде ../var/www/wr_dir/evil.php?
Я ожидаю, что ведущий "..." будет отброшен, это то же самое сделали другие инструменты, которые пострадали от той же уязвимости.
Но я все равно не стал бы доверять extractTo()
против враждебного ввода, есть слишком много странных маленьких файловых имен / каталогов, которые могут пойти не так, особенно если вы ожидаете когда-либо работать на серверах Windows. zip_read()
дает вам гораздо больший контроль над процессом разархивирования, и, следовательно, злоумышленник гораздо меньше.