Discuz!X V3.4后台任意文件删除
简述
该漏洞为后台任意文件删除,需要有管理员的权限,所以说危害非常小
复现环境
docker、vulhub-master
项目地址:https://gitee.com/ComsenzDiscuz/DiscuzX/tree/master
漏洞复现
启动环境docker-compose up -d
安装Discuz!X V3.4 数据库名设置为db
访问后台并登录http://your-ip/admin.php
进入论坛->模块管理->编辑板块
使用burp拦截”提交“的数据。
在请求包中添加如下参数 &replybgnew=../../../robots.txt&delreplybg=1
发送请求包,前后对比一下,发现目录中的文件(robots.txt)已经被删除了
代码分析
首先看我们的请求
admin.php?action=forums&operation=edit&fid=2&replybgnew=../../../robots.txt&delreplybg=1
admin.php
中接收了action
参数后经过actioncpfile
处理后返回文件路径并包含。
actioncpfile
函数
function admincpfile($action)
{
return './source/admincp/admincp_'.$action.'.php';
}
返回admincp_forums.php
,漏洞出现在该文件中
漏洞代码
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进入if语句,由491行代码可知multiset
参数默认为0,所以只要不传入该参数或者置空即可
第二个if语句
GET参数delreplybg
其中利用了parse_url
来判断有没有host
,来确保GET参数是replybgnew
而不是URL
$_G['setting']['attachurl'
的值为data/attachment/common/[replybgnew]
,这个就是可控的删除路径
漏洞修复
需要有管理员的权限,危害很小,目前网上没找到修复