任意文件写入

全局搜索file_put_contents的时候发现

往上回溯发现它是通过weitch..case来控制file_put_contentts的,而下面的path也就是我们通过POST传入的

23-35行对路径真实性进行了检验

如果不存在弹出路径不存在的提示并返回JSON响应,并且限制了不能创建新的文件夹

所以我们确定了传入的内容type=save

path要求是必须真实存在的路径,

suffixs一开始就限制了类型

这里只是判断了一下是否符合格式,但是没过滤php文件

所以可以通过nkdire来创建新测目录文件

测试

任意文件删除

在上面的基础上这里有一个

由于上面的分析可知path和type是可控的,所以构成任意文件删除漏洞

任意文件删除+rce

存在任意文件删除的时候,我们可以进行locked锁文件的删除以重装,而且在重装界面我们能看到我们的数据库信息会记录到config.php中

当我们安装的时候,就会对配置文件进行写入,但是写入的时候没有过滤,这就导致我们可以进行rce

后面是对数据库进行连接,创建等操作,但是不能随意输入,如果数据库执行期间报错会导致后面安装不成功,config,php无法写入

最上面的代码限制了我们不能随意访问该文件,但是$_G中内容可控,经过尝试发现只有这里的 mysql_prefix 参数也就是数据库前缀这里是可以完全控制的,其他参数如果拼接特殊字符会导致数据库语句执行报错

config.php中可知,必须定义puyuetian常量才能正常访问该文件,所以显然不能直接访问而要通过特定路由,但是index.php中包含了puyueyian.php,所以只要能正常安装成功就能进行rce

测试

1
/*!'; phpinfo();//

任意文件读取

注意一下前置,suffixs允许的尾缀是这个,前面我们分析了path可控

而且在下面发现了回显

模板上传绕过getshell

/app/superadmin/phpscript/app.php

有一个if (!InArray('hsa,zip', $suffix)) {检查尾缀是否为.zip文件,然后在下面用到了ziparchive::extractTo()

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
ziparchive 部分使用方法
<?php
/******** ziparchive 可选参数 *******/
/*
1.ZipArchive::addEmptyDir
添加一个新的文件目录
2.ZipArchive::addFile
将文件添加到指定zip压缩包中。
3.ZipArchive::addFromString
添加的文件同时将内容添加进去
4.ZipArchive::close
关闭ziparchive
5.ZipArchive::extractTo
将压缩包解压
6.ZipArchive::open
打开一个zip压缩包
7.ZipArchive::getStatusString
返回压缩时的状态内容,包括错误信息,压缩信息等等
8.ZipArchive::deleteIndex
删除压缩包中的某一个文件,如:deleteIndex(0)删除第一个文件
9.ZipArchive::deleteName
删除压缩包中的某一个文件名称,同时也将文件删除。
?>