Возможно ли выполнить PHP с расширением file.php.jpg?

Файл для загрузки сайта image_upload.php использовался для загрузки файла 89471928047.php.jpg. Это была простая форма загрузки файла, которая копирует файл tmp в ту же папку изображений. Как им удалось выполнить его и загрузить в него другие файлы. Кто-то знает, как это возможно? PHP version was 5.1.6, который обновляется ровно час назад или по расписанию с хостом до 5.3.8... что a, совпадение?

Ответ 1

Проверьте файл .htaccess

Используя AddType в вашем файле .htaccess, вы можете добавить много других расширений, из которых можно запустить PHP. Как правило, расширения .html могут использоваться при использовании PHP внутри самих себя. Итак, да, возможно:

AddType application/x-httpd-php .jpg

Вы можете проверить это, если хотите.

  • Создайте каталог с двумя файлами:.htaccess и test.php.jpg
  • Установить содержимое .htaccess на AddType application-x-httpd-php .jpg
  • Установить содержимое test.php.jpg в <?php echo 'foo'; ?>
  • Доступ к test.php.jpg через localhost

Если все идет так, как планировалось, на экран выводится "foo". Вы можете расширить его, чтобы перемещать файлы /tmp, если хотите.

Определенно, с чем вы хотите быть очень осторожным.

Проверить открытые вызовы, чтобы включить/потребовать

Другим способом, который это могло быть сделано, является вызов require() или include() (или любого из методов _once()), который хакер смог загрузить в свой badfile.php.jpg файл, который был загружен под видом невинного образа:

<?php

  include $_GET["file"];

?>

В приведенном выше примере (упрощенный пример) хакер может пройти по пути к своему файлу .php.jpg и загрузить его содержимое и обработать его как PHP-код.

Другие (пугающие) идеи

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

Ответ 2

Ваш image_upload.php небезопасен, проверьте следующее:

  • разрешает ли только расширения изображений? В противном случае можно напрямую загрузить файл PHP. (Я думаю, вы охвачены этим, но дважды проверьте).
  • проверяет, действительно ли загруженный файл является изображением? Здесь нет ответа, он не проверяет содержимое. Добавьте эту проверку! С помощью этого единственного шага вы закроете первоначальное нарушение.

Чтобы проверить, может ли это изображение вы можете запустить getimagesize в файле, он вернет FALSE, если это не изображение.

Как можно выполнить этот файл? Во-первых, как вы знаете, что он был выполнен? Вы видели побочные эффекты?

  • Один из способов заключается в том, что они могут иметь подделывать другие файлы
  • Вторым способом, возможно, более вероятно, что они использовали несаминированные входы из ваших сценариев, чтобы включить или изменить код. В этом случае вы можете найти доказательства, только взглянув на журналы.

Как посмотреть журналы?

Проверьте дату и время загруженного файла и начните искать там подозрительную активность (посмотрите на странные параметры URL-адреса). Когда вы найдете один или несколько IP-адресов, делая злые вещи, grep журнал для этих (тех) IP-адресов, чтобы увидеть всю историю.

Еще одна важная информация, которую вы знаете: вы пишете сайт или используете CMS или аналогичный, и в этом случае, что это такое и какая версия? Вы должны проверить опубликованные уязвимости и обновить в случае.

Ответ 3

Проблема вызвана тем, что ваш сервер использует по умолчанию /etc/httpd/conf.d/php.conf:

rpm -ql php-5.1.6-39.el5_8
/etc/httpd/conf.d/php.conf
/usr/lib64/httpd/modules/libphp5-zts.so
/usr/lib64/httpd/modules/libphp5.so
/var/lib/php/session
/var/www/icons/php.gif

Содержимое/etc/httpd/conf.d/php.conf:

#
# PHP is an HTML-embedded scripting language which attempts to make it
# easy for developers to write dynamically generated webpages.
#
<IfModule prefork.c>
  LoadModule php5_module modules/libphp5.so
</IfModule>
<IfModule worker.c>
  # Use of the "ZTS" build with worker is experimental, and no shared
  # modules are supported.
  LoadModule php5_module modules/libphp5-zts.so
</IfModule>

#
# Cause the PHP interpreter to handle files with a .php extension.
#
AddHandler php5-script .php
AddType text/html .php

Обратите внимание на последнюю строку AddHandler php5- script.php. Это вызывает эту проблему и требует замены более безопасной конфигурации

Вы можете узнать больше об этом и о том, как применить исправление здесь (см. последний ответ):

http://core.trac.wordpress.org/ticket/11122

также см. это:

https://bugzilla.redhat.com/show_bug.cgi?id=885839