- user.ini文件构成的PHP后门
- PHP配置文件详解php.ini">关于php配置文件详解可以点这里:PHP配置文件详解php.ini
引用 https://www.yuque.com/sag9gg/rgibcn/sebb3m
user.ini文件构成的PHP后门
- 我们先来看看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
即:
这些模式的区别:https://www.php.net/manual/zh/configuration.changes.modes.php
即:
也就是说,php.ini配置中的配置选项都有各自的模式,这些模式可以在不同的配置文件进行设置。接下来我们再来看看 .user.ini文件
- .user.ini
官方解析:https://www.php.net/manual/zh/configuration.file.per-user.php
即:
以上我们可以看到,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文件来构造一个“后门”
这里我们找到两个有意思的项:(第一个,第四个)
点进auto_append_file看看
大概意思就是:
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 文件:
内容分别如下:
最后我们访问echo.php 即可看到后门:
加入连接参数(get和post都可以):
或者用蚂蚁剑连接。
.user.ini 的应用
最后我们可以看一道题:https://buuoj.cn/challenges web 上的一道 文件上传题。
https://buuoj.cn/challenges#[SUCTF 2019]CheckIn
经过burp抓包,题目image/jpeg | 即不能上传后缀为php的文件,有文件头过滤exif_imagetype函数,添加最简单的gif文件头GIF89a,上传的文件内容可以js绕过 |
---|---|
通常,在嵌入了php脚本的html中,使用 phtml作为后缀名;
完全是php写的,则使用php作为后缀名。
这两种文件,web服务器都会用php解释器进行解析。
来自 https://blog.csdn.net/benzkuai/article/details/22377127
前面的上传,即:
发现,了上传目录uploads/852aff287f54bca0ed7757a702913e50,该目录下的有index.php和上传的文件
又 .user.ini上传的满足条件为发现均满足条件,其中可执行文件为index.php | .user.ini实际上就是一个可以由用户“自定义”的php.ini,我们能够自定义的设置是模式为“PHP_INI_PERDIR 、 PHP_INI_USER”的设置。PHP配置项中有auto_prepend_file和auto_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
即:
我们再上传一个图片(hmbb.jpg),使最后我们执行index.php使包含该图片,其中该图片内容为webshell
即: 查看目录
最后我们使用蚂蚁剑连接:
或者:
然后就可以用菜刀连了。但是它会不时的清除文件,所以链接的不是很稳定,甚至有是时候连不上,但我们可以在网页执行命令。所以我第一次就是在页面执行了命令,找到了flag:
扫描根目录:a=var_dump(scandir(“/“));,我们可以可以看见一个叫flag的文件
打印:a=var_dump(file_get_contents(“/flag”));
或者:
来自 https://blog.csdn.net/weixin_44077544/article/details/102688564
或者:
GIF89a flag{43a12518-7899-4e8a-8e41-eaab77a1326c}
最后我们访问http://.../uploads/852aff287f54bca0ed7757a702913e50/index.php
由于以上上传图片一句话木马,中用post提交变量shell 以下需要用post提交
即: