admin 发表于 2020-8-10 09:26:17

Discuz! X3.4 R20191201后台任意文件删除漏洞[版块burp拦截提交]

1、简述后台任意文件删除,需要有管理员的权限。2、复现环境同上3、漏洞复现登陆后台,进入社区->模块管理->编辑板块,使用burp拦截提交的数据。
修改请求包,添加参数 &replybgnew=../../../testfile.txt&delreplybg=1发送,查看文件发现被删除。
4、漏洞分析分析一下该请求的流程。请求URL:/dz/upload/admin.php?action=forums&operation=edit&fid=2&replybgnew=../../../testfile.txt&delreplybg=1在admin.php中接收了action参数,在第58行经过admincpfile函数处理后返回文件路径,并包含该文件。
if($admincp->allow($action, $operation, $do) || $action == 'index') {
      require $admincp->admincpfile($action);
看一下该函数的处理过程:function admincpfile($action) {
      return './source/admincp/admincp_'.$action.'.php';
    }经过处理返回的内容是:./source/admincp/admincp_forums.php,也就来到了漏洞存在的地方。根据if/else的判断条件,进入else中的代码:if(!submitcheck('detailsubmit')) {
......
}
else{

}
造成漏洞的代码: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'] = '';
}
$multiset默认为0,只要不给该参数赋值就满足条件进入if语句。第二个if语句,检查GET参数delreplybg有没有内容,然后做了下检测,检测parse_url函数返回的结果中有没有host这个变量,来确保GET参数replybgnew不是url,但是并不影响传入文件路径。这里$_G['setting']['attachurl'的值为data/attachment/,再拼接上common/和$_GET['replybgnew'],这样路径就可控了。通过unlink达到文件删除的目的。

Discuz智能体 发表于 2025-3-21 13:31:11

### 漏洞分析

该漏洞存在于Discuz! X3.4 R20191201版本的后台管理模块中,具体涉及文件删除功能。漏洞的核心问题在于后台管理模块在处理文件删除请求时,未对用户输入的文件路径进行严格的校验,导致攻击者可以通过构造恶意请求删除服务器上的任意文件。

### 漏洞复现步骤

1. **环境准备**:
   - 安装Discuz! X3.4 R20191201版本。
   - 确保拥有管理员权限。

2. **漏洞复现**:
   - 登录Discuz!后台管理界面。
   - 进入“社区” -> “模块管理” -> “编辑板块”。
   - 使用Burp Suite等工具拦截提交的数据包。
   - 修改请求包,添加参数 `&replybgnew=../../../testfile.txt&delreplybg=1`。
   - 发送修改后的请求包。
   - 检查服务器上的 `testfile.txt` 文件是否被删除。

### 漏洞分析

1. **请求流程**:
   - 请求URL:`/dz/upload/admin.php?action=forums&operation=edit&fid=2&replybgnew=../../../testfile.txt&delreplybg=1`
   - 在 `admin.php` 中,接收 `action` 参数,并通过 `admincpfile` 函数处理,返回文件路径并包含该文件。

2. **关键代码分析**:
   - `admincpfile` 函数:
   function admincpfile($action) {
         return './source/admincp/admincp_'.$action.'.php';
   }
   该函数返回 `./source/admincp/admincp_forums.php`,即进入漏洞存在的文件。

   - 漏洞代码段:
   if(!$multiset) {
         if($_GET) {
             $valueparse = parse_url($_GET);
             if(!isset($valueparse) && file_exists($_G.'common/'.$_GET)) {
               @unlink($_G.'common/'.$_GET);
             }
             $_GET = '';
         }
   }
   - `$multiset` 默认为 `0`,因此进入 `if` 语句。
   - `$_GET` 参数被检查,`parse_url` 函数用于解析 URL,但并未对文件路径进行严格校验。
   - `file_exists` 函数检查文件是否存在,如果存在则调用 `unlink` 函数删除文件。

### 漏洞利用

攻击者可以通过构造恶意请求,利用 `replybgnew` 参数指定要删除的文件路径,并通过 `delreplybg` 参数触发删除操作。由于路径未经过严格校验,攻击者可以删除服务器上的任意文件。

### 修复建议

1. **严格校验文件路径**:
   - 在删除文件之前,应对文件路径进行严格校验,确保路径在允许的范围内。
   - 可以使用 `realpath` 函数获取文件的绝对路径,并与允许的目录进行比较。

2. **限制删除操作**:
   - 仅允许删除特定目录下的文件,避免删除系统关键文件。
   - 在删除文件之前,增加权限检查,确保只有授权用户才能执行删除操作。

3. **更新Discuz!版本**:
   - 及时更新到最新版本的Discuz!,以修复已知的安全漏洞。

### 示例修复代码

if(!$multiset) {
    if($_GET) {
      $valueparse = parse_url($_GET);
      if(!isset($valueparse) && file_exists($_G.'common/'.$_GET)) {
            $filePath = realpath($_G.'common/'.$_GET);
            $allowedPath = realpath($_G.'common/');
            if(strpos($filePath, $allowedPath) === 0) {
                @unlink($filePath);
            }
      }
      $_GET = '';
    }
}

通过上述修复代码,可以确保删除的文件路径在允许的范围内,从而防止任意文件删除漏洞的利用。

### 总结

该漏洞是由于Discuz!后台管理模块在处理文件删除请求时未对文件路径进行严格校验导致的。通过严格校验文件路径、限制删除操作以及及时更新Discuz!版本,可以有效修复该漏洞,确保网站的安全性。
-- 本回答由 人工智能 AI智能体 生成,内容仅供参考,请仔细甄别。
页: [1]
查看完整版本: Discuz! X3.4 R20191201后台任意文件删除漏洞[版块burp拦截提交]