是否可以使用扩展名file.php.jpg执行PHP?

时间:2011-11-06 04:37:12

标签: php security

网站合法文件image_upload.php用于上传文件89471928047.php.jpg这是将tmp文件复制到同一图片文件夹的简单文件上传表单。 他们如何设法执行它并通过它上传其他文件。有人知道这有可能吗? PHP version was 5.1.6正好在小时前更新,或者按计划与主持人5.3.8进行更新...真是巧合?

3 个答案:

答案 0 :(得分:15)

检查.htaccess文件

在.htaccess文件中使用AddType,您可以添加许多其他可以运行PHP的扩展。这通常是如何在仍然使用PHP的情况下使用.html扩展。所以,是的,这是可能的:

AddType application/x-httpd-php .jpg

如果您愿意,可以测试一下。

  1. 创建一个包含两个文件的目录:.htaccess和test.php.jpg
  2. 将.htaccess的内容设置为AddType application-x-httpd-php .jpg
  3. 将test.php.jpg的内容设置为<?php echo 'foo'; ?>
  4. 通过localhost访问test.php.jpg
  5. 如果一切按计划进行,“foo”将输出到您的屏幕。如果您愿意,可以对此进行扩展以移动/tmp个文件。

    你肯定要非常小心。

    检查对include / require

    的公开调用

    另一种可以做到的方法是通过调用require()include()(或任何_once()方法)黑客能够加载badfile.php.jpg <?php include $_GET["file"]; ?> 1}}以无辜形象为幌子上传的文件:

    .php.jpg

    在上述情况(简化示例)中,黑客可以传入其eval()文件的路径,并将其内容加载并作为PHP代码处理。

    其他(可怕的)想法

    Require,Include及其相关方法并不是处理外部脚本的唯一方法 - 遗憾的是,您也可以使用eval()。我希望你没有这样做。如果您的服务器上有任何脚本正在使用任何一个文件函数来读取另一个脚本的内容,然后{{1}}将该内容评估为PHP,这也可能会在您的服务器中提供一个巨大的安全漏洞网站。

答案 1 :(得分:8)

您的image_upload.php不安全,请查看以下内容:

  1. 是否仅允许图片扩展?否则可以直接上传PHP文件。 (我认为你对这个问题有所了解,但需要仔细检查)。
  2. 是否检查上传的文件确实是图像?这里的答案是否定的,它不会检查内容。添加此支票!通过这一步,您将关闭最初的违规行为。
  3. 要检查是否是图像,您可以在文件上运行getimagesize,如果图像不是图像,则返回FALSE。

    如何执行该文件?首先,您如何知道它已被执行?你有没有看到副作用?

    1. 一种方法是,他们可以篡改其他文件
    2. 第二种方式,也许更可能是他们使用脚本中的未经过输入来包含或评估代码。在这种情况下,您只能通过查看日志找到证据。
    3. 如何查看日志?

      检查上传文件的日期和时间,并开始在那里查看可疑活动(查看奇怪的网址参数)。一旦你找到一个或多个IP地址,做恶事,就可以查看那些(那些)IP的日志,看看整个故事。

      要了解的另一个重要信息是,您是否编写过该网站或使用CMS 或类似信息,在这种情况下,它是什么版本以及版本是什么?您需要检查已发布的漏洞并进行升级以防万一。

答案 2 :(得分:7)

问题是由您的服务器使用默认的/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