渗透测试-SVN信息泄露漏洞分析

漏洞简介

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

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

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

漏洞危害

一旦网站出现SVN漏洞,其危害远比SQL注入等其它常见网站漏洞更为致命,因为黑客获取到网站源代码后,一方面是掠夺了网站的技术知识资产,另一方面,黑客还可通过源代码分析其它安全漏洞,从而对网站服务器及用户数据造成持续威胁(git同理)。

SVN目录

在这里插入图片描述
此图来自其他博客,分析下各个文件:

  1. entries 和 format 文件里面,只有个数字12,没什么参考意义;
  2. wc.db-journal 和 tmp 文件都是空的,也没什么价值;
  3. pristine 文件夹里有若干个 .svn-base 文件,看来这个文件夹是整个项目文件的一份备份,只是一堆哈希过的文件名,似乎有点难下手啊;
  4. wc.db文件:用SQLiteStudio软件打开 wc.db文件,可以看到 NODES 表,历这个表里的每一行,就可以下载到整个项目里的代码了,而且还能得到对应的真实文件名。
    在这里插入图片描述

另外补充一下SVN不同版本的一下差异:

1、在 svn1.6 及以前版本会在项目的每个文件夹下都生成一个.svn文件夹,里面包含了所有文件的备份,文件名为 .svn/text-base/文件名.svn-base ;

2、在 svn1.7 及以后版本则只在项目根目录生成一个.svn文件夹,里面的pristine文件夹里包含了整个项目的所有文件备份。

漏洞复现

下面利用墨者学院现成的靶场环境进行演示:

在这里插入图片描述
访问靶场环境如下:

在这里插入图片描述

漏洞检测

1、最简单的检测方法是直接在网站路径后面 + /.svn/entries,存在漏洞会显示数字“12”,如下图所示:

在这里插入图片描述
2、实际工作过程中,可以使用 dirsearch 进行路径扫描:

在这里插入图片描述
3、下载并分析 wc.db 文件:

在这里插入图片描述
用 SQLiteStudio 软件打开 wc.db文件,我们看到 NODES 表,遍历这个表里的每一行,就可以下载到整个项目里的代码了,而且还能得到对应的真实文件名:

在这里插入图片描述
除了NODES表以外,还可以看到一个 REPOSITORY表,里面存储了svn的项目路径和 uuid,如果没有做访问IP限制的话,你可以直接使用此信息取得此项目的SVN权限(下载、提交等)…

在这里插入图片描述

脚本检测

Github脚本下载:svnExploit

在这里插入图片描述
1、检测是否存在漏洞 python SvnExploit.py -u http://xxxxxx.com/.svn

在这里插入图片描述

2、下载网站源码:python SvnExploit.py -u http://xxxxxx.com/.svn --dump

在这里插入图片描述
3、此时可以在脚本文件的目录下找到网站源码文件:

在这里插入图片描述

漏洞修复

1、不要使用svn checkout和svn up更新服务器上的代码,使用svn export(导出)功能代替;

2、服务器软件(Nginx、apache、tomcat、IIS等)设置目录权限,禁止访问.svn目录;

3、删除 /.svn 文件夹,注意,不只svn,git 或者其他版本管理软件也存在类似的问题。