实战中web源码泄露的总结与利用
Web 源代码泄露通常源于服务器配置不当或开发人员安全意识不足,导致包含源代码或敏感信息的隐藏文件或目录被外部访问。攻击者常通过自动化工具或其他方式对网站进行敏感路径扫描,一旦发现可公开访问的版本控制目录或系统元数据文件,便可能直接下载整个项目源码,进而挖掘硬编码的密钥、数据库凭证、内部接口等敏感信息。
典型场景包括:
- .git 目录泄露
- .DS_Store 文件泄露
- .svn 目录泄露
1. Git 源码泄露
1.1. 什么是 Git?
Git 是一个分布式版本控制系统,用来管理代码的修改历史。开发人员用 Git 来:跟踪代码变更、多人协作开发、回滚代码、创建分支等。
当你运行 git init 时,Git 会在项目目录下创建一个隐藏文件夹:.git。

这个 .git 目录包含了所有与版本控制有关的数据

|
文件 / 目录 |
说明 |
|
.git/config |
Git 配置信息 |
|
.git/HEAD |
当前所在分支指针 |
|
.git/objects/ |
存储代码的所有历史版本 |
|
.git/logs/ |
Git 提交历史记录 |
|
.git/index |
暂存区索引信息 |
1.2. 什么是 Git 源码泄露?
简单说:服务器部署时把 .git 目录也上传上去了,然后被攻击者访问到了。
攻击者一旦发现 .git泄露,可能会做:
- 使用 Git 工具还原完整源码
(比如 git-dumper 工具); -
找到硬编码的密码、密钥、Token、数据库信息等; -
阅读源代码逻辑,寻找漏洞(如 SQL 注入、命令注入等); -
利用 Git 历史记录还原被删除的信息; -
找到内部接口、调试页面、测试逻辑等隐藏攻击面。
1.3. git 命令
1.3.1. git log
git log 是 Git 中用于查看代码历史提交记录(commit 历史)。Git 不是每次保存完整代码副本,而是仅记录变更部分。所以 git show ID 显示的也是变更部分的代码内容.
比如当我们下载了.git 目录后,进入该目录执行 git log。如下内容是该 Git 仓库的提交历史记录,包括了每次提交的:提交哈希(commit ID)、提交作者、提交时间、提交说明

git show 用于查看某个提交的详细信息,即这次提交改动了什么东西。
git show <commitID>
其中有一条提交的变更记录的说明是“Inlcuded custom environmental variables”。我们重点看一下这条记录。发现这条记录新增了一个 .env 文件,其中包含了 AWS 密钥和靶场 flag。

1.3.2. git stash
git stash 是 Git 用于临时保存未提交更改(工作区和暂存区)的功能,方便你切换分支或执行其他操作时不丢失当前进度。它不会出现在 git log 中,但可通过 git stash list 和 git stash show -p 查看。
假设你在开发一个 Python 项目 app.py,你临时测试时写入了敏感信息:
# app.pyAPI_KEY = "CTF{super-secret-flag}"
你还没打算提交这段代码,于是你运行:
git stash
这会将未提交的修改(带有敏感信息)存入 stash,代码恢复成之前版本。
某天,这个项目被上传到 Web 服务器(包括 .git 目录),你用 git-dumper 下载 .git 内容并还原代码库,结果你发现 git log 没看到任何包含 flag 的提交。但你灵机一动,试试:
git stash list# stash@{0}: WIP on master: 临时调试APIgit stash show -p stash@{0}# diff --git a/app.py b/app.py# + API_KEY = "CTF{super-secret-flag}"
找到了隐藏的 flag,而开发者本以为自己“没提交”就很安全,其实 stash 也被泄露了!
git stash 暂存了未提交的敏感修改,即使开发者没提交,但如果 .git 目录泄露,stash 里的内容依然可以被恢复并查看。
1.4. git-dumper 工具
工具地址:https://github.com/arthaud/git-dumper
如何利用 Git 泄露还原源码?并通过 git log 寻找敏感信息?如下发现 git 源码泄露

还原完整源码
git_dumper.py http://192.168.67.165:1230/.git 保存的目录名git_dumper.py http://192.168.67.165:1230/.git k8s

然后可以分析源码,由于还原了.git 目录,还可以通过 git log 和 git show 查看历史提交记录和提交的内容。
1.5. GitHack 工具-推荐
工具:https://github.com/lijiejie/GitHack
GitHack.py http://www.xx.com/.git/

1.6. CTFHub git 泄露
- Log 关
git-dumper 还原源码,git log 和 git show 查看 flag

- Stash
git log 和 git show 未找到 flag。通过使用 git stash list

stash@{0}: xx 表示当前有一个 stash 暂存了尚未提交的改动,基于 07fa828 这个提交。然后通过git stash show -p stash@{0} 查看 stash 中的具体改动。这表示你 stash 之前,该文件的内容是:where is flag。而你 stash 的修改内容把它改成了:ctfhubxx
- Index
flag 就在还原的源码里

2. SVN 源码泄露
SVN(Subversion) 是一种集中式版本控制系统,广泛用于源代码管理,主要由 .svn/ 目录维护版本信息。开发者本地每个被版本控制的目录下都会存在一个 .svn 文件夹,它包含了:
-
当前文件的版本信息 -
文件历史版本(可能包含敏感内容) -
元数据和目录结构
当网站部署时,开发者忘记删除 .svn 目录,攻击者可通过访问该目录下的某些文件来恢复源码或敏感信息。早期版本可通过 .svn/entries 恢复路径,.svn/text-base/ 下载源码,新版本则利用 .svn/wc.db 恢复内容
2.1. svnExploit
以为 ctfhub svn 泄露为例,扫描到了 svn 源码泄露

漏洞利用工具:https://github.com/admintony/svnExploit
SvnExploit.py -u https://xx.com/.svn --dump

只获取了两个文件,svnexploit这个工具只能获取当前版本的源代码,而题目提示说 Flag 在服务端旧版本的源代码中。所有我们要得到旧版本的源码。所以使用 dvcs-ripper 工具中的 rip-svn.pl 脚本进行下载。
2.2. dvcs-ripper
地址:https://github.com/kost/dvcs-ripper
apt-get updateapt-get install perl libio-socket-ssl-perl libdbd-sqlite3-perl libclass-dbi-perl libio-all-lwp-perl./rip-svn.pl -v -u http://xx/.svn

还原的源码如下

flag 存在于

3. HG 泄露
HG 泄露指的是 Mercurial(简写为 hg)版本控制系统的源码泄露问题,类似于 Git、SVN 泄露,是 Web 安全中的一种常见信息泄露漏洞。
Mercurial 是一个 分布式版本控制系统,命令行工具名是 hg。类似 Git,但在一些早期项目(如 Mozilla)中被广泛使用。项目源代码、提交记录、历史版本都保存在 .hg 目录中。
如果开发者将网站源码上传到服务器时 连同 .hg 目录一并上传,但又没有限制 Web 访问权限。攻击者可以通过特定路径访问并恢复项目源码。
以 ctfhub HG 泄露为例:

然后使用 dvcs-ripper 工具中的 rip-svn.pl 脚本进行下载
./rip-hg.pl -v -u http://xx/.hg


flag

4. .DS_Store 文件泄露
.DS_Store 全称 Desktop Services Store,是 macOS 系统生成的隐藏文件。它主要记录当前目录的元数据,例如:
-
文件和子目录的名字 -
文件图标的位置 -
Finder 视图设置(排序方式、显示样式等)
注意:.DS_Store 文件并不包含文件的实际内容(比如源码、图片、文本数据),它只保存目录结构和文件排列等信息。
泄露风险
一旦 .DS_Store 文件被下载并解析:✅ 攻击者可以看到目录下有哪些文件、子目录的名字✅ 可以结合路径爆破或直接访问暴露出的文件❗ 如果暴露的文件可被下载,可能进一步导致敏感数据或源码泄露
工具:ds_store_exp
地址:https://github.com/lijiejie/ds_store_exp
以 ctfhub .DS_Store 泄露为例,使用工具解析远程 .DS_Store 文件,列出目录结构,发现目录中存在一个名为 e2f6xx.txt 的文件
ds_store_exp.py http://xx/.DS_Store
通过 url 去访问这个文件得到了 flag

|
对比项 |
|
SVN 泄露 |
|
文件来源 |
macOS 系统生成的目录元数据文件 |
SVN 版本控制系统生成的元数据文件和目录(如 |
|
记录内容 |
目录中文件、子目录的名字、显示布局、图标位置等 |
项目代码版本记录、文件名、文件历史、完整文件数据索引等 |
|
泄露风险 |
泄露文件和目录结构(路径信息),可帮助枚举敏感文件路径 |
泄露完整源码 |
|
可能拿到什么 |
文件路径、目录结构,间接访问文件获取 flag 或敏感信息 |
完整源码、配置文件、敏感信息(账号、密码、API 密钥等) |
|
文件是否含文件内容 |
❌ 不含文件实际内容,只是目录元数据 |
✅ 可能含文件实际内容(从 SVN 元数据还原出来) |
.DS_Store 泄露本质是:通过泄露目录结构 + 文件路径,间接访问敏感文件。
遇到 .DS_Store 泄露时,应结合目录扫描和文件下载一起验证风险。
5. bak 文件
.bak 是 backup(备份) 的缩写,通常表示某个文件的备份版本,用于防止修改、升级或删除操作造成数据丢失。.bak 文件既可能是人工习惯性的命名,也可能是编辑器、工具、脚本的自动行为 —— 都有可能因疏忽泄露敏感信息。
6. vim 缓存
https://www.ctfhub.com/#/skilltree
7. 网站备份压缩文件泄漏
一般网站管理员在日常维护中,总会把网站源码给备份一下,防止网站出现问题时,能马上的恢复使用,不过一般的管理员安全意识不高,在备份的时候,会使用一些常见的压缩备份名,而且不光使用常见的备份名字,大部分的管理还会把备份好的源码直接放在网站根目录里,这样给一些不法之徒,提供了一个很方便的渗透思路,或者有些直接不需要渗透了,因为备份中的数据,就已经满足那些不法之徒的需求了。
常见的备份文件后缀:
-
.rar -
.zip -
.7z -
.tar.gz -
.bak -
.txt -
.old -
.temp
一般使用web目录扫描工具如dirsearcy、御剑就能扫描出来
8. SWP 文件泄露
swp即swap文件,在编辑文件时产生的临时文件,它是隐藏文件,如果程序正常退出,临时文件自动删除,如果意外退出就会保留,文件名为 .filename.swp。
漏洞利用
直接访问.swp文件,下载回来后删掉末尾的.swp,获得源码文件。
9. WEB-INF/web.xml 泄露
WEB-INF是Java的WEB应用的安全目录,如果想在页面中直接访问其中的文件,必须通过web.xml文件对要访问的文件进行相应映射才能访问。
WEB-INF 主要包含以下文件或目录:
WEB-INF/web.xml : Web应用程序配置文件, 描述了servlet和其他的应用组件配置及命名规则.WEB-INF/database.properties : 数据库配置文件WEB-INF/classes/ : 一般用来存放Java类文件(.class)WEB-INF/lib/ : 用来存放打包好的库(.jar)WEB-INF/src/ : 用来放源代码(.asp和.php等)
漏洞利用
通过找到 web.xml 文件,推断 class 文件的路径,最后下载 class 文件,再通过反编译 class 文件,得到网站源码。
10. GitHub源码泄漏
GitHub是一个面向开源及私有软件项目的托管平台,数以百计的大侠,高手,圣手,教主,小白,宗主,等等级别人物的汇集之地,而平台的服务设施,很人性化,而且用户体验度高,所以用的人很多,而且很人也都喜欢把自己的代码上传到平台,反正是很方便。
有些安全意识不高的程序员大意的把自己的项目源码上传到 GitHub ,一些不法分子在收集信息中,通过关键词进行搜索,可以找到关于目标站点的信息,有些信息直接泄露了网站源码,管理员账号密码,数据库信息等。
11. 源码泄露综合利用工具
https://github.com/0xHJK/dumpall
# 下载文件(源代码)dumpall -u <url> [-o <outdir>]# 示例dumpall -u http://example.com/.git/dumpall -u http://example.com/.svn/dumpall -u http://example.com/.DS_Storedumpall -u http://example.com/
夜雨聆风
