引用 https://www.yuque.com/sag9gg/rgibcn/sebb3m

user.ini文件构成的PHP后门

  1. 我们先来看看php.ini

ini是Initialization File的缩写,意思为“配置文件;初始化文件;”,是初始化设置文件的后缀名;ini文件是windows的系统配置文件所采用的存储格式,统管windows的各项配置

php.ini的作用:

用来控制php的某些功能

某些功能比如:错误提示,短标签,上传文件最大值,扩展等等可以通过php.ini文件设置

根据个人的要求让它们进行打开或者关闭

关于php配置文件详解可以点这里:PHP配置文件详解php.ini

php.ini是php默认的配置文件,其中包括了很多php的配置,这些配置中,又分为几种:PHP_INI_SYSTEM、PHP_INI_PERDIR、PHP_INI_ALL、PHP_INI_USER这四种模式。 在此可以查看:http://php.net/manual/zh/ini.list.php

即:

.user.ini(转载) - 图1

这些模式的区别:https://www.php.net/manual/zh/configuration.changes.modes.php

即:

.user.ini(转载) - 图2

也就是说,php.ini配置中的配置选项都有各自的模式,这些模式可以在不同的配置文件进行设置。接下来我们再来看看 .user.ini文件

  1. .user.ini

官方解析:https://www.php.net/manual/zh/configuration.file.per-user.php

即:

.user.ini(转载) - 图3

以上我们可以看到,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的配置项,搜寻可以利用的配置:https://www.php.net/manual/zh/ini.list.php

这时候我们发现稍微敏感的配置项,都是PHP_INI_SYSTEM模式的(甚至是php.ini only的),包括disable_functions、extension_dir、enable_dl等。 不过,我们可以很容易地借助.user.ini文件来构造一个“后门”

这里我们找到两个有意思的项:(第一个,第四个)

.user.ini(转载) - 图4

点进auto_append_file看看

.user.ini(转载) - 图5

大概意思就是:

auto_prepend_file指定一个文件后,自动包含在要执行的文件前,类似于在文件前调用了require()函数。而auto_append_file类似,只是在文件后面包含。 使用方法很简单,直接写在.user.ini中:

这里我们可以看一下php require()函数:https://www.runoob.com/w3cnote/php-different-include-and-require.html

意思很明显了,我们可以利用这两个配置项,自定义一个 .user.ini ,完成一些文件包含(一句话的webshell)构成PHP后门的骚操作。

具体实现过程我们在虚拟机中测试一下:

打开phpstudy,选择一下PHP版本,进入根目录,在根目录下创建一个上传文件夹,其中包含一个php文件,一个图片文件,和构建的 .user.ini 文件:

.user.ini(转载) - 图6

内容分别如下:

.user.ini(转载) - 图7

最后我们访问echo.php 即可看到后门:

.user.ini(转载) - 图8

加入连接参数(get和post都可以):

.user.ini(转载) - 图9

或者用蚂蚁剑连接。

.user.ini 的应用

最后我们可以看一道题:https://buuoj.cn/challenges web 上的一道 文件上传题。

https://buuoj.cn/challenges#[SUCTF 2019]CheckIn

经过burp抓包,题目image/jpeg .user.ini(转载) - 图10即不能上传后缀为php的文件,有文件头过滤exif_imagetype函数,添加最简单的gif文件头GIF89a,上传的文件内容可以js绕过

通常,在嵌入了php脚本的html中,使用 phtml作为后缀名;

完全是php写的,则使用php作为后缀名。

这两种文件,web服务器都会用php解释器进行解析。

来自 https://blog.csdn.net/benzkuai/article/details/22377127

前面的上传,即:

.user.ini(转载) - 图11

发现,了上传目录uploads/852aff287f54bca0ed7757a702913e50,该目录下的有index.php和上传的文件

又 .user.ini上传的满足条件为.user.ini(转载) - 图12发现均满足条件,其中可执行文件为index.php.user.ini(转载) - 图13 .user.ini实际上就是一个可以由用户“自定义”的php.ini,我们能够自定义的设置是模式为“PHP_INI_PERDIR 、 PHP_INI_USER”的设置。PHP配置项中有auto_prepend_fileauto_append_file大致意思就是:我们指定一个文件(如a.jpg),那么该文件就会被包含在要执行的php文件中(如index.php),类似于在index.php中插入一句:require(./a.jpg);这两个设置的区别只是在于auto_prepend_file是在文件前插入;auto_append_file在文件最后插入(当文件调用的有exit()时该设置无效) 来自 https://xz.aliyun.com/t/6091#toc-1

重新解题:

我们先上传一个 .user.ini的文件 内容为:

GIF89a

auto_prepend_file=hmbb.jpg

即:

.user.ini(转载) - 图14

我们再上传一个图片(hmbb.jpg),使最后我们执行index.php使包含该图片,其中该图片内容为webshell

即: 查看目录

.user.ini(转载) - 图15

最后我们使用蚂蚁剑连接:

.user.ini(转载) - 图16

或者:

然后就可以用菜刀连了。但是它会不时的清除文件,所以链接的不是很稳定,甚至有是时候连不上,但我们可以在网页执行命令。所以我第一次就是在页面执行了命令,找到了flag:

扫描根目录:a=var_dump(scandir(“/“));,我们可以可以看见一个叫flag的文件

打印:a=var_dump(file_get_contents(“/flag”));

或者:

来自 https://blog.csdn.net/weixin_44077544/article/details/102688564

.user.ini(转载) - 图17

或者:

.user.ini(转载) - 图18

GIF89a flag{43a12518-7899-4e8a-8e41-eaab77a1326c}

来自 http://56904c97-312c-458c-a7c3-81cdf9b75918.node3.buuoj.cn/uploads/852aff287f54bca0ed7757a702913e50/index.php

最后我们访问http://.../uploads/852aff287f54bca0ed7757a702913e50/index.php

由于以上上传图片一句话木马,中用post提交变量shell 以下需要用post提交

即:

.user.ini(转载) - 图19

参考: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