Vulnhub官方复现教程
https://vulhub.org/#/environments/gitlist/0.6.0-rce/
漏洞原理
在用户对仓库中代码进行搜索的时候,gitlist将调用git grep
命令:
public function searchTree($query, $branch)
{
if (empty($query)) {
return null;
}
$query = escapeshellarg($query);
try {
$results = $this->getClient()->run($this, "grep -i --line-number {$query} $branch");
} catch (\RuntimeException $e) {
return false;
}
其中,$query
是搜索的关键字,$branch
是搜索的分支。
如果用户输入的$query
的值是--open-files-in-pager=id;
,将可以执行id
命令:
导致这个漏洞的原因,有几点:
- 开发者对于
escapeshellarg
函数的误解,造成参数注入 git grep
的参数--open-files-in-pager
的值,将被直接执行
理论上,在经过$query = escapeshellarg($query);
处理后,$query
将变成一个由单引号包裹的字符串。但不出漏洞的前提是,这个字符串应该出现在“参数值”的位置,而不是出现在参数选项&