Web攻防

.user.ini配置文件在渗透中的利用

2020-07-19  本文已影响0人  book4yi

前言:

官方介绍:

自 PHP 5.3.0 起,PHP 支持基于每个目录的 .htaccess 风格的 INI 文件。此类文件仅被 CGI/FastCGI SAPI 处理。此功能使得 PECL 的 htscanner 扩展作废。如果使用 Apache,则用 .htaccess 文件有同样效果

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

首先我们知道,php.ini是php的核心配置文件,在 PHP 启动时被读取。按照如上所说,那么web目录的其他ini文件也是可以被php识别,那么我们是不是可以通过配置.user.ini文件重新进行配置的修改呢?

答案是显而易见的,并不能任意修改配置。

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


综上,我们可以了解到:

1、.user.ini实际上就是一个可以由用户自定义的php.ini,我们能够自定义的设置是模式为 PHP_INI_PERDIR 或者 PHP_INI_USER的设置。实际上,除了PHP_INI_SYSTEM以外的模式(包括PHP_INI_ALL)都是可以通过.user.ini来设置的。

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

我们可以通过在官网上查看哪些配置可以在.user.ini中运用:
https://www.php.net/manual/zh/ini.list.php

我们可以发现稍微敏感的配置项,都是PHP_INI_SYSTEM模式的(甚至是php.ini only的),包括disable_functions、extension_dir、enable_dl等,但是还是有可以利用的地方的

可以通过.user.ini绕过open_basedir的限制,还有其他的一些绕过手法就不多介绍了,下面的这篇文章介绍得很详细:
浅谈几种Bypass open_basedir的方法

利用.user.ini本地包含文件:

利用条件:open_basedir没有被限制
利用函数:auto_append_file、auto_prepend_file
利用原理:借助.user.ini轻松让所有php文件都“自动”包含某个文件,而这个文件可以是一个正常php文件,也可以是一个包含一句话的webshell

auto_prepend_file 表示在加载第一个PHP代码之前先行预加载该配置所指示的PHP文件。
auto_append_file 表示在加载第一个PHP代码之后执行预加载该配置所指示的PHP文件。

利用过程:
1、我们先构建一个图片马,并上传到服务器:

2、上传.user.ini到目标服务器,文件内容编辑为:

3、找到目标服务器存在的任意php可正常访问的文件
这里我们以echo.php作为测试:

4、构造url并进行访问,成功输出phpinfo:

原文件的内容输出在最后,auto_append_file函数则相反:

利用背景:
假设某网站限制不允许上传.php文件,但是可以上传一个.user.ini,再上传一个图片马,包含起来进行getshell。不过前提是含有.user.ini的文件夹下需要有正常的php文件。

user.ini在实际中的应用很广,它比.htaccess用的更广,不管是nginx/apache/IIS,只要是以fastcgi运行的php都可以用这个方法

利用.user.ini绕过open_basedir(失败):

由于Windows使用phpstudy复现失败,这里我们搭建环境:
Kali + nginx + php7.4-fpm
具体搭建过程请参考:
Ubuntu16.0.4.1安装lnmp
Linux/Ubuntu16.04+Nginx+Mysql+PHP 搭建wordpress
搭建环境往往都是悲伤的故事,不提也罢。。。

搭建完以后启动相应服务:

/etc/init.d/nginx start
/etc/init.d/php7.4-fpm start

php.ini限制open_basedir

此时无法读取/var/目录下的文件

上传.user.ini,编辑内容如下:

open_basedir=:\

复现失败了,似乎这个思路不行,它会根据php.ini设置的open_basedir为主

end

php我了解得很少,可能还有其他函数可以被利用的,以后发现了再说

参考如下:


.user.ini文件
神秘的.user.ini文件
PHP 通过.user.ini 绕过黑名单限制

上一篇下一篇

猜你喜欢

热点阅读