`

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

php 
阅读更多
http://drops.wooyun.org/tips/3424

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


enter image description here

其中就提到了,模式为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配置项中有两个比较有意思的项(下图第一、四个):

enter image description here

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

enter image description here

指定一个文件,自动包含在要执行的文件前,类似于在文件前调用了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:

enter image description here

enter image description here

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

enter image description here

Nginx下同样:

enter image description here

enter image description here

那么,我们可以猥琐地想一下,在哪些情况下可以用到这个姿势? 比如,某网站限制不允许上传.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
分享到:
评论

相关推荐

    rdpwrap.ini 配置文件 ver.10.0.18.*

    3. **替换rdpwrap.ini文件**:将下载的ini文件复制到RDPWrap安装目录下的`RDPWrap`文件夹中,替换原有的rdpwrap.ini文件。 4. **初始化RDPWrap**:运行RDPWrap的控制台程序(通常是RDPConf.exe),检查RDP服务是否...

    rdpwrap.ini 配置文件 ver.10.0.25*

    **rdpwrap.ini配置文件详解** `rdpwrap.ini` 是一个重要的配置文件,用于RDP(Remote Desktop Protocol)Wrapper工具。RDP Wrapper允许你绕过Windows操作系统对远程桌面连接的默认限制,使得多用户可以同时通过RDP...

    Java读取Ini文件

    File iniFile = new File("C:\\Users\\User\\Desktop\\example.ini"); FileInputStream fis = new FileInputStream(iniFile); ``` 2. **读取文件内容**:使用`java.io.BufferedReader`读取文件内容,逐行读取。这将...

    base.user.css中的typora的主题文件

    可以进行自定义样式,方便查看

    keil5中的TOOLS.INI文件,容易误删建议保存

    在Keil5的配置和个性化设置中,`TOOLS.INI`文件起着至关重要的作用。这个文件存储了用户的工具链配置、编译器路径、调试器设置等关键信息,是用户工作环境个性化定制的核心。 标题所提及的"keil5中的TOOLS.INI文件...

    base.user.css

    Markdown笔记前端人员使用的做笔记的软件 插件

    VB.form.INI.file.values.programs.rar_VB ini_Will

    WriteIniValue("UserSettings", "UserName", txtName.Text, "config.ini") End Sub ``` 4. **读取INI文件加载窗体**: 当窗体加载时,你可以从INI文件中读取数据并填充到相应的控件。可以创建一个类似`...

    C#读写ini文件.rar

    string username = ini.ReadIni("config.ini", "UserSettings", "Username"); Console.WriteLine(username); // 输出: John Doe ``` 在这个名为"C#读写ini文件"的项目中,你将找到一个实现上述功能的完整示例。通过...

    秒传链接提取.user.js

    秒传链接提取.user.js

    vs2019缺失Microsoft.Cpp.x64.user问题

    vs2019缺失Microsoft.Cpp.x64.user问题 将资源放置: C:\用户\(自己的用户名)\AppData(改文件为隐藏文件)\Local\Microsoft\MSBuild\v4.0

    使用 ini文件 方法.txt

    iniFileName = "settings.ini" ' 设置整数值 SetIniN "General", "MaxUsers", 100 ' 获取整数值 Dim maxUsers As Long maxUsers = GetIniN "General", "MaxUsers", 50 ' 设置字符串值 SetIniS "Database", ...

    VC++读写INI文件类以及示例程序.rar_ini文件_ini类_vc读取ini_读取配置文件_配置文件读取

    GetPrivateProfileString(_T("Settings"), _T("Key1"), _T(""), value, 256, _T("path_to_inifile.ini")); ``` 2. `WritePrivateProfileString`:向INI文件写入字符串。例如,向 "[Settings]" 部分写入 "Key1" 的新...

    C#中读取Ini文件的类

    Ini文件由键值对组成,通常分为三个部分:全局区([Software])、用户区([User])和各个功能区。每个部分以方括号`[]`包裹,键和值之间用等号`=`分隔,如`Key=Value`。 2. C#中读取Ini文件的基本步骤: - 打开...

    115一键转存.user_115一键转存.user_115转存脚本_115一键转存_115转存脚本_115转存_

    115一键转存.user.js 是这个脚本的核心文件,它是由JavaScript编写,利用浏览器的油猴(Tampermonkey)等插件来运行。油猴插件是一种浏览器扩展,允许用户在网页上运行自定义的JavaScript代码,以增强或修改网页功能。...

    adb_usb文件包

    4. 替换`.android`目录下的`adb_usb.ini`文件,用从"adb_usb文件包"解压出的`adb_usb.ini`覆盖原文件。 5. 重启adb服务,可以在命令行输入`adb kill-server`后跟着`adb start-server`来完成。 6. 重新连接魅族手机,...

    Ini文件读写源码

    Dim ini As New CIniFile("config.ini") ini.WriteKey "Settings", "User", "John Doe" Dim username As String username = ini.ReadKey("Settings", "User") ``` 在这个例子中,`CIniFile`类被用来写入键“User”的...

    秒传链接提取_2.3.7.user.js

    秒传链接提取_2.3.7.user.js

    Microsoft.Cpp.x64.user.props

    win10+pcl1.8.1+VS2015下载与环境配置踩坑 这可是个大招!!! 不过必须在有相同条件与环境下,该props文件才可以进行移植 环境为win10系统,vs版本为2015(我是社区版,专业版应该也可)

Global site tag (gtag.js) - Google Analytics