.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