Discuz X 3.4 由任意文件删除到 Getshell

2017年9月29日,Discuz! 修复了一个安全问题用于加强安全性,这个漏洞会导致前台用户可以导致任意删除文件漏洞。并且,配合其他漏洞可以实现 GetShell。 初步分析 先下载官方托管在码云上的 Discuz X 源码: git clone https://gitee.com/ComsenzDiscuz/DiscuzX.git 查看其提交历史,发现有一个『优化 加强安全性』的 commit 比较可疑: 查看其具体内容: 它删除了5个 unlink 语句…… 这种修复方式真是简单粗暴啊… 看来我们分析的入口就在这里了。 任意文件删除 这部分的分析请参考这里:https://paper.seebug.org/411/ (别吐槽——这篇文章分析得很好,省了我很多字 :haha:) 文件删除能做什么 通过上面那篇文章,想必大家都能复现文件删除的漏洞了。那么这个漏洞能做什么呢?难道只是单纯的破坏吗? 我们知道, Discuz X 这类 CMS 软件,都会一个 install 目录,用来处理用户初次安装时的配置和数据库初始化。在安装完成后,会在 data 目录下生成一个 install.lock 文件。如果尝试再次访问 /install 来安装,检测到存在 install.lock,于是提示错误: 如果用户没有删除 install 目录,而且我们也可以利用文件删除漏洞的话,我们就可以删掉这个 instal.lock,然后重新安装 Discuz。而重装过程中一般都有写配置文件的步骤,可能会给我们写入一句话的机会。 分析重装过程 install/index.php 文件控制安装的过程,它的逻辑其实很简单。安装主要分为五个步骤: show_license 显示是否接受协议,同意后跳到 env_check env_check 检查目录是否可写和 PHP的相关检测,然后跳到 app_reg app_reg 提示是否安装 UCenter Server,POST 到 app_reg,如果 install_ucenter=yes,直接重定向至 db_init,否则显示配置 ucenter 的表单 db_init 要求填写数据库和网站信息,POST 到 db_init,这时会进行数据库连接和数据表的检查。所以填写的数据库地址等信息要求必须是目标站能够连接的真实的服务器。 …....

October 2, 2017