1.1 php.ini构成的后门
主要利用 auto_prepend_file 和 include_path
-
auto_prepend_file 意味这是在php脚本执行前会执行这个参数设置的脚本,然后这个参数的脚本所在目录受include_path限制(也就是如果在php.ini里写入auto_prepend_file(a.php)意味着解释器在执行代码前会先执行a.php的内容)
-
append是在php脚本执行后才执行的,但是要注意的是遇到exit()的时候,这个脚本也不能运行
-
然后这两个能在php.ini、.htaccess、httpd.conf设置,P师傅提到,除了PHP_INI_SYSTEM以外的模式(包括PHP_INI_ALL)都是可以通过.user.ini来设置
1.2 对 php.ini和.user.ini的解释
什么是.user.ini?
要想了解.user.ini得先说说php.ini是php默认的配置文件,其中包括了很多php的配置,这些配置中,又分为几种:PHP_INI_SYSTEM
、PHP_INI_PERDIR
、PHP_INI_ALL
、PHP_INI_USER。
模式为PHP_INI_USER的配置项,可以在ini_set()函数中设置,注册表中设置 ,.user.ini中设置
这里就提到了.user.ini,那么这是个什么配置文件?
.user.ini
实际上就是一个可以由用户“自定义”的php.ini,我们能够自定义的设置是模式为“PHP_INI_PERDIR 、 PHP_INI_USER”的设置。(上面表格中没有提到的PHP_INI_PERDIR也可以在.user.ini中设置)
特点 1
.user.ini。它比.htaccess用的更广,不管是nginx/apache/IIS,只要是以fastcgi运行的php都可以用这个方法。我的nginx服务器全部是fpm/fastcgi,我的IIS php5.3以上的全部用的fastcgi/cgi,我win下的apache上也用的fcgi,可谓很广,不像.htaccess有局限性。
特点 2
除了主 php.ini 之外,PHP 还会在每个目录下扫描 INI 文件,从被执行的 PHP 文件所在目录开始一直上升到 web 根目录($_SERVER['DOCUMENT_ROOT'] 所指定的)。如果被执行的 PHP 文件在 web 根目录之外,则只扫描该目录。
在 .user.ini 风格的 INI 文件中只有具有 PHP_INI_PERDIR 和 PHP_INI_USER 模式的 INI 设置可被识别。
实际上,除了PHP_INI_SYSTEM
以外的模式(包括PHP_INI_ALL)都是可以通过.user.ini来设置的。
特点 3
.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文件来构造一个“后门”。
1.3 利用思路
我们可以借助.user.ini中的auto_prepend_file 和 include_path轻松让所有php文件都“自动”包含某个文件,而这个文件可以是一个正常php文件,也可以是一个包含一句话的webshell。
例:一个网站目录下存在 .user.ini文件 内容为auto_prepend_file(1.jpg) 存在文件 1.jpg (图片木马)存在正常php文件123.php 当你访问123.php时自动"包含"1.jpg" 实际上是执行了木马1.jpg 里的代码
友情链接学习