是否可以使用扩展名文件.PHP .jpg执行PHP ?


Is it possible to execute PHP with extension file.php.jpg?

站点合法文件image_upload.php用于上传文件89471928047.php.jpg,这是简单的文件上传形式,将tmp文件复制到相同的图像文件夹。他们是如何执行它并通过它上传其他文件的。有人知道这是怎么回事吗?PHP version was 5.1.6在一小时前或一小时后被主机更新到5.3.8…真是巧合?

检查。htaccess文件

在你的。htaccess文件中使用AddType,你可以添加许多其他扩展,PHP可以从这些扩展中运行。这通常是.html扩展在使用PHP的同时可以使用的方式。所以,是的,这是可能的:

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

如果一切按计划进行,"将输出到您的屏幕。如果您愿意,可以在此基础上扩展以移动/tmp文件。

这绝对是你要非常小心的事情。

检查公开的调用是否包含/require

另一种方法是通过调用require()include()(或任何_once()方法),黑客能够在他的badfile.php.jpg文件中加载以无害图像为幌子上传的文件:

<?php
  include $_GET["file"];
?>

在上面的例子中(简化的例子),黑客可以传递到他的.php.jpg文件的路径,并将其内容加载并作为PHP代码处理。

其他(可怕的)想法

Require、Include和它们相关的方法并不是处理外部脚本的唯一方法——不幸的是,你也可以使用eval()。我希望你没有发生这些事。如果您的服务器上有任何脚本使用任何一个文件函数来读取另一个脚本的内容,然后eval()将该内容评估为PHP,这也可能在您的网站上提供一个巨大的安全漏洞。

问题是由于您的服务器使用默认的/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 php -script .php这会导致这个问题,需要替换为更安全的配置

你可以阅读更多关于它和如何应用修复在这里(见上次回复):

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

参见:

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

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

  1. 它只允许图像扩展吗?否则可以直接上传PHP文件。(我想你已经被覆盖了,但是再检查一下)。
  2. 它检查上传的文件确实是一个图像吗?这里的答案是否定的,它不检查内容。加上这张支票!只需这一步,你就可以关闭最初的漏洞。

要检查它是否是图像,你可以在文件上运行getimagesize,如果它不是图像,它将返回FALSE。

如何执行该文件?首先,你怎么知道它已经被执行了?你看到副作用了吗?

    一种方法是他们可以让篡改其他文件第二种可能的方法是,他们使用了脚本中未处理的输入来包含或计算代码。在这种情况下,您只能通过查看日志来找到证据。

如何查看日志?

检查上传文件的日期和时间,并开始查看可疑活动(查看奇怪的url参数)。一旦你发现一个或多个IP地址,做坏事,grep日志为那些IP,看看整个故事。

另一个需要知道的重要信息是,你是写网站还是使用CMS或类似的,在这种情况下它是什么,什么版本?您必须检查已发布的漏洞并进行升级。