浅析.user.ini文件的PHP后门及防范

背景

这个估计很多同学看了不屑,认为是烂大街的东西了:

.htaccess文件构成的PHP后门,那么我来个新的吧:.user.ini。它比.htaccess用的更广,不管是 nginx/apache/IIS,只要是以fastcgi运行的php都可以用这个方法。我的nginx服务器全部是fpm/fastcgi,我的 IIS php5.3以上的全部用的fastcgi/cgi,我win下的apache上也用的fcgi,可谓很广,不像.htaccess有局限性。

.user.ini

那么什么是.user.ini?

这得从php.ini说起了。php.ini是php默认的配置文件,其中包括了很多php的配置,这些配置中,又分为几种:PHP_INI_SYSTEM、PHP_INI_PERDIR、PHP_INI_ALL、PHP_INI_USER。 在此可以查看:http://php.net/manual/zh/ini.list.php 这几种模式有什么区别?看看官方的解释:

其中就提到了,模式为PHP_INI_USER的配置项,可以在ini_set()函数中设置、注册表中设置,再就是.user.ini中设置。 这里就提到了.user.ini,那么这是个什么配置文件?那么官方文档在这里又解释了:

除了主 php.ini 之外,PHP 还会在每个目录下扫描 INI 文件,从被执行的 PHP 文件所在目录开始一直上升到 web 根目录($_SERVER['DOCUMENT_ROOT'] 所指定的)。如果被执行的 PHP 文件在 web 根目录之外,则只扫描该目录。

在 .user.ini 风格的 INI 文件中只有具有 PHP_INI_PERDIR 和 PHP_INI_USER 模式的 INI 设置可被识别。

这里就很清楚了,.user.ini实际上就是一个可以由用户“自定义”的php.ini,我们能够自定义的设置是模式为“PHP_INI_PERDIR 、 PHP_INI_USER”的设置。(上面表格中没有提到的PHP_INI_PERDIR也可以在.user.ini中设置)

实际上,除了PHP_INI_SYSTEM以外的模式(包括PHP_INI_ALL)都是可以通过.user.ini来设置的。

而且,和php.ini不同的是,.user.ini是一个能被动态加载的ini文件。也就是说我修改了.user.ini后,不需要重启服务器中间件,只需要等待user_ini.cache_ttl所设置的时间(默认为300秒),即可被重新加载。

然后我们看到php.ini中的配置项,可惜我沮丧地发现,只要稍微敏感的配置项,都是PHP_INI_SYSTEM模式的(甚至是php.ini only的),包括disable_functions、extension_dir、enable_dl等。 不过,我们可以很容易地借助.user.ini文件来构造一个“后门”。

Php配置项中有两个比较有意思的项(下图第一、四个):

auto_append_file、auto_prepend_file,点开看看什么意思:

指定一个文件,自动包含在要执行的文件前,类似于在文件前调用了require()函数。而auto_append_file类似,只是在文件后面包含。 使用方法很简单,直接写在.user.ini中:

12auto_prepend_file=01.gif

01.gif是要包含的文件。

所以,我们可以借助.user.ini轻松让所有php文件都“自动”包含某个文件,而这个文件可以是一个正常php文件,也可以是一个包含一句话的webshell。

测试一下,我分别在IIS6.0+Fastcgi+PHP5.3和nginx+fpm+php5.3上测试。 目录下有.user.ini,和包含webshell的01.gif,和正常php文件echo.php:

访问echo.php即可看到后门:

Nginx下同样:

那么,我们可以猥琐地想一下,在哪些情况下可以用到这个姿势? 比如,某网站限制不允许上传.php文件,你便可以上传一个.user.ini,再上传一个图片马,包含起来进行getshell。不过前提是含有.user.ini的文件夹下需要有正常的php文件,否则也不能包含了。 再比如,你只是想隐藏个后门,这个方式是最方便的。

时间: 2024-09-12 22:37:18

浅析.user.ini文件的PHP后门及防范的相关文章

delphi编程控制INI文件

从.INI文件中获取字符串 var strResult:pchar; begin GetPrivateProfileString( 'windows', // []中标题的名字 'NullPort', // =号前的名字 'NIL', // 如果没有找到字符串时,返回的默认值 strResult, //存放取得字符 100, //取得字符的允许最大长度 'c:forwin95win.ini' // 调用的文件名 ); edit1.text:=strResult; //显示取得字符串 从.INI文

在Delphi中实现将Font.Style写入INI文件

前不久我编写一个小程序在INI文件中记录字体的属性(颜色值/color,大小/size,字体名/name,样式/style),其中color值和size值可以用数值方式写入INI文件,name是用字符方式写入,但Font.style不是数值型.字符型,也不是布尔型,而是TfontStyles类,无法直接写入INI文件中去,我找了好多相关书籍也没找到方法,也到网络上的Delphi站点去问,也没得到满意的答复,没法子,看来还得自已想办法解决,我通过一系列的摸索实验,终于找到了比较满意的解决方法,程序

Delphi中利用INI文件实现界面无闪烁多语言切换

越来越多的程序使用了多国语言切换,虽然DELPHI自带多语言包的添加和配置,但是那种方法在切换语言时界面会出现闪烁,而且实现起来很麻烦,这里我介绍给大家的是利用INI文件来读取界面的语种文字,用这种方法,不但简单易行,而且在切换的时候不会出现界面的闪烁. 我们从一个例子出发,看看怎么实现语言的切换.首先建立一个新工程.放置如下组件: MainMenu1: TMainMenu; File1: TMenuItem; Exit1: TMenuItem; Label1: TLabel; Button1:

如何在C#中读写INI文件

INI文件就是扩展名为"ini"的文件.在Windows系统中,INI文件是很多,最重要的就是"System.ini"."System32.ini"和"Win.ini".该文件主要存放用户所做的选择以及系统的各种参数.用户可以通过修改INI文件,来改变应用程序和系统的很多配置.但自从Windows 95的退出,在Windows系统中引入了注册表的概念,INI文件在Windows系统的地位就开始不断下滑,这是因为注册表的独特优点

[c#]:如何在C#中读写INI文件(一)

INI文件就是扩展名为"ini"的文件.在Windows系统中,INI文件是很多,最重要的就是"System.ini"."System32.ini"和"Win.ini".该文件主要存放用户所做的选择以及系统的各种参数.用户可以通过修改INI文件,来改变应用程序和系统的很多配置.但自从Windows 95的退出,在Windows系统中引入了注册表的概念,INI文件在Windows系统的地位就开始不断下滑,这是因为注册表的独特优点

如何把ini文件转换为xml

xml|转换 对于开发C/S系统的编程人员来说,ini文件是不会陌生的,当XML越来越普及的时候,如何把原来的INI文件转换程XML就成为一件棘手的事情.下面我把这方面的代码奉献给大家,如果有什么bug,欢迎批评指正:qieyj@cape.com.cn. frmMain.cs using System;using System.Drawing;using System.Collections;using System.ComponentModel;using System.Windows.For

winform读写.ini文件

1.在头部引用 [DllImport("kernel32")]  private static extern long WritePrivateProfileString(string section,      string key,string val,string filePath);    [DllImport("kernel32")]  private static extern int GetPrivateProfileString(string sec

C#中如何读写INI文件

在C#中读取和写入ini文件的一段代码,其实本文只是指出一个方向,希望大家能够触类旁通. 以下为代码全文:    //写INI文件 [ DllImport ( "kernel32" ) ] private static extern bool WritePrivateProfileString ( string section ,string key , string val , string filePath ) ; //读ini文件(字符 [ DllImport ( "k

.net精简框架集下的ini文件读取(C#)

        无论是.net框架集还是.net精简框架集都能非常完美的支持XML文件,并且微软也强烈建议用xml文件取代ini文件,但是在工控领域大部分的工程都是采用ini文件配置的系统信息的.        以前的隧道管理系统是采用ini文件配置信息的,为了实现兼容,只好在下位机也采用ini文件配置信息.由于WinCE平台不提供ini文件读取的api函数GetPrivateProfileString,所以需要自行编写,前一段时间提供了一个EVC版本的ini文件读取,后来在DA66x的WinC