前言
这个漏洞是晏师傅发现的,该漏洞为后台任意文件删除,需要有管理员的权限,所以说危害非常小。晏师傅说,让我用这个洞的分析发个文章活跃下先知的账号,每天发发文章,比打游戏好多了。我觉得非常有道理,所以有了这篇文章。
项目地址
https://gitee.com/ComsenzDiscuz/DiscuzX/tree/master
直接用最新版测试。(discuz!x3.4)
代码分析
漏洞位置在\source\admincp\admincp_forums.php第1793-1799行。用正则搜索,往unlink函数中直接传入通过GET方法获取的变量,直接可以搜到。
存在漏洞的代码:
if(!$multiset) {
if($_GET['delreplybg']) {
$valueparse = parse_url($_GET['replybgnew']);
if(!isset($valueparse['host']) && file_exists($_G['setting']['attachurl'].'common/'.$_GET['replybgnew'])) {
@unlink($_G['setting']['attachurl'].'common/'.$_GET['replybgnew']);
}
$_GET['replybgnew'] = '';
}
首先我们也要进入第一个if语句,查看代码可知,当$multiset为假或者为0时即可。
查找下$multiset赋值的位置,发现其默认为0,只要让GET参数multi为空或者不存在即可。
再看第二个和第三个if语句:
第二个if语句,只要设置GET参数delreplybg;
第二个if语句,开发者做了下检测,通过检测parse_url函数返回的结果中有没有host这个变量,来确保GET参数replybgnew不是url,但是这个检测并不影响我们传入文件路径。
接下来再看一下$_G['setting']['attachurl']变量的内容是什么就可以构造exp了。
打个断点, 然后登陆后台,进入后台->模块管理,点击提交,这是发现已经断下了,看下它的值:
它的值为data/attachment/,再拼接上common/,也就是说我们可控的删除路径前缀为data/attachment/common/。
至此,我们就可以构造exp了。
漏洞复现
下个最新版的Discuz!x3.4,安装一下。
设置好burp的代理,然后登陆后台,进入论坛->模块管理,点击提交。
因为discuz!x3.4安装成功之后,登陆进后台,就会把安装脚本删除(这也许是官方的修复方式?),所以没法进行重装,那就删除个主页吧。
修改请求包,加入 &replybgnew=../../../index.php&delreplybg=1 。
点击Forward,这样就会把主页删除了。
文件管理器里也查看一下,确定是不是真的删除了。
后话
向往晏师傅那样健康绿色、积极向上的生活。
本文作者为Mr.Wu,转载请注明,尊守博主劳动成果!
由于经常折腾代码,可能会导致个别文章内容显示错位或者别的 BUG 影响阅读; 如发现请在该文章下留言告知于我,thank you !
想知道你说的晏师傅的博客或者关注方式有吗