.user.ini文件利用
# .user.ini文件利用
# 背景
- 传统的利用
.htaccess文件添加解析规则绕过仅限于apache局限性很强 - 而
.user.ini则比.htaccess用的更广,不管是nginx/apache/IIS,只要是以fastcgi运行的php都可以用这个方法。利用面可谓很广,不像.htaccess有局限性
# .user.ini
# 什么是.user.ini
php.ini是php默认的配置文件,其中包括了很多php的配置,这些配置中,又分为几种:PHP_INI_SYSTEM、PHP_INI_PERDIR、PHP_INI_ALL、PHP_INI_USER。 在此可以查看 (opens new window)这几种模式有什么区别?官方的解释如下:

- 其中就提到了,模式为
PHP_INI_USER的配置项,可以在ini_set()函数中设置、注册表中设置,再就是.user.ini中设置。 这里就提到了.user.ini,那么这是个什么配置文件?那么官方文档在这里 (opens new window)又解释了: - 除了主
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配置项中有两个比较有意思的项(下图第一、四个):

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

指定一个文件,自动包含在要执行的文件前,类似于在文件前调用了require()函数。而auto_append_file类似,只是在文件后面包含。 使用方法很简单,直接写在.user.ini中:
auto_prepend_file=hackcode.gif
1
hackcode.gif是要包含的文件- 所以,我们可以借助
.user.ini轻松让所有php文件都“自动”包含某个文件,而这个文件可以是一个正常php文件,也可以是一个包含一句话的webshell - 限制:需要在
.user.ini同级目录下拥有至少一个可执行php文件
# 总结
思考一下在哪些情况下可以用到这个姿势? 比如,某网站限制不允许上传.php文件,你便可以上传一个.user.ini,再上传一个图片马,包含起来进行getshell。不过前提是含有.user.ini的文件夹下需要有正常的php文件,否则也不能包含了。 再比如,只是想隐藏个后门,这个方式也是最方便的。
上次更新: 2022/08/24, 22:23:34