.user.ini文件构成的PHP后门

0x00 背景



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

.htaccess文件构成的PHP后门

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

0x01 .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 这几种模式有什么区别?看看官方的解释:

.user.ini文件构成的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配置项中有两个比较有意思的项(下图第一、四个):

.user.ini文件构成的PHP后门

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

.user.ini文件构成的PHP后门

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

auto_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:

.user.ini文件构成的PHP后门

.user.ini文件构成的PHP后门

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

.user.ini文件构成的PHP后门

Nginx下同样:

.user.ini文件构成的PHP后门

.user.ini文件构成的PHP后门

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

0x02 参考文献:


http://php.net/manual/zh/ini.list.php
http://php.net/manual/zh/configuration.changes.modes.php
http://php.net/manual/zh/configuration.file.per-user.php
http://php.net/manual/zh/configuration.changes.php

分类:默认分类 时间:2012-01-09 人气:3
本文关键词:
分享到:

相关文章

  • 初学PHP指导:php.ini 配置详细选项 2012-02-28

    php.ini 或 php3.ini 是 PHP 在启动时会读取的配置文件。该文件的存放路径为 /usr/local/lib/。在 PHP 3.x 版的配置文件为 php3.ini;而在 PHP 4.x 版改为 php.ini。若 PHP 安装成服务器的模块,则在 Web 服务器启动执行时会读取,之后就不再读取,因此改动配置的话要重新启动 Web 服务器。若使用独立 PHP CGI 方式,则每次都读一次。 要看目前的系统配置,可以用phpinfo()看到。以下为选项配置 php_value na

  • 利用php中mail函数发送带有附件的邮件 2012-05-23

    本文章来给各位同学详细介绍关于利用php中mail函数发送带有附件的邮件,有需要了解学习的朋友不防进入参考。 mail函数,发送邮件 语法: mail(to,subject,message,headers,parameters) to 规定邮件的接收者 subject 规定邮件的主题。该参数不能包含任何换行字符 message 规定要发送的消息 headers 规定额外的报头,比如 From, Cc 以及 Bcc parameters 规定 sendmail 程序的额外参数。 碰到的主要问题是乱

  • nginx+php使用open_basedir限制站点目录防止跨站 2012-11-18

      方法1)在Nginx配置文件中加入 fastcgi_param PHP_VALUE "open_basedir=$document_root:/tmp/:/proc/"; 通常nginx的站点配置文件里用了include fastcgi.conf;,这样的,把这行加在fastcgi.conf里就OK了。   如果某个站点需要单独设置额外的目录,把上面的代码写在include fastcgi.conf;这行下面就OK了,会把fastcgi.conf中的设置覆盖掉。   这种方式的设置需要重启n

  • PHP 会话(session 时间设定)使用入门 2013-02-06

    在PHP开发中对比起Cookie,Session 是存储在服务器端的会话,相对安全,并且不像 Cookie 那样有存储长度限制,本文简单介绍 Session 的使用。   由于 Session 是以文本文件形式存储在服务器端的,所以不怕客户端修改 Session 内容。实际上在服务器端的 Session 文件,PHP 自动修改 Session 文件的权限,只保留了系统读和写权限,而且不能通过 ftp 修改,所以安全得多。PHPChina 开源社区门户k%W%e2CY    对于 Cookie 来

  • Linux下Apache+mysql+PHP运行环境搭建教程 2013-03-15

    今天因为工具需要需要配置一个web环境,由于初次接触在linux内核系统中配置Apache+mysql+PHP环境折腾了许久,下面整理了一篇安装教程与大家一起交流一下吧。 PHP之服务器环境搭建安装软件准备 1. Apache224.tar.gz 2. php-5.2.9.tar.gz 3. mysql-5.1.54.tar.gz PHP和各个组件包 libxml2-2.6.30.tar.gz xml c语言版的解析器 libmcrypt-2.5.8.tar.gz 加密算法扩展库 zlib-1.

  • php config 2013-07-10

    PHP 的安装 由于php是一个zip文件(非install版),安装较为简单 解压就行。把解压的 php5.2.1-Win32重命名为 php5。并复制到安装盘目录下。例如安装路径为 c:php5 1 找到php目录下的 php.ini-dist或 php.ini.recommended文件,重命名为 php.ini,并复制到系统盘的windows目录下(以c:windows为例,2000是在winnt目录下,下面都采用网友的方法来说明). 2 再把php目录下的php5ts.dll,libm

  • php 错误屏蔽 error_reporting详解 2013-09-03

    在Windows环境下:原本在php教程4.3.0中运行正常的程序,在4.3.1中为何多处报错,大体提示为:Notice:Undefined varialbe:变量名称. 例如有如下的代码: 复制代码 代码如下: if (!$tmp_i) { $tmp_i=10; } 在4.3.0中运行正常,在4.3.1中运行会提示Notice:Undefined varialbe:tmp_i 问题下下: 1.问题出在哪里? 2.应如何修改这段代码? 3.不改段代码,如何修改php.ini中的设置使原来在4.3

  • php+mysql+nginx在linux上的环境部署 2013-12-01

    一直在linux上鼓捣,还没有完整在linux下配置过nginx服务器环境部署呢,这几天没什么事就部署了一下,遇到的问题也很多,现在把我的环境部署文档发出了,有什么问题大家可以一起讨论一下,希望大家采用后遇到问题多多沟通。 || 安装所需各种依赖包 sudo -s LANG=C yum -y install gcc gcc-c++ autoconf libjpeg libjpeg-devel libpng libpng-devel freetype freetype-devel libxml2

  • windows7+nginx+php+mysql+apache服务器配置教程 2014-06-16

    网上配置服务器教程多如牛毛,但是写的明明白白或者有配图,等你自己去实践你会发现问题还是非常的多,笔者就以双服务器配置演示一次,抛弃我使用很久的集成环境,到写这篇笔记时候,已经完美可以运行项目了,在配置过程中,还是遇到很多问题我都一一列出来,希望你们可以在遇到相同错误有个好的解决方案,在配置之前对于以前安装的集成环境卸载,然后用软件清理完注册表垃圾,什么管家之类都可以,不说名字了.接着去下载Nginx1.2版本windows的zip文件,一般不用msi,zip是绿色软件,重装系统也可以用,接着下载

Copyright (C) quwantang.com, All Rights Reserved.

趣玩堂 版权所有 京ICP备15002868号

processed in 0.108 (s). 10 q(s)