SVN 文件、SVN 泄露与 SVNHack 简介
1. SVN 文件
SVN(Subversion)是一种版本控制系统,用于团队协作管理代码 / 文件的修改历史,其核心文件是支撑版本控制功能的关键数据,主要包括:
.svn
目录:是 SVN 本地仓库的核心目录,隐藏在项目根目录下,存储所有版本相关信息。- 关键子文件:
wc.db
:数据库文件,记录文件的版本号、路径、修改时间等元数据。entries
:文本文件,存储项目内文件 / 文件夹的列表及基础版本信息。pristine
目录:存放文件的 "纯净版本"(.svn-base
后缀文件),即各版本文件的原始内容,是泄露后恢复源码的核心。
2. SVN 泄露
指网站部署时,开发人员误将项目中的.svn
目录(本地版本控制文件)一并上传到服务器,导致攻击者可通过 URL 直接访问.svn
下的文件,进而恢复网站源码、配置信息甚至敏感数据(如 CTF 中的 flag)的漏洞。
本质 :服务器未过滤.svn
隐藏目录,暴露了本应仅存于本地的版本控制数据,属于 "配置失误型漏洞",常见于 CTF 的 Web 方向题目或真实环境的低安全配置网站。
3.vcs-ripper
vcs-ripper
是一款用于利用分布式版本控制系统(DVCS)泄露信息的开源工具,在信息安全领域尤其是 CTF(夺旗竞赛)中被广泛使用,以下是对它的简单介绍:
基本信息
使用语法
dvcs-ripper
工具的核心是针对不同版本控制系统的 Perl 脚本(如 rip-svn.pl
、rip-git.pl
等),语法格式统一且简单,基本结构如下
- 编写语言:主要使用 Perl 语言编写,这使得它在大多数类 UNIX 系统(如 Kali Linux、Ubuntu 等)上都能方便运行,只要系统中安装了 Perl 解释器。
- 开源仓库 :可以在 GitHub 上找到其开源代码仓库(地址:https://github.com/kost/dvcs-ripper ),开发者和安全研究人员可以查看代码、提交问题报告或贡献代码来改进工具。
bash
perl 脚本名称 -u 目标URL [选项]
常用参数说明:
核心参数
perl 脚本名称
:指定要使用的工具脚本(如rip-svn.pl
处理 SVN 泄露,rip-git.pl
处理 Git 泄露)。-u 目标URL
:必选参数,指定存在版本控制泄露的目标路径(如 SVN 的.svn
目录、Git 的.git
目录)。
常用选项
-o 输出目录
:指定提取的文件保存路径(如-o ./output
表示保存到当前目录的output
文件夹)。-v
:显示详细执行过程(调试时常用,可看到工具下载了哪些文件)。
其他版本控制系统(如 Git)用法相同,只需替换脚本名称(如 rip-git.pl
)和目标 URL(如 http://example.com/.git/
)即可。
示例(以 SVN 泄露为例):
bash
# 基础用法:提取目标 .svn 目录内容,默认保存到当前目录
perl rip-svn.pl -u http://example.com/.svn/
# 带输出目录和详细信息:提取内容并保存到 ./svn_data,显示执行过程
perl rip-svn.pl -v -u http://example.com/.svn/ -o ./svn_data
支持的版本控制系统及功能
- SVN(Subversion) :通过
rip-svn.pl
脚本对 SVN 泄露进行利用。当网站的.svn
目录意外暴露时,该脚本可以下载.svn
目录中的关键文件(如entries
、wc.db
等),并尝试恢复项目的源码,包括各个版本的文件内容,帮助获取可能存在于旧版本代码中的敏感信息,如 CTF 比赛中的 flag。 - Git :利用
rip-git.pl
脚本处理 Git 泄露。如果网站的.git
目录泄露,它能够解析.git
目录中的对象文件、引用等,恢复出完整的 Git 仓库,包括代码的提交历史、分支信息等,有助于发现开发者在开发过程中可能遗留的敏感信息或配置文件。 - CVS(Concurrent Versions System) :
rip-cvs.pl
脚本针对 CVS 版本控制系统的泄露情况,从泄露的 CVS 相关文件和目录中提取项目的版本信息和源代码。 - Bazaar(Bzr) :通过
rip-bzr.pl
脚本处理 Bazaar 版本控制系统的泄露,恢复 Bzr 仓库中的数据。 - Mercurial(Hg) :
rip-hg.pl
脚本用于处理 Mercurial 版本控制系统的泄露,解析.hg
目录中的数据,还原项目的版本历史和代码。
实战
题目来源
ctfHub技能树:CTFHub
先看题目

先用dirsearch搜索一下,dirsearch的用法在另一篇博客里面御剑/dirsearch工具使用--bugku 备份是个好习惯/网站源码-CSDN博客

观察到状态码为200的存在.svn/entries
这里打开kali虚拟机进行操作
首先点击使用文档并选择在文档处打开终端
我们需要先下载一些东西
bash
sudo apt-get install perl libio-socket-ssl-perl libdbd-sqlite3-perl libclass-dbi-perl libio-all-lwp-perl
这条命令用于在 Debian/Ubuntu/Kali 等基于 APT 包管理的 Linux 系统中,安装dvcs-ripper
工具运行所需的依赖包,各部分含义如下:
sudo
:以管理员权限执行后续命令(安装软件需要管理员权限)。apt-get install
:APT 包管理工具的安装命令,用于从软件源下载并安装指定包。- 后续的包是
dvcs-ripper
依赖的 Perl 模块和工具:perl
:Perl 语言解释器(dvcs-ripper
基于 Perl 编写,必须安装)。libio-socket-ssl-perl
:支持 SSL/TLS 加密的网络通信模块(处理 HTTPS 目标时需要)。libdbd-sqlite3-perl
:SQLite 数据库驱动模块(解析版本控制中的数据库文件,如 SVN 的wc.db
)。libclass-dbi-perl
:数据库抽象层模块(简化数据库操作)。libio-all-lwp-perl
:增强的 IO 操作模块(支持通过 HTTP 协议下载文件)。
执行这条命令后,系统会自动下载并安装这些依赖,确保dvcs-ripper
能正常运行(尤其是处理 HTTPS 目标或解析数据库文件时不会因缺少模块而报错)。
接下来进行操作
bash
./rip-svn.pl -u http://challenge-517b9b2a719ed58a.sandbox.ctfhub.com:10800/.svn
这个具体的语法以及在上述讲过,这里不过多说
结果如下

工具以及完成了恢复,接下来我们查看有那些文件
bash
ls -al

我们打开我们想要的.svn文件,并查看有那些目录

根据网页页面提示,我们了解道flag最有肯位于pristine(原始内容)中,原因见上文SVN文件分析处

这里我们查看所有文件

SVN 会把版本控制的文件拆分成 pristine
目录下的哈希文件夹 (如 40
、bf
),每个文件夹里存的是 .svn-base
后缀的原始文件(相当于版本库中的 "纯净" 文件内容)。
这些文件夹的命名是 文件内容的哈希值 (SVN 用于快速定位和存储版本文件),所以没有固定规律,必须逐个检查。
我们先检查40

发现有一个.svn-base后缀的文件
在 Linux 系统中,cat
是一个非常基础且常用的命令,全称是 "concatenate"(连接、串联 ),主要作用是用于查看文件内容、拼接文件内容输出 ,我们使用cat取读取我们找到的这个文件。

得到我们最终的结果解题结束。