[SUCTF 2019]CheckIn .user.ini后门

今天第一次写博客,就写刚做的一道题学到的.user.ini吧。

什么是.user.ini

.user.ini看名字后缀就能猜到这是一个配置文件,说到配置文件,那肯定要提一提php.ini文件。php.ini文件是php的默认配置文件,其中包含了很多对php的配置信息,像我们常见的disable_functions、extension_dir等,这些配置分为四种模式
[SUCTF 2019]CheckIn .user.ini后门
这些模式决定着一个 PHP 的指令在何时何地,是否能够被设定。手册中的每个指令都有其所属的模式。例如有些指令可以在 PHP 脚本中用 ini_set() 来设定,而有些则只能在 php.ini 或 httpd.conf 中。
例如 output_buffering 指令是属于 PHP_INI_PERDIR,因而就不能用 ini_set() 来设定。但是 display_errors 指令是属于 PHP_INI_ALL 因而就可以在任何地方被设定,包括 ini_set()。
明白了四种模式的区别,下面我们看看看一下官网对.user.ini的定义
[SUCTF 2019]CheckIn .user.ini后门
也就是说,.user.ini文件中可以设置PHP_INI_USER和PHP_INI_PERDIR再加上PHP_INI_ALL模式里配置选项,而且.user.ini是动态加载的,默认是五分钟加载一次,但是注意,只有服务器运行在fastcgi模式下,.user.ini才会被动态加载,那么我们如何用.user.ini来创建一个后门呢?
这里PHP_INI_PERDIR里有两个特别的配置:
auto_append_fil,auto_prepend_file
auto_append_fil相当于在文件前调用require()函数。而auto_append_file是在文件后面包含。 使用方法很简单,直接写在.user.ini中。

实战

这道题可在buuctf上复现
文件上传测试:
一.发现该题目对上传的文件名字里不能包含‘ph’,与我们要上传的.user.ini,还是图片都无影响。
二.用exif_imagetype()对检测文件内容是否符合图片格式,可加入下面的幻数头字节绕过(注意,这里的头字节是二进制,用时要转化成文本格式)
JPG :FF D8 FF E0 00 10 4A 46 49 46
GIF:47 49 46 38 39 61
PNG: 89 50 4E 47
三:文件内容过滤了’<?’,可用<script language=‘php’>

[SUCTF 2019]CheckIn .user.ini后门
[SUCTF 2019]CheckIn .user.ini后门

上传完毕.user.ini和a.jpg,访问上传目录的index.php文件,上传代码得到执行,得知flag在根目录下,访问可得flag。
最后总结一下 文件上传中.user.ini使用条件:
1.服务器脚本语言为PHP
2.服务器使用CGI/FastCGI模式
3.上传目录下要有可执行的php文件
4.能上传带有php代码的文件
参考文章:
https://wooyun.js.org/drops/user.ini%E6%96%87%E4%BB%B6%E6%9E%84%E6%88%90%E7%9A%84PHP%E5%90%8E%E9%97%A8.html
https://xz.aliyun.com/t/6091#toc-1