SVN是Subversion的简称,是一个开放源代码的版本控制系统,相较于RCS、CVS,它采用了分支管理系统,它的设计目标就是取代CVS。互联网上不少版本控制服务已从CVS迁移到Subversion。git
不少网站都使用了svn版本控制系统,可是不少网站安全意识不足,致使svn残留,所以咱们可使用这个工具来下载网站源码。sql
一旦网站出现SVN漏洞,其危害远比SQL注入等其它常见网站漏洞更为致命,由于黑客获取到网站源代码后,一方面是掠夺了网站的技术知识资产,另外一方面,黑客还可经过源代码分析其它安全漏洞,从而对网站服务器及用户数据形成持续威胁。数据库
更严重的问题在于,SVN产生的.svn目录下还包含了以.svn-base结尾的源代码文件副本(低版本SVN具体路径为text-base目录,高版本SVN为pristine目录),若是服务器没有对此类后缀作解析,黑客则能够直接得到文件源代码。apache
使用svn checkout后,项目目录下会生成隐藏的.svn文件夹(Linux上用ls命令看不到,要用ls -al命令)。tomcat
svn1.6及之前版本会在项目的每一个文件夹下都生成一个.svn文件夹,里面包含了全部文件的备份,文件名为 .svn/text-base/文件名.svn-base 安全
svn1.7及之后版本则只在项目根目录生成一个.svn文件夹,里面的pristine文件夹里包含了整个项目的全部文件备份服务器
下面我以svn1.7及以后版本为例,讲解如何利用此漏洞下载整个网站源代码多线程
咱们看到的是一个名为 wc.db 的文件,用文本编辑器打开看到第一行有写 SQLite format 3 ,能够知道,这是一个SQLite数据库的文件,后面包含的信息,文本编辑器就先不看了。咱们下载一个正经的SQLite查看软件来慢慢看--SQLite Studio 。编辑器
在软件下载完以前,再看看此文件夹里的其余内容:svn
entries和format文件里面,只有个数字12,没什么参考意义;wc.db-journal文件是空的,也没什么价值;tmp目录里面也是空的;
pristine里面内容就多了,一堆00~ff的文件夹,每一个文件夹里有若干个 .svn-base文件;用文本编辑器打开看一下,有些文件是代码,有些文件是乱码(大概是图片文件吧)。看来这个文件夹是整个项目文件的一份备份,只是一堆哈希过的文件名,彷佛有点难下手啊。
毕竟是无规律的这一堆文件名,40位的哈希(36^40)这样的暴力穷举下载的话,即使是N多线程,时间成本上也是很是大的啊。并且获得是一堆无序文件,要整理成原来代码项目的样子,还得费好一阵功夫。
这样看来,是否是说.svn漏洞利用的价值不多?然而非也,少年,还记得刚才说的 wc.db 文件吗。如今SQLite Studio软件应该下载好了,咱们就打开看看这里有什么来头吧
用SQLiteStudio软件打开 wc.db文件,咱们看到 NODES 表,看到 local relpath栏 和 checksum栏,明白了吗(滑稽.jpg)。checksum栏里的$sha1$后面的那串数字就是pristine文件夹里的那堆文件的文件名,pristine里的00~ff文件夹,实际上是文件名的前两位,而local relpath就是原始的文件名。
如今,咱们根据这个 wc.db 的NODES表,遍历这个表里的每一行,就能够下载到整个项目里的代码了,并且还能获得对应的真实文件名,可谓岂不快哉?
(下面截图为我本身的项目,仅做参考)
除了NODES表之外,还能够看到一个 REPOSITORY表,里面存储了svn的项目路径和 uuid,若是没有作访问IP限制的话,你能够直接使用此信息取得此项目的SVN权限(下载、提交等)…
方案1、不要使用svn checkout和svn up更新服务器上的代码,使用svn export(导出)功能代替。
方案2、服务器软件(Nginx、apache、tomcat、IIS等)设置目录权限,禁止访问.svn目录
不仅svn,git或者其余版本管理软件也存在相似的问题