CVE-2021-32682 elFinder RCE 简单分析
字数 1488 2025-08-29 08:30:36
elFinder RCE漏洞分析(CVE-2021-32682)教学文档
1. 漏洞概述
1.1 基本信息
- 漏洞编号: CVE-2021-32682
- 影响组件: elFinder (开源Web文件管理器)
- 漏洞类型: 远程命令执行(RCE)
- 影响版本: elFinder <= 2.1.58
- 漏洞原因: 创建ZIP存档时对
name参数过滤不严导致命令注入
1.2 组件介绍
elFinder是一个使用jQuery UI和JavaScript编写的开源Web文件管理器,设计灵感来源于Mac OS X的Finder程序,提供简单便捷的文件管理功能。
2. 漏洞原理分析
2.1 漏洞触发点
漏洞存在于创建新ZIP存档功能中,攻击者可以控制name参数,该参数最终被传递到prox_open中执行,导致命令注入。
2.2 漏洞利用条件
- 需要有创建ZIP存档的权限
- 能够控制ZIP存档的文件名参数
2.3 技术细节
- 用户提供的
name参数通过archive函数处理 - 经过正则转换和字符串替换后传入
uniqueName函数 - 最终传递到
remoteArchive函数 - 虽然使用了
escapeshellarg()进行转义,但攻击者可以利用ZIP命令的-TT选项注入命令
3. 漏洞复现
3.1 环境搭建
- 下载受影响版本(<=2.1.58):
https://github.com/Studio-42/elFinder - 重命名配置文件:
mv /php/connector.minimal.php-dist /php/connector.minimal.php - 通过浏览器访问:
/elfinder.src.html
3.2 漏洞验证
构造恶意请求,利用ZIP命令的-TT选项执行任意命令:
POST请求示例:
name=-TmTT="$(id>out.txt)foooo"
3.3 攻击原理
- 正常命令构造:
zip -r9 -q 'a1.zip' './a.zip' - 恶意构造后:
zip -r9 -q '-TmTT="$(id>out.txt)foooo".zip' './a.txt' - 利用
-TT选项指定测试命令,执行id并将结果输出到out.txt
4. 代码分析
4.1 关键函数调用链
connector.minimal.php→ 包含autoload.phpelFinderVolumeLocalFileSystem.class.php中的archive函数elFinder.class.php中的处理流程:- 检查
name参数是否存在 - 进行正则转换和字符串替换
- 调用
uniqueName函数处理 - 传递到
remoteArchive函数 - 最终在
makeArchive中构造命令
- 检查
4.2 关键代码片段
// elFinder.class.php中对name参数的处理
if (isset($_POST['name'])) {
$name = $_POST['name'];
// 正则转换和字符串替换
// ...
$name = $this->uniqueName($dstDir, $name, '-');
$this->remoteArchive($args, $name);
}
// makeArchive函数中的命令构造
$cmd = 'zip -r9 -q '.escapeshellarg($name).' '.escapeshellarg($dir);
$this->procExec($cmd);
5. 修复方案
5.1 官方修复
官方在后续版本中修复了此漏洞,主要措施包括:
- 对
name参数进行更严格的过滤 - 限制特殊字符的使用
5.2 临时缓解措施
- 升级到最新版本
- 禁用ZIP存档功能
- 实施严格的输入验证
6. 参考链接
- 官方修复提交: https://github.com/Studio-42/elFinder/commit/a106c350b7dfe666a81d6b576816db9fe0899b17
- SonarSource分析: https://blog.sonarsource.com/elfinder-case-study-of-web-file-manager-vulnerabilities
- Exploit代码: https://packetstormsecurity.com/files/164173/elfinder_archive_cmd_injection.rb.txt
7. 总结
该漏洞展示了Web文件管理器中常见的命令注入风险,特别是在调用系统命令处理用户可控参数时。开发人员应当:
- 对所有用户输入进行严格验证
- 避免直接将用户输入拼接到系统命令中
- 使用安全的API替代系统命令调用
- 实施最小权限原则,限制Web应用的系统权限