Note
Subversion(SVN)是一个开源的版本控制系统(VCS),用于管理文件和目录以及对它们所做的更改。它允许用户恢复旧版本的数据或检查数据如何随时间变化的历史记录。
漏洞产生原因:
管理员操作不规范,在发布代码时未使用导出功能,而是直接复制代码文件夹到 WEB 服务器上,导致.svn被暴露于外网环境。
.svn目录下还包含了以.svn-base结尾的源代码文件副本(低版本路径为 text-base,高版本路径为 pristine 目录),若服务器没有对此类后缀做解析或者访问限制,攻击者可以直接获得网站源码。
1. .svn 目录结构
- entries:包含了当前工作副本的元数据,包括文件的目录列表和版本号。
- format:该文件包含了.svn 目录的版本号。它用于确保.svn 目录的兼容性和正确性。
- wc.db:SQLite 数据库文件,存储工作副本的元数据,包括文件状态,锁定信息等。
- wc. db-journal:数据库事务日志文件。它的作用是记录对工作副本(working copy)数据库 wc.db 的更改操作,以确保这些更改能够被安全地应用到数据库中。
- pristine 目录:存储了所有未修改的文件副本,用于快速回复文件到未修改状态。
- tmp 目录:存储临时文件,例如在执行 SVN 操作期间产生的临时数据或文件。
- prop-base 目录:存储了每个文件的基本属性信息。在提交文件时,这些属性信息会与服务器上的版本进行比较,以确定是否需要更新属性。
- props 目录:存储了每个文件的本地属性信息。这些属性信息包括了用户自定义的属性以及 SVN 内部使用的属性。
- text-base 目录:存储了工作副本中每个文件的基本文本内容。与 pristine 目录中的文件相比,这些文件包含了本地修改后的文本内容。
2. svn 泄露漏洞利用
主要利用内容为:wc.db,此数据库文件包含了多个表。
常见表如下:
NODES:每个文件和目录的基本信息,如路径、节点类型(文件或目录)、状态(添加、修改、删除等)、版本号等。PRISTINE:每个文件的未修改的原始文件内容。ACTUAL_NODE:每个文件和目录的本地状态,包括属性、锁定状态等。
常见列内容如下:
local_relpath:文件或目录的相对路径。op_depth:操作深度,用于记录修改的深度级别。repos_id:与版本库相关联的唯一标识符。presence:文件或目录的存在状态(例如,normal表示正常存在,absent表示已删除)。kind:节点类型,如文件(file)或目录(dir)。revision:文件或目录的版本号。checksum:文件内容的校验和,用于比较文件的变化。可以配合.svn/pristine目录获取到文件内容。
GitHub - 0xHJK/dumpall: 一款信息泄漏利用工具,适用于.git/.svn/.DS_Store泄漏和目录列出
GitHub - admintony/svnExploit: SvnExploit支持SVN源代码泄露全版本Dump源码
3. 漏洞修复和预防
- 删除
.svn文件夹。 - 禁止使用
svn checkout或svn up更新服务器的源码内容,应使用svn export功能。 - 更新访问控制权限,严谨访问
.svn相关路径。