hadcms代码审计
任意文件写入
全局搜索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 | ziparchive 部分使用方法 |