XYHCMS审计任意文件删除导致重装漏洞
环境搭建
- xyhCMS3.5 20180508
- php 7.0.12
- Apache
- mysql 5.5.53
审计分析
- 全局搜索unlink定位到一处sql文件删除代码段
1 | public function delSqlFiles() { |
- 在这段代码中,当
$batchFlag
存在且为真时,$files
会被视为数组,执行批量删除;否则,$files
被视为单个文件名。TP 框架的I()
函数用来接收请求中的sqlfilename
参数作为要删除的文件名,并进行判空处理。如果文件名有效,接下来会通过拼接基础路径$this->getDbPath()
和$file
来执行unlink()
删除操作。此段代码未见明显的过滤
I()
函数是 ThinkPHP 框架提供的一个用于获取请求参数的辅助函数。它将参数从$_GET
、$_POST
等超全局变量中提取出来,并按照给定的规则进行处理(比如通过intval
转换为整数,或者使用默认值)
- 再看看$this->getDbPath() 的值是什么,便于我们后面执行任意文件删除操作时知道当前路径与目标路径的相对位置,这样我们才能知道需要写几个目录跳转符能删除目标文件
ok,确定了值为,/Data/resource/backupdata
漏洞触发
漏洞位于:/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是前台入口文件
还可以看到程序是通过ThinkPHP 的路由重写功能传递路径参数的
1 | http://127.0.0.1/cms/xyhcms3.5/xyhai.php?s=/Login/index |
综上所所述,我们这样构造触发:
首先要登录后台,因为是后台的功能点
手动在网站根目录创建一个phpinfo.php
现在我们来删除它
上面也提到了我们删除文件的基础路径在/Data/resource/backupdata,于是需要跳三次目录,就到网站根目录了
1 | http://127.0.0.1/cms/xyhcms3.5/xyhai.php?s=/Database/delSqlFiles/sqlfilename/..\..\..\phpinfo.php/1 |
删除成功!
漏洞利用
删除锁文件,直接重装系统
1 | http://127.0.0.1/cms/xyhcms3.5/xyhai.php?s=/Database/delSqlFiles/sqlfilename/..\..\..\install\install.lock/1 |
访问/install
哟西成功导致重装,不过不要在真实环境中操作,危害巨大,能证明可以重装就行了
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 X1ly?S!
评论